##前言 在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 文件内容如下:
1import requests 2 3base_url = "http://api.nnzhp.cn" 4def get_cookie(username="test1010", passwd="aA123456"): 5 url = base_url + "/api/user/login" 6 headers = { 7 "Content-Type":"application/x-www-form-urlencoded", 8 "User-Agent": "Fiddler" 9 } 10 body = { 11 "username": username, 12 "passwd": passwd 13 } 14 res = requests.post(url, headers=headers, data=body) 15 try: 16 sign = res.json()["login_info"]["sign"] 17 except: 18 sign = "" 19 cookie = "{}={}".format(username, sign) 20 return cookie 21 22if __name__ == '__main__': 23 cookie = get_cookie() 24 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格式用例如下:
1- config: 2 name: debugtalk test 3 request: 4 base_url: http://api.nnzhp.cn 5 6- test: 7 name: add gold 8 request: 9 url: api/user/gold_add 10 method: POST 11 headers: 12 Content-Type: application/x-www-form-urlencoded 13 User-Agent: Fiddler 14 Cookie: ${get_cookie()} 15 data: 16 stu_id: 2114 17 gold: 500 18 validate: 19 - eq: [status_code, 200] 20 - eq: [content.error_code, 0] 21 - eq: [content.msg, "操作成功!"]
接下来便可以运行用例了,得到后的报告如下:
