目录
调用 hook 函数
测试用例层面(testcase)-3.1.11不支持
测试步骤层面(teststep)
编写hook函数
请求request预处理
返回 response 处理
HttpRunner 从 1.4.5 版本开始实现了全新的 hook 机制,可以在请求前和请求后调用钩子函数。
调用 hook 函数
hook 机制分为两个层级:
- 测试用例层面(testcase)
- 测试步骤层面(teststep)
测试用例层面(testcase)-3.1.11不支持
在 YAML/JSON 测试用例的 config 中新增关键字 setup_hooks 和 teardown_hooks。
- setup_hooks: 在整个用例开始执行前触发 hook 函数,主要用于准备工作。
- teardown_hooks: 在整个用例结束执行后触发 hook 函数,主要用于测试后的清理工作。
- config:
name: basic test with httpbin
base_url: http://127.0.0.1:3458/
setup_hooks:
- ${hook_print(setup)}
teardown_hooks:
- ${hook_print(teardown)}
这里看3.1.11源码,发现config中的setup_hooks和teardown_hooks被注释掉了,所以不起作用。
测试步骤层面(teststep)
在 YAML/JSON 测试步骤的 test 中新增关键字 setup_hooks 和 teardown_hooks。
- setup_hooks: 在 HTTP 请求发送前执行 hook 函数,主要用于准备工作;也可以实现对请求的 request 内容进行预处理。
- teardown_hooks: 在 HTTP 请求发送后执行 hook 函数,主要用于测试后的清理工作;也可以实现对响应的 response 进行修改,例如进行加解密等处理。
config:
name: "登录成功"
variables:
password: tester
expect_foo2: config_bar2
base_url: "https://api.pity.fun"
verify: False
export:
- token
parameters:
username-password: ${get_account()}
# setup_hooks:
# - ${testcase_set_up(setup)}
# teardown_hooks:
# - ${testcase_tear_down(teardown)}
teststeps:
-
name: 登录成功
variables:
foo1: bar1
setup_hooks:
- ${teststep_set_up()}
teardown_hooks:
- ${teststep_tear_down()}
request:
method: POST
url: /auth/login
headers:
Content-Type: "application/json"
json:
{"username":"$username","password":"$password"}
extract:
token: body.data.token
validate:
- eq: ["status_code", 200]
- eq: [body.code,0]
- eq: [body.msg,"登录成功"]
编写hook函数
hook 函数的定义放置在项目的 debugtalk.py 中,在 YAML/JSON 中调用 hook 函数仍然是采用 ${func($a, $b)} 的形式。
对于测试用例层面的 hook 函数,与 YAML/JSON 中自定义的函数完全相同,可通过自定义参数传参的形式来实现灵活应用。
def teststep_set_up():
logging.info("开始执行测试步骤")
print("开始")
def teststep_tear_down():
logging.info("测试步骤执行结束")
print("结束")
对于单个测试用例层面的 hook 函数,除了可传入自定义参数外,还可以传入与当前测试用例相关的信息,包括请求的 $request 和响应的 $response,用于实现更复杂场景的灵活应用。
请求request预处理
针对请求request 发出去的参数预处理,也可以用到 setup_hooks
,需传一个内置 request
参数
在测试步骤层面的 setup_hooks 函数中,除了可传入自定义参数外,还可以传入 $request,该参数对应着当前测试步骤 request 的全部内容。因为 request 是可变参数类型(dict),因此该函数参数为引用传递,当我们需要对请求参数进行预处理时尤其有用。
示例:
def get_request(request):
"""输出请求body"""
print("请求body:",request.get("req_json"))
返回 response 处理
在测试步骤层面的 teardown_hooks 函数中,除了可传入自定义参数外,还可以传入 $response,该参数对应着当前请求的响应实例(requests.Response)。
示例:
def get_reponse(response):
print("返回response status_code:", response.status_code)
config:
name: "登录成功"
variables:
password: tester
expect_foo2: config_bar2
base_url: "https://api.pity.fun"
verify: False
export:
- token
parameters:
username-password: ${get_account()}
# setup_hooks:
# - ${testcase_set_up(setup)}
# teardown_hooks:
# - ${testcase_tear_down(teardown)}
teststeps:
-
name: 登录成功
variables:
foo1: bar1
setup_hooks:
- ${get_request($request)}
teardown_hooks:
- ${get_reponse($response)}
request:
method: POST
url: /auth/login
headers:
Content-Type: "application/json"
json:
{"username":"$username","password":"$password"}
extract:
token: body.data.token
validate:
- eq: ["status_code", 200]
- eq: [body.code,0]
- eq: [body.msg,"登录成功"]