一、HTTPRunner项目准备1.1 安装

在cmd中输入命令pip install httprunner==2.3.0
输入hrun -V打印出版本就是安装成功了。

1.2 新建项目

在想要新建项目的文件夹中打开cmd,输入hrun --startproject 项目名称即可在当前目录下创建项目。

1.3 HttpRunnser 2.x工程目录结构

 api目录
a.主要存放接口的最小执行单元(正向用例)

reports目录
用于存放测试报告

testcases目录
用于处理接口的复杂执行逻辑
实现接口与接口之间的依赖

testsuites目录
用于添加多条测试用例,批量执行
处理数据驱动测试(参数化)

env文件
用于定义全局环境变量
可以在整个项目的测试脚本中调用

debugtalk.py文件
用于处理动态参数
也可以处理参数化动态数据

1.4 YAML配置文件的格式要求

yaml是数据格式,不是数据类型,yaml配置文件的后缀为.yaml或者.yml
yaml配置文件中使用#进行注释,不可以在yaml数据行内进行注释
yaml为key: value,key往往与冒号之间不加空格,value与冒号之间必须得加空格
yaml配置文件中,同一区域的key不能重复
yaml中value的数据类型,如果value中含有字母,会识别为字符串类型(false、true、on、off、null除外),可以无需添加引号
可以使用成对的单引号或者双引号来指定字符串类型
如果value为数字,会指定识别为int或float类型
yaml是一个强缩进的数据格式,同级键值对缩进必须一致,默认缩进2格
如果使用- 代表为数组结构(列表)

二、登录接口测试用例设计2.1 基础的测试用例结构

/api/login_api.yml

# 指定当前用例的名称name: "登录接口-正向用例"# 指定接口的请求信息request:    # 指定当前用例的url    url: 'http://127.0.0.1:8000/user/login/'    # 指定当前接口的请求方式    method: POST    # 指定请求头参数    headers:        Content-Type: "application/json"    # 指定json请求参数    json:        username: 'aaron123'        password: '123456'# 指定断言信息validate:    # 方式一:    # - 断言方式: ["实际值", 期望值]    - eq: ["status_code", 200]    # 方式二(不常用):    # 完整定义    # - {"check": "实际值", "comparator": "断言方式", "expect": 期望值}    # - {"check": "status_code", "comparator": "le", "expect": 201}

2.2 运行测试用例2.2.1 使用命令行运行

输入命令hrun 需要运行的用例路径(相对路径和绝对路径均可),即可运行测试用例。

2.2.2 使用py文件运行

from httprunner.api import HttpRunnerobj = HttpRunner(log_level="DEBUG")obj.run(r'E:\httprunner_dev06\testsuites\login_testsuite.yml')res = obj.summary

2.3 修改输出的日志级别

输入命令hrun 需要运行的用例路径 --log-level 指定的等级即可修改输出的日志级别。

2.4 参数设置2.4.1 支持的合法的请求方式method

 GET、POST、PUT、PATCH、DELETE,忽略大小写,推荐使用大写。

2.4.2 支持的请求头Content-Type

application/json,请求参数需要为json
application/x-www-form-urlencoded,请求参数需要为data

2.4.3 支持的请求参数类型

json,指定json请求参数
data,指定x-www-form-urlencoded参数
params,指定查询字符串参数

2.4.4 支持的断言方式

eq、equals、==、is,相等断言
lt、less_than,小于
le、less_than_or_equals,小于等于
gt、greater_than,大于
ge、greater_than_or_equals,大于等于
contains,包含

2.4.5 支持的断言方式实际值

status_code,提取响应状态码
cookies,提取cookies信息
headers,提取请求头信息
content、 text、json,提取响应数据,如果接口返回的是json数据,那么这三个获取均类似于Python中字典或者嵌套字典的列表。取值用json.key来取值
ok,当前的请求是否成功
url,提取请求url信息

三、参数化处理3.1 base_url

我们可以把url前面公共的地方提取为base_url,简化url的写法。

# 如果有设置base_url会指定拼接一个完整的url路径base_url: 'http://127.0.0.1:8000'request:# url: 'http://127.0.0.1:8000/user/login/'    url: '/user/login/'

3.2 设置参数

在variables中设置变量的值,调用时使用$变量名即可。

注意

  1. 定义变量之后,可以在定义变量下方的任意地方调用
  2. 一般在当前yaml配置文件中才能调用
variables:    # 变量key: 变量的值    uname: 'aaron123'    passwd: '123456'    status: 200...    json:        username: $uname        passwd: $passwdvalidate:    - eq: ["status_code", $status]

3.3 env变量

在项目根路径下的.env文件中也可以定义变量,使用key=value的方式去定义。
在.env文件中定义的变量,可以在任意yaml配置文件中调用

USERNAME=aaron123PASSWORD=123456

在api/demo_api.yml文件中调用。使用${ENV(变量名)}调用。

    json:        username: ${ENV(USERNAME)}        password: ${ENV(PASSWORD)}

3.4 debugtalk函数

我们如果想要给某个变量添加动态的值,可以在项目根路径下的debugtalk.py文件中定义函数。

debugtalk.py文件中的函数可以在任意yaml配置文件中调用。

def random_generate_user_agent():    user_agent_list = ["Mozilla/5.0 Aaron", "Mozilla/5.0 Aaron1", "Mozilla/5.0 Aaron2",                       "Mozilla/5.0 Aaron3"]    return random.choice(user_agent_list)

然后在需要的地方调用函数,实现动态数据。
调用方式为${方法名()}

        User-Agent: "${random_generate_user_agent()}"

此时,User-Agent的值就会随机从user_agent_list中取出。

3.5 用例依赖

如果当前有一个用例需要先登录才能正确请求,那么我们就需要在testcases/demo_testcase.yml文件中添加用例依赖关系。

# 定义全局配置信息# a.定义teststeps中公共信息config:    name: "测试获取项目列表数据接口"# 定义每个测试步骤teststeps:-    name: "先登录"    # 导入需要执行的用例的yml路径    api: "api/login_api.yml"    # 用于提取参数并创建变量(可多个),创建的变量可以在下方任意处调用    extract:        # 把content响应体内的token值取出来,赋给变量token        - token: content.token-    name: "获取项目列表数据"    api: api/projects_api.yml

在api/projects_api.yml文件中,引用前面定义的token变量。

    headers:        Authorization: "JWT $token"

3.6 variables优先级顺序:

testcase config variables > teststep extract > teststep variables > api variables

建议只在一个地方使用variables,不然项目混乱,不便管理。

3.7 数据驱动

如果想要批量执行用例,需要将逻辑写在testsuite文件中。

3.7.1 方式一

testsuites/login_testsuite.yml

# 定义所有用例的公共信息config:    name: "某某套件"testcases:-    name: "测试登录接口"    testcase: "testcases/login_testcase.yml"        # 定义数据驱动测试(参数化),此处定义的参数变量优先级最高    parameters:        # - 参数1-参数2-参数3-...:        - title-username-password-status_code-msg:              # 这里的值与上面的参数一一对应              - ["正常登录", "aaron123", "123456", 200, "token"]              - ["密码错误", "aaron123", "123457", 400, "non_field_errors"]              - ["账号错误", "aaron188", "123456", 400, "non_field_errors"]              - ["用户名为空", "", "123456", 400, "username"]              - ["密码为空", "aaron123", "", 400, "password"]#        - title-username-password-status_code-msg: ${P(data/data.csv)}        - title-username-password-status_code-msg: ${get_accounts()}

修改对应的testcase和api文件,使用$变量名对parameters中的参数一一替换,即可实现数据驱动。

3.7.2 方式二

将测试用例写在csv文件中。
第一行需要和parameters中定义的字段和顺序一致。

data/data.csv

title,username,password,status_code,msg正常登录,aaron123,123456,200,token密码错误,aaron123,123457,400,non_field_errors账号错误,aaron188,123456,400,non_field_errors用户名为空,,123456,400,username密码为空,aaron123,,400,password

修改testsuite文件的parameters。

    parameters:        - title-username-password-status_code-msg: ${P(data/data.csv)}

但是这种方法有一个弊端,所有csv文件中读出的数据都是字符串格式,我们一般不这样调用,可以使用程序读出csv,然后再进行参数化处理。

3.7.2 方式三

在debugtalk.py文件中定义一个返回参数列表的函数(可以从Excel中读取,也可以从csv读取,也可以从数据库读取)。
参数顺序无所谓,但是key值需要和parameters中定义的字段一致。

def get_accounts():    accounts = [        {"title": "正常登录", "username": "aaron123", "password": "123456",            "status_code": 200, "msg": "token"},        {"title": "密码错误", "username": "aaron123", "password": "123457",            "status_code": 400, "msg": "non_field_errors"},        {"title": "账号错误", "username": "aaron188", "password": "123456",            "status_code": 400, "msg": "non_field_errors"},        {"title": "用户名为空", "username": "", "password": "123456",            "status_code": 400, "msg": "username"},        {"title": "密码为空", "username": "aaron123", "password": "",            "status_code": 400, "msg": "password"},    ]    return accounts

修改testsuite文件的parameters。

    parameters:        - title-username-password-status_code-msg: ${get_accounts()}

————————————————
版权声明:本文为CSDN博主「测开小菜鸟」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33537936/article/details/114270906