接口自动化测试中,难免会出现前置条件和后置条件的处理问题,unittest框架中使用最多的是setUp() 、tearDown() ;pytest中使用最多的是在夹层 conftest.py 文件中定义函数加 @pytest.fixture() 装饰器来处理;而httprunner中使用的是hook机制来处理前置后置。
在 .py文件的测试步骤的 teststeps 中新增关键字 setup_hook 和 teardown_hook:
import pytest from httprunner import (HttpRunner, Config, Step, RunRequest, Parameters) class TestCaseLogin(HttpRunner): @pytest.mark.parametrize('param', Parameters({"device_type": [1]})) def test_start(self, param): super().test_start(param) config = ( Config("login") .base_url("${ENV(HOSTURL)}") .variables( **{"username": "${ENV(USERNAME)}", "password": "${ENV(PASSWORD)}", "company_id": "${ENV(COMPANYID)}" } ) .verify(False) ) teststeps = [ Step( RunRequest('login') .with_variables(**{'token_length': 32, 'status_code': 201, 'status': 1}) .setup_hook('${setup_hooks_request($request)}') .post('/client/user/auth') .with_headers(**{"Content-Type": "application/json"}) .with_json({"scenario": "client", "company_id": '$company_id', "user_name": "$username", "password": "$password", "device_type": "$device_type", "device": ""}) .teardown_hook('${teardown_assert_response($response)}') .extract() .with_jmespath("body.data.token", "token") .validate() .assert_equal('status_code', '$status_code', '断言失败') .assert_equal('body.status', '$status', '断言失败') .assert_length_equal('body.data.token', '$token_length', '断言失败') ) ] if __name__ == '__main__': TestCaseLogin().test_start()
- setup_hook :是在请求发出前运行,主要用于处理接口的前置的准备工作,也可以对请求参数修改校验等
- teardown_hook:是在请求发出后运行,主要用于处理接口后置的清理工作,也可以对返回值进行修改、字段校验等
在 debugtalk.py文件中定义hook函数,hook函数其实也就是普通函数,只要符合函数编写规范即可:
def setup_hooks_request(request): user_agent = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.54'} header = {'Content-Type': 'application/json', 'User-Agent': user_agent} if 'headers' in request: if bool(request['headers']) is True: request['headers'].update(user_agent) else: request['headers'].update(header) else: request['headers'] = header print('前置条件执行完成') def teardown_assert_response(response): if response.status_code == 200 or 201: if response.body['status'] == 1: print('接口访问成功') else: print('接口请求失败') print('后置条件执行完成')
- 定义的 setup_hooks_request 前置条件是处理接口头信息是否加了 User-Agent 参数
- 定义的 teardown_assert_response 后置条件是处理返回的http状态码及接口成功与否的状态码status
- httprunner为了应用更复杂的场景,定义的hook函数中的位置参数可以和用例的请求参数、响应值作关联;我们只需要把 request、response 放在定义好的hook函数位置参数上即可;当然定义的hook函数的位置参数,你也可以自定义其名称,但还是推荐规范操作。
用例中引用时要遵循规则,前置调用 setup_hook('${setup_hooks_request($request)}');后置调用 teardown_hook('${teardown_assert_response($response)}'),实际还是我们自己定义的hook函数放在httprunner库中内置的hook函数中执行
- $request 、$response 就是我们传入定义的hook函数中位置参数的值,这两个是固定的,修改成其他的是会报错的
teststeps = [ Step( RunRequest('login') .with_variables(**{'token_length': 32, 'status_code': 201, 'status': 1}) .setup_hook('${setup_hooks_request($request)}') .post('/client/user/auth') .with_headers(**{"Content-Type": "application/json"}) .with_json({"scenario": "client", "company_id": '$company_id', "user_name": "$username", "password": "$password", "device_type": "$device_type", "device": ""}) .teardown_hook('${teardown_assert_response($response)}') .extract() .with_jmespath("body.data.token", "token") .validate() .assert_equal('status_code', '$status_code', '断言失败') .assert_equal('body.status', '$status', '断言失败') .assert_length_equal('body.data.token', '$token_length', '断言失败') ) ]
运行 hrun testcase_student_login_test.py -s 命令,控制台看下部分运行结果:
F:\TESTING\apiWebStudent\demo\testcases>hrun testcase_student_login_test.py -s ================================================================================= test session starts ================================================================================= collected 1 item testcase_student_login_test.py 2021-03-26 18:53:34.028 | INFO | httprunner.runner:test_start:451 - Start to run testcase: login, TestCase ID: de9cc10c-9cde-474e-a86c-2c167d42dafb 2021-03-26 18:53:34.030 | INFO | httprunner.runner:__run_step:292 - run step begin: login >>>>>> 2021-03-26 18:53:34.031 | INFO | httprunner.runner:__call_hooks:112 - call hook actions: setup request 2021-03-26 18:53:34.033 | DEBUG | httprunner.runner:__call_hooks:121 - call hook function: ${setup_hooks_request($request)} 前置条件执行完成 2021-03-26 18:53:34.177 | DEBUG | httprunner.client:request:186 - client IP: 10.10.12.173, Port: 49977 2021-03-26 18:53:34.179 | DEBUG | httprunner.client:request:194 - server IP: 112.17.250.185, Port: 443 2021-03-26 18:53:34.184 | INFO | httprunner.client:request:218 - status_code: 201, response_time(ms): 143.01 ms, response_length: 0 bytes 2021-03-26 18:53:34.185 | INFO | httprunner.runner:__call_hooks:112 - call hook actions: teardown request 2021-03-26 18:53:34.186 | DEBUG | httprunner.runner:__call_hooks:121 - call hook function: ${teardown_assert_response($response)} 接口访问成功 后置条件执行完成 2021-03-26 18:53:34.188 | INFO | httprunner.response:extract:176 - extract mapping: {'token': 'f200bbc22c2036957ff13fb62f382b24'} 2021-03-26 18:53:34.189 | INFO | httprunner.response:validate:246 - assert status_code equal 201(int) ==> pass 2021-03-26 18:53:34.190 | INFO | httprunner.response:validate:246 - assert body.status equal 1(int) ==> pass 2021-03-26 18:53:34.191 | INFO | httprunner.response:validate:246 - assert body.data.token length_equal 32(int) ==> pass 2021-03-26 18:53:34.192 | INFO | httprunner.runner:__run_step:304 - run step end: login <<<<<< 2021-03-26 18:53:34.193 | INFO | httprunner.runner:test_start:460 - generate testcase log: F:\TESTING\apiWebStudent\demo\logs\de9cc10c-9cde-474e-a86c-2c167d42dafb.run.log . ================================================================================== 1 passed in 0.29s ================================================================================== Sentry is attempting to send 0 pending error messages Waiting up to 2 seconds Press Ctrl-Break to quit
以上总结或许能帮助到你,或许帮助不到你,但还是希望能帮助到你,如有疑问、歧义,评论区留言会及时修正发布,谢谢!
未完,待续…
一直都在努力,希望您也是!
转载请附带原文链接 ( https://www.cnblogs.com/lifeng0402/articles/14583475.html ),否则追究法律责任,谢谢!