一、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中设置变量的值,调用时使用$变量名
即可。
注意:
- 定义变量之后,可以在定义变量下方的任意地方调用
- 一般在当前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