httprunner 2.x的基本使用(一)

news2024/11/23 1:24:49

上一章:

下一章:

httprunner 2.x的基本使用(二)_做测试的喵酱的博客-CSDN博客

一、参考地址:

使用说明_httprunner2.0 概述及使用说明

二、介绍

HttpRunner是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。

三、安装

# 安装稳定版本

pip install httprunner==2.5.7

 查看是否安装成功

(venv) zhaohui@zhaohuideMBP miaostudydjango % httprunner -V
2.5.7

四、创建项目

hrun --startproject apitset

或者

httprunner --startproject apitest

五、虚拟环境配置

Pycharm创建虚拟环境_做测试的喵酱的博客-CSDN博客

 1、创建虚拟环境

2、进入虚拟环境

3、在虚拟环境中,再次安装httprunner

# 安装稳定版本

pip install httprunner==2.5.7

六、执行测试demo

创建完的项目中默认有测试用例,我们可以直接运行测试并生成报告。

hrun api/demo_api.yml --report-dir=reports

注意:

case路径:使用绝对路径与相对路径都可以。相对路径,是相对于跟目录的路径

生成报告的路径: 使用绝对路径与相对路径都可以。相对路径,是相对于跟目录的路径

报告样式:

七、工程结构介绍

 

 说明:
(1)api 文件夹:存储接口定义描述
(2)testcases 文件夹:存储测试用例,文件夹也可以使用其它名称
(3)testsuites 文件夹:测试测试场景,文件夹也可以使用其它名称
(4)reports 文件夹:存储 html 测试报告
(5).env文件:存储项目环境变量,通常用于存储项目敏感信息
(6)debugtalk.py:存储项目中逻辑运算辅助函数
·该文件存在时,将作为项目根目录定位标记,其所在目录即被视为项目工程根目录
·该文件不存在时,运行测试的所在路径(CWD)将被视为项目工程根目录
·测试例文件中的相对路径(例如.csv)均需基于项目工程根目录
·运行测试后,测试报告文件夹(reports)会生成在项目工程根目录

八、编写yaml case

8.1 yaml语法

yaml语法_yaml在线语法_做测试的喵酱的博客-CSDN博客

case使用yaml编写的,所以学习yanl语法很重要

1、yaml是数据格式,不是数据类型(结构)
 2、yaml配置文件的后缀为.yml或者.yaml
 3、yaml中使用#作为注释,注释只能在某一行的前后,不能与key\value在同一行
 4、yaml中有两种结构,一种是key: value,value与冒号之间必须有空格
   另一种是 - key: value,“-”为列表结构
 5、yaml文件中嵌套的同一级条目前缩进必须一致(一般缩进2个空格)
 6、yaml中如果value使用引号(单引号或者双引号),那么该value为字符串类型
 7、如果value中只要有字母,哪怕没有添加引号,一般也会识别为字符串类型(false、true、on、off、null除外)
 8、value为false、true、on、off,是布尔类型,null为空
 9、value中为纯数字或者小数,会被识别为int或float类型 

8.2 编写case

yaml case格式,与python requests的传参一摸一样。

 api/baidu_api.yml

name: 百度接口
variables:
    var1: value1
    var2: value2
request:
    url: https://ug.baidu.com/mcp/pc/pcsearch
    method: POST
    headers:
        Content-Type: "application/json"
    json:
        invoke_info: {"pos_1":[{}],"pos_2":[{}],"pos_3":[{}]}
validate:
    - eq: ["status_code", 200]

 执行case:

hrun api/baidu_api.yml --report-dir=reports

8.3 请求体 格式json或者form或者查询字符串参数

请求体为json参数:

    headers:
        Accept: "application/json"
    json:
        size: 3
        page: 2

请求体为form表单参数:

    headers:
        Content-Type: "application/x-www-form-urlencoded"

    data:
        username: "root"
        password: "123456"

请求体为查询字符串参数(get请求):

    params:
        size: 3
        page: 2

8.4 断言

8.4.1 断言类型

断言类型可太多 了,我们这里放源码。

def get_uniform_comparator(comparator):
    """ convert comparator alias to uniform name
    """
    if comparator in ["eq", "equals", "==", "is"]:
        return "equals"
    elif comparator in ["lt", "less_than"]:
        return "less_than"
    elif comparator in ["le", "less_than_or_equals"]:
        return "less_than_or_equals"
    elif comparator in ["gt", "greater_than"]:
        return "greater_than"
    elif comparator in ["ge", "greater_than_or_equals"]:
        return "greater_than_or_equals"
    elif comparator in ["ne", "not_equals"]:
        return "not_equals"
    elif comparator in ["str_eq", "string_equals"]:
        return "string_equals"
    elif comparator in ["len_eq", "length_equals", "count_eq"]:
        return "length_equals"
    elif comparator in ["len_gt", "count_gt", "length_greater_than", "count_greater_than"]:
        return "length_greater_than"
    elif comparator in ["len_ge", "count_ge", "length_greater_than_or_equals",
                        "count_greater_than_or_equals"]:
        return "length_greater_than_or_equals"
    elif comparator in ["len_lt", "count_lt", "length_less_than", "count_less_than"]:
        return "length_less_than"
    elif comparator in ["len_le", "count_le", "length_less_than_or_equals",
                        "count_less_than_or_equals"]:
        return "length_less_than_or_equals"
    else:
        return comparator

eq 是相等断言。

validate:
    - eq: ["status_code", 200]

contains:实际值是否包含期望值 

contains_by:期望值是否包含实际值。

注意:这里的包含,指的是返回值字典中的key,不是value。

其他断言类型,看上面的源码。  

8.4.2 断言--实际值

validate:
    - eq: ["status_code", 200]

方括号中,第一个参数为 实际值,第二个参数为期望值。

响应状态码:status_code

响应体数据:

  • content
  • text
  • json 

当返回值为json数据时,可以使用content、text、json 任意一个。获取的值都为字典格式。

获取返回值字典中的某一个key的值。直接用.

比如:获取返回值字典中的username的值。json.username

validate:
    - eq: ["json.username", "张三"]

 返回值value为列表时,用下标取值,如返回值为

{"username":["张三","李四","王武"]}

实际值,提取张三

json.username.0 

8.5 设置请求host 

在yaml文件中,设置base_url 的值,在request模块下,的url 只设置uri就可以了。

如:

base_url: "http:127.0.0.1:8000"
request:
    url: "/user/login/"

九、局部变量&环境变量(全局变量)

9.1 局部变量

设置局部变量,只在当前yml文件中生效。

1、在variables 下,以key:value的形式定义变量

2、引用变量,使用$变量名进行调用

举例:


variables:
    my_name: "zhangsan"
    my_password: "123456"

request:
    url: "/user/login/"
    method: POST
    data:
        username: "$my_name"
        password: "$my_password"

9.2 环境变量(全局变量)

环境变量(全局变量)在所有yml文件中都生效。

1、在项目的跟路径下的.env文件中,设置环境变量

定义: 环境变量名=环境变量值

注意:等号两边不需要有空格

2、引用变量

使用${ENV(环境变量名)}

3、举例,设置全局host

a、在项目的跟路径下的.env文件中,设置环境变量BASE_URL

BASE_URL=http://127.0.0.1:8000

b、在yml文件中,引用环境变量

base_url: "${ENV(BASE_URL)}"
request:
    url: "/user/login/"
    method: POST

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/631074.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

location.href 和 document.URL 与 document.documentURI

location.href 和 document.URL 与 document.documentURI 相同点 获取到的值相同 不同点 location.hrefurl可以赋值, 效果类似location.assign(url) , 可以后退 document.URL 与 document.documentURI 是只读的, 赋值无效 location.href locationwindow.location true lo…

从源码角度看Linux线程是怎么创建出来的

这篇文章来学习一下线程的创建过程。 线程不是一个完全由内核实现的机制,它是由内核态和用户态合作完成的。 用户态创建线程 pthread_create 不是一个系统调用,是 glibc 库的一个函数,位于 nptl/pthread_create.c 中: int __pth…

redis商户查询缓存

1 什么是缓存? 前言:什么是缓存? 就像自行车,越野车的避震器。 举个例子:越野车,山地自行车,都拥有"避震器",防止车体加速后因惯性,在酷似"U"字母的地形上飞跃,硬着陆导致的损害,像个弹簧一样; 同样,实际开发中,系统也需要"避震器",防止过…

Unity Shader - 兰伯特漫反射

兰伯特漫反射公式: 漫反射(Diffuse) 光源颜色 * max(0,cos(光方向和法线的夹角)) 公式原理: 从上面图片可以看出光照方向 L 与物体法相 N形成的 余弦值越大,反…

力扣笔记(每日随机一题)—— 打折购买糖果的最小开销

问题(简单) 一家商店正在打折销售糖果。每购买 两个 糖果,商店会 免费 送一个糖果。 免费送的糖果唯一的限制是:它的价格需要小于等于购买的两个糖果价格的 较小值 。 比方说,总共有 4 4 4 个糖果,价格…

开源代码分享(3)—微电网鲁棒定价策略(附matlab代码)

1背景介绍 1.1摘要 本论文聚焦于微电网中的能量失衡管理问题,并从电力市场的角度进行研究。与传统电力网不同,微电网可从可再生能源(RES)如太阳能电池板或风力涡轮机等获得额外能源。然而,来自RES的随机输入给平衡供需…

简述Vue的生命周期以及每个阶段做的事情

03_简述Vue的生命周期以及每个阶段做的事情 思路 给出概念 列举出生命周期各个阶段 阐述整体流程 结合实际 扩展:vue3变化 回答范例 每个vue组件实例被创建后都会经过一系列步骤。比如它需要数据观测、模板编译、挂载实例到dom、以及数据变化的时候更新dom、…

Android系统的启动过程(三):Launcher启动过程

Android系统的启动过程(三):Launcher启动过程 摘要&概述 前两篇文章中我们已经将系统启动的过程推进到了系统服务启动完毕之后,本篇文章就来介绍Android系统启动的最后一步:启动Launcher。 这个Launcher我们可以通俗地理解为桌面&#…

深度相机介绍

一、什么是深度相机 (五)深度相机:结构光、TOF、双目相机 - 知乎 传统的RGB彩色普通相机称为2D相机,只能拍摄相机视角内的物体,没有物体到相机的距离信息,只能凭感觉感知物体的远近,没有明确的数…

V90 PN伺服驱动器转矩控制(750报文)

主要介绍通过标准报文加附加报文 750 实现发送驱动报文的控制字、速度给定、转矩限幅及附加转矩给定的功能,首先就是V90在博途环境下的组态,安装GSD文件,GSD文件下载地址如下: https://download.csdn.net/download/m0_46143730/86542047https://download.csdn.net/downloa…

Qt线程的几种使用方法

目录 引言使用方法重写QThread::run()moveToThreadQRunnable使用QtConcurrent使用 完整代码 引言 多线程不应该是一个复杂而令人生畏的东西,它应该只是程序员的一个工具,不应该是调用者过多记忆相关概念,而应该是被调用方应该尽可能的简化调…

Java网络开发(Tomcat)——登陆和注册功能 的 迭代升级 从Jsp到JavaScript + axios + vue 同步到异步

目录 引出前置工作vueaxiosresp0.vue版本的jsp模板1.导包--Json:pom.xml文件:2.新建一个专门用来处理响应的实体类ResData3.在axios中,所有响应必须是 resp.getWriter().write() 的方式,核心代码如下4.在jsp前端代码中导包&#x…

浅谈一级机电管道设计中的压力与介质温度

管道设计是工程设计中的一个非常重要的部分,管道的设计需要考虑到许多因素,其中就包括管道设计压力分类和介质温度分类。这两个因素是在设计管道时必须非常严格考虑的, 首先是管道设计压力分类。在管道设计中,根据工作要求和要传输…

详解 Ansible 自动化运维,提升工作效率

概要 Ansible 是一个模型驱动的配置管理器,支持多节点发布、远程任务执行。默认使用 SSH 进行远程连接。无需在被管理节点上安装附加软件,可使用各种编程语言进行扩展。 一、Ansible基本架构 上图为ansible的基本架构,从上图可以了解到其由以…

算法刷题-关于链表,你该了解这些!

关于链表,你该了解这些! 什么是链表,链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域…

mybatis-plus分页查询(springboot中实现单表和多表查询)

一、mybatis-plus单表查询 使用mybatis-plus实现单表分页查询 非常方便,主要操作步骤如下: 配置分页查询拦截器进行分页查询 1.首先,打开mybatis-plus官网的插件(插件主体) 或者点击mybatis-plus插件 我是配置在s…

KameAI:探索AI驱动的未来,体验聊天GPT与AI绘画的奇妙世界

人工智能的崛起与发展随着科技的飞速发展,人工智能(AI)已经逐渐成为我们生活中不可或缺的一部分。它的出现不仅改变了我们与世界的互动方式,还为各行各业带来巨大的便利。今天,我们就来聊一聊一个类似ChatGPT的人工智能网站—KameAI&#xff…

Nautilus Chain全球行分享会,上海站圆满举办

在北京时间 6 月 9 日,由 Nautilus Chain 主办的“Layer3 模块化区块链的发展探讨”为主题的全球行活动,在上海顺利举办,本次分享会联合主办方还包 括 Stanford Blockchain Accelerator、Zebec Protocol、Tiger VC DAO、Crypto PHD、Rootz L…

Nginx【反向代理负载均衡动静分离】--上

Nginx【反向代理负载均衡动静分离】–上 先看2 个实际需求,引出Nginx 需求1: 访问不同微服务 示意图 需求2: 轮询访问服务 示意图 解决方案: Nginx 反向代理 负载均衡 动静分离 高可用集群 Nginx 在分布式微服务架构的位置 基本介绍 Nginx 是什么? 能干什…

solr快速上手:配置IK中文分词器(七)

0. 引言 solr作为搜索引擎,常用在我们对于搜索速度有较高要求且大数据量的业务场景,我们之前已经配置过英文分词器,但是针对中文分词不够灵活和实用,要实现真正意义上的中文分词,还需要单独安装中文分词器 solr快速上…