作者的博客:https://debugtalk.com/archives/
v2版本用户手册:https://v2.httprunner.org/
1.搭建虚拟环境:
windows系统,新建一个目录,打开cmd,进入到新建的目录中,执行:python -m venv .
或者之间在cmd执行:python -m venv test_httprunner,会在所在目录新建一个目录
2.激活虚拟环境:
进入Scripts目录,执行:activate
3.在虚拟环境下载任意包
例如:安装httprunner,执行:pip3 install httprunner
注意:返回上一层目录再执行:pip3 install httprunner,最好不要在Scripts目录执行。
如果已经安装过httprunner,升级即可,执行:pip3 install -U HttpRunner。
创建项目:hrun --startproject test_httprunner(2版本的)
httprunner startproject test_hru(3版本的)
4.创建好项目后,在项目里创建har文件夹
把从fiddler到处的har文件通过har2case login.har -2y命令转成yml文件
转json格式的通过har2case login.har 即可
5.运行
hrun 文件所在相对路径 --log-level debug
6.使用收获
.env:存储项目环境变量,通常用于存储项目敏感信息
reports:默认生成测试报告的存储文件夹
api: 存放单独可执行的测试用例,(个人理解api下每一个yml文件就对应每一个接口)
testcases:下的每一个yml文件都是有顺序的,(个人理解这个文件夹下每一个yml文件就是一个事务(专注完成一个流程的接口用例测试))
testsuites:用于数据驱动testcases里的某个yml文件里所有的变量(这里专注于测试接口用例的数据编写)
debugtalk.py(可选):存储项目中逻辑运算辅助函数
YAML/JSON(必须):测试用例文件,存储接口测试相关信息
7.yml文件重复执行
name: 登录
variables:
mobile: 233
password: 344
times: 3 # 使单个yml重复执行3次
request:
# 使用环境变量加url路径的拼接
url: ${ENV(URL)}/api/login
method: POST
data:
mobile: $mobile
password: $password
validate:
- eq: ["status_code", 200]
8.token的获取与传递使用
config:
name: 个人资料与设置
base_url: http://talk.url.com
teststeps:
-
name: 登录
api: api/login.yml
extract:
- token: content.data.token
-
name: 资料
api: api/settings.yml
-------------------华丽的分割线-------------------------------
在资料接口使用时,使用${token}调用键即可
例如:
request:
url: ${ENV(URL)}/api
method: GET
headers:
token: "$token"
params:
id: 127
family_tree_id: 10
tag: ${get_wufu_info($data)} #如果data获取的将上个接口返回的json所有数据,可以利用这种方式将上个接口返回数据传递给当前参数使用
timesteamp: ${times()}
如上所示调用api下的单独可执行的测试用例按顺序进行测试
9.请求传值
接口要求:
images 是 array 图片json 结构如下
{
"content":"内容",
"images":[
{
"original_path":"aaa.jpg", //原图
"thum_path":"bb.jpg" //缩略图
},
{
"original_path":"aaa.jpg",
"thum_path":"bb.jpg"
},
]
}
请求的request参数方式,前面放{}字典
images{}: [{"original_path":"lmlRSHC3Z.png","thum_path":"blurred.png"}]
10 hooks机制
teardown_hooks
测试接口的话,通过网络返回的是bytes类型的字节码,所以需要转换一下
a = b'{"code":200,"data":{"id":106}"}
res= str(a,encoding="utf-8") #转为str类型
id = re.search('"id":(.*?),',res) #使用正则提取id
# <re.Match object; span=(20, 29), match='"id":106,'>,由于search返回的是对象格式的数据
print(id.group(1)) #获取到想要的id
11 返回复杂数据格式
我需要在接口用这样的数据格式去请求
'relationship': '{"sibling": {"ob": [{"name": "n1", "id": 0}], "os": [{"name": "n2", "id": 0}]}}'
在debugtalk函数里拼成这样的格式后
需要在返回这个数据格式时使用json.dumps(要返回的数据格式)
12 接口校验多个返回值
name: 添加成员
variables:
# 定义的是当前yml的全局变量,会被test cases下的yml文件替代token
token: "123"
request:
url: ${ENV(URL)}/api
method: POST
headers:
token: "$token"
data:
family_id: 76
user_ids[]: ${add_family_member()}
timesteamp: ${times()}
validate:
- eq: ["status_code",200]
- contained_by: [content.message,["请求成功","部分好友已有两个家庭群"]]
# 用列表将想包含在结果校验的任意字符写入
13.接口之间传递数据
有个需求是在编辑分类页面接口里使用到获取分类列表接口里的返回数据内容
首先在testcases下的extract传递参数:可用的响应属性status_code, cookies, elapsed, headers, content, text, json, encoding, ok, reason, url.
-
name: 获取分类列表
api: api/admin/get_cat_list.yml
extract:
- data: content.data
-
name: 编辑分类页面
api: api/admin/edit_cat.yml
我只需在编辑分类页面的api接口里
name: 编辑分类页面
variables:
# 定义的是当前yml的全局变量,会被test cases下的yml文件替代token
token: "123"
request:
url: ${ENV(URL)}edit_cat
method: POST
headers:
token: ${admin_login()}
data:
data[]: ${edit_cat($data)} #在这里写上$data,就可以在debugtalk文件里调用上个接口数据做处理
timesteamp: ${times()}