##前言 在HttpRunner中,我们的测试用例都是写在 YAML/JSON 文件中,有时候我们想借助代码来实现某些较复杂的功能,但在 YAML/JSON 中是无法直接写代码来处理的,这个时候,我们可以借助 HttpRunner 中的辅助函数 debugtalk.py 来完成。
HttpRunner使用文档中的说明:
- HttpRunner 的实现方式为,支持热加载的插件机制(debugtalk.py),可以在 YAML/JSON 中调用 Python 函数。
- 具体地做法,我们可以在测试用例文件的同级或其父级目录中创建一个 debugtalk.py 文件,然后在其中定义相关的函数和变量。
本人环境:HttpRunner V1.5.8
##测试场景
在之前的文章 HttpRunner学习3--extract提取数据和引用 中,我们模拟的是一个学生充值金币的接口,这个接口有权限验证,我们需要先通过接口A登录,然后在接口B中进行充值操作。
在这里,我们可以借助辅助函数,在 debugtalk.py 中写python代码实现登录,并返回后续cookie进行身份验证所需要的信息,最后直接在 YAML 用例脚本中进行引用。
##通过Python代码登录获取Cookie
首先,创建一个Python文件,文件名为 debugtalk.py ,我们需要把一个登录函数的代码写到该文件中。在这里,登录函数将直接返回后续充值操作所需要的 cookie ,格式如下:用户名=登录接口返回的sign,debugtalk.py 文件内容如下:
import requests
base_url = "http://api.nnzhp.cn"
def get_cookie(username="test1010", passwd="aA123456"):
url = base_url + "/api/user/login"
headers = {
"Content-Type":"application/x-www-form-urlencoded",
"User-Agent": "Fiddler"
}
body = {
"username": username,
"passwd": passwd
}
res = requests.post(url, headers=headers, data=body)
try:
sign = res.json()["login_info"]["sign"]
except:
sign = ""
cookie = "{}={}".format(username, sign)
return cookie
if __name__ == '__main__':
cookie = get_cookie()
print(cookie)
上面的代码中,如果登录失败时,res.json()["login_info"]["sign"] 会提示错误 "KeyError" ,因此用 try...except 进行了简单的异常处理,当登录失败时,返回一个 "" 空字符串。
##YAML文件中引用Cookie
在 debugtalk.py 中自定义函数返回数据后,我们要怎么去引用返回的数据呢?
先在 debugtalk.py 同一目录下创建 YAML/JSON 测试用例文件,如在YAML 测试用例中,对 debugtalk.py 中自定义的 get_cookie() 函数进行引用,可使用 ${get_cookie()} 。
Cookie: ${get_cookie()}
当然,也可以在引用的时候给函数传参数,如果参数是固定值,则可以这样写 **${get_cookie(test1010, aA123456)}**,如果参数是变量,则是 ${get_cookie($username, $passwd)} 等。
##运行用例
完整的YAML格式用例如下:
- config:
name: debugtalk test
request:
base_url: http://api.nnzhp.cn
- test:
name: add gold
request:
url: api/user/gold_add
method: POST
headers:
Content-Type: application/x-www-form-urlencoded
User-Agent: Fiddler
Cookie: ${get_cookie()}
data:
stu_id: 2114
gold: 500
validate:
- eq: [status_code, 200]
- eq: [content.error_code, 0]
- eq: [content.msg, "操作成功!"]
接下来便可以运行用例了,得到后的报告如下: