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:\TestScriptDir\httprunner\interfaceDemo\.env  
  4. .  
  5. .  
  6. .  
  7.  D:\TestScriptDir\httprunner\interfaceDemo\logs\a3872c1b-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:\TestScriptDir\httprunner\interfaceDemo\logs\983886ea-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('\n'.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('\n'.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:\Users\luozhongwen\AppData\Local\Programs\Python\Python38\lib\site-packages\httprunner\runner.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。在實際應用中,我們可以對於傳入賬號密碼等進行加密,或者對於返回值的格式等進行解碼操作


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM