• httprunner3.x详细教程六(httprunner的setup和teardown及hook)


    httprunner3.x详细教程六(httprunner的setup和teardown及hook)

    httprunner的setup和teardown可以在yml或者json文件中定义,按照3.x版本的推荐,建议大家在py文件中进行定义,unittest和pytest都可以定义setup和teardown,那么httprunner如何定义呢,下面我会介绍一下设置setup和teardown的两种方式。

     **欢迎加入测试交流群:自动化测试-夜行者(816489363)进行交流学习QAQ**                                                                                                                                                                                                                                                   --成都-阿木木

    httprunner有两种setup和teardown的定义方式,一个是测试类级别,一个是测试步骤级别的定义。

    测试类级别的setup和teardown

    第一种写法setup和teardown:

    1. #!/user/bin/env python  
    2. # -*- coding: utf-8 -*-  
    3.   
    4. """  
    5. ------------------------------------  
    6. @Project : interfaceDemo  
    7. @Time    : 2020/8/20 13:47  
    8. @Auth    : chineseluo  
    9. @Email   : 848257135@qq.com  
    10. @File    : demo_baidu_request_test.py  
    11. @IDE     : PyCharm  
    12. ------------------------------------  
    13. """  
    14. from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase  
    15.   
    16.   
    17. class TestBaiduRequestTestCase(HttpRunner):  
    18.     def setup(self):  
    19.         print("运行于测试用例之前")  
    20.   
    21.     def teardown(self):  
    22.         print("运行于测试用例之后")  
    23.   
    24.     config = (  
    25.         Config("get user list")  
    26.         .base_url("https://www.baidu.com")  
    27.         .verify(False)  
    28.     )  
    29.   
    30.     teststeps = [  
    31.         Step(  
    32.             RunRequest("get info")  
    33.             .get("/")  
    34.             .validate()  
    35.             .assert_equal("status_code", 200)  
    36.         )  
    37.     ]  
    38.   
    39.   
    40. if __name__ == "__main__":  
    41.     TestBaiduRequestTestCase().test_start()  

    结果为:

    1. Process finished with exit code 0  
    2. 运行于测试用例之前  
    3. PASSED [100%]2020-08-20 13:50:53.306 | INFO     | httprunner.loader:load_dot_env_file:127 - Loading environment variables from D:TestScriptDirhttprunnerinterfaceDemo.env  
    4. .  
    5. .  
    6. .  
    7.  D:TestScriptDirhttprunnerinterfaceDemologsa3872c1b-dedf-4485-bd95-3f31947bfae0.run.log  
    8. 运行于测试用例之后  

    第二种写法setup_class和teardown_class:

    1. #!/user/bin/env python  
    2. # -*- coding: utf-8 -*-  
    3.   
    4. """ 
    5. ------------------------------------ 
    6. @Project : interfaceDemo 
    7. @Time    : 2020/8/20 13:47 
    8. @Auth    : chineseluo 
    9. @Email   : 848257135@qq.com 
    10. @File    : demo_baidu_request_test.py 
    11. @IDE     : PyCharm 
    12. ------------------------------------ 
    13. """  
    14. from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase  
    15.   
    16.   
    17. class TestBaiduRequestTestCase(HttpRunner):  
    18.     @classmethod  
    19.     def setup_class(cls):  
    20.         print("运行于测试用例之前")  
    21.          
    22.     @classmethod  
    23.     def teardown_class(cls):  
    24.         print("运行于测试用例之后")  
    25.   
    26.     config = (  
    27.         Config("get user list")  
    28.         .base_url("https://www.baidu.com")  
    29.         .verify(False)  
    30.     )  
    31.   
    32.     teststeps = [  
    33.         Step(  
    34.             RunRequest("get info")  
    35.             .get("/")  
    36.             .validate()  
    37.             .assert_equal("status_code", 200)  
    38.         )  
    39.     ]  
    40.   
    41.   
    42. if __name__ == "__main__":  
    43.     TestBaiduRequestTestCase().test_start()  

    上面两种写法在unittest和pytest中是不一样的,setup_class是运行于测试类的前面,setup是运行与每个测试方法的前面,在httprunner好像不区分这两个方法。

    测试步骤前后的setup和teardown设置

    我在debugtalk.py中写了两个hook_up和hook_teardown方法

    1. def hook_up():  
    2.     print("前置操作:setup!")  
    3.   
    4.   
    5. def hook_down(response=None):  
    6.     print("后置操作:teardown!")  
    7.     if response:  
    8.         print(response)  
    9.         response.status_code = 300  

    在demo_baidu_request_test.py中调用debugtalk的两个hook方法,使用setup_hook()和teardown_hook()来加载我们自定义的hook:

    1. #!/user/bin/env python  
    2. # -*- coding: utf-8 -*-  
    3.   
    4. """ 
    5. ------------------------------------ 
    6. @Project : interfaceDemo 
    7. @Time    : 2020/8/20 13:47 
    8. @Auth    : chineseluo 
    9. @Email   : 848257135@qq.com 
    10. @File    : demo_baidu_request_test.py 
    11. @IDE     : PyCharm 
    12. ------------------------------------ 
    13. """  
    14. from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase  
    15.   
    16.   
    17. class TestBaiduRequestTestCase(HttpRunner):  
    18.     @classmethod  
    19.     def setup_class(cls):  
    20.         print("运行于测试用例之前")  
    21.     @classmethod  
    22.     def teardown_class(cls):  
    23.         print("运行于测试用例之后")  
    24.   
    25.     config = (  
    26.         Config("get user list")  
    27.         .base_url("https://www.baidu.com")  
    28.         .verify(False)  
    29.     )  
    30.   
    31.     teststeps = [  
    32.         Step(  
    33.             RunRequest("get info")  
    34.             .setup_hook("${hook_up()}")  
    35.             .get("/")  
    36.             .teardown_hook("${hook_down()}")  
    37.             .validate()  
    38.             .assert_equal("status_code", 200)  
    39.         )  
    40.     ]  
    41.   
    42.   
    43. if __name__ == "__main__":  
    44.     TestBaiduRequestTestCase().test_start()  

    运行结果:

    1. Process finished with exit code 0  
    2. 运行于测试用例之前  
    3. PASSED [100%]前置操作:setup!  
    4. 后置操作:teardown!  
    5. 2020-08-20 14:07:08.534 | INFO     | httprunner.runner:test_start:460 - generate testcase log: D:TestScriptDirhttprunnerinterfaceDemologs983886ea-36c1-4677-9966-4929f4006004.run.log  
    6. 运行于测试用例之后  

    既然是hook方法,那么肯定是会集成一些内置的钩子,满足特殊的要求所使用的。

    setup_hooks:在测试步骤前执行,先调用setup_hooks()内的函数。可以传入 $request 参数,可以对请求进行预处理或者修改,修改请求参数

    teardown_hooks:在测试步骤执行后,先调用teardown()内的函数,可以传入$response参数,可以对返回值进行处理

    我先在debugtalk.py中定义两个方法,输出一下后面获取的request和response.

    1. def hook_up(request=None):  
    2.     print("输出request:{}".format(request))  
    3.     print("前置操作:setup!")  
    4.   
    5.   
    6. def hook_down(response=None):  
    7.     print("输出response:{}".format(' '.join(['%s:%s' % item for item in response.__dict__.items()])))  
    8.     print("后置操作:teardown!")  

    然后在demo_baidu_request_test.py文件中调用这两个hook,然后传递参数$request和$response。

    1. #!/user/bin/env python  
    2. # -*- coding: utf-8 -*-  
    3.   
    4. """ 
    5. ------------------------------------ 
    6. @Project : interfaceDemo 
    7. @Time    : 2020/8/20 13:47 
    8. @Auth    : chineseluo 
    9. @Email   : 848257135@qq.com 
    10. @File    : demo_baidu_request_test.py 
    11. @IDE     : PyCharm 
    12. ------------------------------------ 
    13. """  
    14. from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase  
    15.   
    16.   
    17. class TestBaiduRequestTestCase(HttpRunner):  
    18.     @classmethod  
    19.     def setup_class(cls):  
    20.         print("运行于测试用例之前")  
    21.     @classmethod  
    22.     def teardown_class(cls):  
    23.         print("运行于测试用例之后")  
    24.   
    25.     config = (  
    26.         Config("get user list")  
    27.         .base_url("https://www.baidu.com")  
    28.         .verify(False)  
    29.     )  
    30.   
    31.     teststeps = [  
    32.         Step(  
    33.             RunRequest("get info")  
    34.             .setup_hook("${hook_up($request)}")  
    35.             .get("/")  
    36.             .teardown_hook("${hook_down($response)}")  
    37.             .validate()  
    38.             .assert_equal("status_code", 200)  
    39.         )  
    40.     ]  
    41.   
    42.   
    43. if __name__ == "__main__":  
    44.     TestBaiduRequestTestCase().test_start()  

    结果如下:

    1. Process finished with exit code 0  
    2. 运行于测试用例之前  
    3. PASSED [100%]输出request:{'method': 'GET', 'url': '/', 'params': {}, 'headers': {'HRUN-Request-ID': 'HRUN-656566cb-5369-43b1-af19-47ce6ef1c7ba-081374'}, 'req_json': None, 'data': None, 'cookies': {}, 'timeout': 120, 'allow_redirects': True, 'verify': False}  
    4. 前置操作:setup!  
    5. resp_obj:<Response [200]>  
    6. validation_results:{}  
    7. 后置操作:teardown!  

    传入的是一个request和response对象,我们可以对于传入的request和response对象进行操作

    我们可以修改resquest和response传入和返回的值,来完成复杂的业务要求。

    现在debugtalk.py改变了一下:

    1. def hook_up(request=None):  
    2.     print("输出request:{}".format(request))  
    3.     print("前置操作:setup!")  
    4.     if request:  
    5.         request["params"]["username"] = "888888"  
    6.   
    7.   
    8. def hook_down(response=None):  
    9.     print("输出response:{}".format(' '.join(['%s:%s' % item for item in response.__dict__.items()])))  
    10.     print("后置操作:teardown!")  
    11.     if response:  
    12.         response.status_code = 404  

    我修改了传入的setp的密码为“888888”,修改了step返回的状态码为404,看一下我在demo_baidu_request_test.py中的调用

    1. #!/user/bin/env python  
    2. # -*- coding: utf-8 -*-  
    3.   
    4. """ 
    5. ------------------------------------ 
    6. @Project : interfaceDemo 
    7. @Time    : 2020/8/20 13:47 
    8. @Auth    : chineseluo 
    9. @Email   : 848257135@qq.com 
    10. @File    : demo_baidu_request_test.py 
    11. @IDE     : PyCharm 
    12. ------------------------------------ 
    13. """  
    14. from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase  
    15.   
    16.   
    17. class TestBaiduRequestTestCase(HttpRunner):  
    18.     @classmethod  
    19.     def setup_class(cls):  
    20.         print("运行于测试用例之前")  
    21.     @classmethod  
    22.     def teardown_class(cls):  
    23.         print("运行于测试用例之后")  
    24.   
    25.     config = (  
    26.         Config("get user list")  
    27.         .variables(  
    28.             **{  
    29.                 "username": "123456"  
    30.             }  
    31.         )  
    32.         .base_url("https://www.baidu.com")  
    33.         .verify(False)  
    34.     )  
    35.   
    36.     teststeps = [  
    37.         Step(  
    38.             RunRequest("get info")  
    39.             .setup_hook("${hook_up($request)}")  
    40.             .get("/")  
    41.             .with_params(**{"username": "${username}"})  
    42.             .teardown_hook("${hook_down($response)}")  
    43.             .validate()  
    44.             .assert_equal("status_code", 200)  
    45.         )  
    46.     ]  
    47.   
    48.   
    49. if __name__ == "__main__":  
    50.     TestBaiduRequestTestCase().test_start()  

    下面是执行结果:

    1. demo_baidu_request_test.py::TestBaiduRequestTestCase::test_start <- C:UsersluozhongwenAppDataLocalProgramsPythonPython38libsite-packageshttprunner unner.py 运行于测试用例之前  
    2. FAILED [100%]输出request:{'method': 'GET', 'url': '/', 'params': {'username': '123456'}, 'headers': {'HRUN-Request-ID': 'HRUN-bbeea383-94b1-43c4-8092-4f35debfdacc-782331'}, 'req_json': None, 'data': None, 'cookies': {}, 'timeout': 120, 'allow_redirects': True, 'verify': False}  
    3. 前置操作:setup!  
    4. 输出response:resp_obj:<Response [200]>  
    5. validation_results:{}  
    6. 后置操作:teardown  
    7. method   : GET  
    8. url      : https://www.baidu.com/?username=888888  
    9. httprunner.exceptions.ValidationFailure: assert status_code equal 200(int)  ==> fail  
    10. check_item: status_code  
    11. check_value: 404(int)  
    12. assert_method: equal  
    13. expect_value: 200(int)  

    可以看到断言是失败的,我设置的成功断言状态码是200,传入的request中的username开始是123456,被我们截获请求参数后更改为了888888。在实际应用中,我们可以对于传入账号密码等进行加密,或者对于返回值的格式等进行解码操作

  • 相关阅读:
    window C/C++ 简单的IDE编译器
    ubuntu 安装 lamp
    架构设计
    linux 性能分析
    wifi基本原理
    openwrt 编译
    学习笔记day5:inline inline-block block区别
    脱离原来文档流产生浮动框
    meta标签清理缓存
    百度web前端面试2015.10.18
  • 原文地址:https://www.cnblogs.com/chineseluo/p/13703964.html
Copyright © 2020-2023  润新知