背景:在了解接口自动化框架的过程中,看到有介绍说HttpRunner是一款不错的开源框架。所以,简单试用了一下。虽然有中文使用手册的帮助,但在结合自己项目接口的使用中还是遇到一些问题。在解决这些问题之后,也对这一框架的使用有了更深的了解。
环境:Python3.6 + HttpRunner1.5.13 + har2case 0.1.10
问题:
1. 录制脚本时,保存成 HAR 格式的文件。
1)使用Fiddler4抓包,并接口的请求和响应结果保存为 .har 格式的文件。选中接口,然后点击 Decode。
2)选择菜单栏中,File-》Export Sessions-》Selected Sessions,选择HTTPArchive v1.1类型。
3)保存文件类型如图所示。
2. 文件格式的转换。
上述步骤中保存的.har文件,需要转换成yaml或json文件。在文件所在目录,使用cmd,执行命令: har2case xx.har xx.json
3. 认识JSON文件。引用中文手册中的例子
[
{
"config": {
"name": "testset description",
"variables": [],
"request": {
"base_url": "",
"headers": {
"User-Agent": "python-requests/2.18.4"
}
}
}
},
{
"test": {
"name": "/api/get-token",
"request": {
"url": "http://127.0.0.1:5000/api/get-token",
"headers": {
"device_sn": "FwgRiO7CNA50DSU",
"user_agent": "iOS/10.3",
"os_platform": "ios",
"app_version": "2.8.6",
"Content-Type": "application/json"
},
"method": "POST",
"json": {"sign": "958a05393efef0ac7c0fb80a7eac45e24fd40c27"}
},
"validate": [
{"eq": ["status_code", 200]},
{"eq": ["headers.Content-Type", "application/json"]},
{"eq": ["content.success", true]},
{"eq": ["content.token", "baNLX1zhFYP11Seb"]}
]
}
}
]
4.响应体中有数组,如何提取值。
1)首先,在validate之前,request之后,添加提取响应体的代码格式如:"extract": [{"变量名": "变量的取值路径"}]。如,"extract": [{"token": "content.token"}]
2)项目中接口返回的层级结构是这样的:响应体-》res-》token(列表)。因此这里,需要这样写:"extract": [{"token": "content.res.token.0"}]
5.全局变量。请求中有一些值是每个接口都要用到的,例如,ip,port,headers。因此可以提取出来作为全局变量,放在"config"中。
{
"config": {
"name": "testset description",
"variables": [],
"request": {
"base_url": "",
"headers": {
"User-Agent": "python-requests/2.18.4"
}
}
}
}
修改如下:
{
"config": {
"name": "testset description",
"variables": [],
"request": {
"base_url": "http://127.0.0.1:5000/api",
"headers": {
"User-Agent": "python-requests/2.18.4", # 注意这里的 ,
"Content-Type": "application/json;charset=UTF-8"
}
}
}
}
去掉用例中的相同部分。变为:"request": { "url": "/get-token"... , headers中的“Content-Type”去掉。
6.关联变量。
1)登录接口返回的token,在后面其他接口中都需要使用。除了在登录接口中提取外,还需要在其他接口中添加。这里token需要放到其他请求的headers中。因此在其他请求的request中添加如下公式:
"request": {
"url": "http://127.0.0.1:5000/api/get-token",
"headers": {
"x-auth-token": "$token" #这里$为引用变量的意思,"token"即在登录接口中extract里定义的变量名
}
2)从前面的请求中提取响应体中的值,作为下一个请求的输入。
a)提取值的部分与前面提取token相同。例如这里需要提取的变量为:"extract":[{"regionIds": "content.res"}]。这里的res是一个列表,在下一个接口中,只需要该列表中的某一个元素。因此,需要格外增加判断。regionIds后面的接口会引用该变量。
b)HttpRunner中,支持“debugtalk.py”这样的热插拔。
i. 在用例,即JSON文件同级目录下,新建 debugtalk.py。
ii. 根据业务逻辑增加代码。如
SECRET_KEY = "DebugTalk"
def get_region_id(args):
for i in range(len(args)):
if "myRegion" == args[i]["regionName"]: # 找到指定的regionName,然后获取其id
regionId = args[i]["id"]
return regionId
c)在下一个请求中使用。这里是在uri中引用的regionId。
"request": {
"url": "/${get_region_id($regionIds)}" #格式:${fun($var)}。fun为.py中的函数名,var为前一接口提取的变量名
"headers": {
"x-auth-token": "$token"
},
参考资料:
http://cn.httprunner.org/quickstart/