httprunner3.x详细教程七(三种方式实现参数化数据驱动)

httprunner3.x详细教程七(三种方式实现参数化数据驱动)

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

httprunner3.x支持三种格式的参数化数据,Parameters的入参说明如下:

  1. """ parse parameters and generate cartesian product. 
  2. Args: 
  3.     parameters (Dict) parameters: parameter name and value mapping 
  4.         parameter value may be in three types: 
  5.             (1) data list, e.g. ["iOS/10.1", "iOS/10.2", "iOS/10.3"] 
  6.             (2) call built-in parameterize function, "${parameterize(account.csv)}" 
  7.             (3) call custom function in debugtalk.py, "${gen_app_version()}" 
  8. Returns: 
  9.     list: cartesian product list 
  10. Examples: 
  11.     >>> parameters = { 
  12.         "user_agent": ["iOS/10.1", "iOS/10.2", "iOS/10.3"], 
  13.         "username-password": "${parameterize(account.csv)}", 
  14.         "app_version": "${gen_app_version()}", 
  15.     } 
  16.     >>> parse_parameters(parameters) 
  17. """  

总结来说,支持三种入参,返回一个列表:

1、列表:["iOS/10.1", "iOS/10.2", "iOS/10.3"]

2、Parameterize类的回调,例如csv:${parameterize(account.csv)}

3、debugtalk.py的回调,${gen_app_version()}

在使用参数化之前,首先要导入pytest包,和httprunner的Parameters这个类

 #!/user/bin/env python  

  1. # -*- coding: utf-8 -*-  
  2.   
  3. """ 
  4. ------------------------------------ 
  5. @Project : interfaceDemo 
  6. @Time    : 2020/8/20 13:47 
  7. @Auth    : chineseluo 
  8. @Email   : 848257135@qq.com 
  9. @File    : demo_baidu_request_test.py 
  10. @IDE     : PyCharm 
  11. ------------------------------------ 
  12. """  
  13. import pytest  
  14. from httprunner import Parameters  
  15. from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase  
  16.   
  17.   
  18. class TestBaiduRequestTestCase(HttpRunner):  
  19.     @pytest.mark.parametrize("param", Parameters(  
  20.         {"username": [111, 222, 333]}  
  21.     ))  
  22.     def test_start(self, param):  
  23.         super().test_start(param)  
  24.   
  25.   
  26.     config = (  
  27.         Config("get user list")  
  28.         .variables(  
  29.             **{  
  30.                 "username": "${get_username()}"  
  31.             }  
  32.         )  
  33.         .base_url("https://www.baidu.com")  
  34.         .verify(False)  
  35.     )  
  36.   
  37.     teststeps = [  
  38.         Step(  
  39.             RunRequest("get info")  
  40.             .get("/")  
  41.             .with_params(**{"username": "$username"})  
  42.             .validate()  
  43.             .assert_equal("status_code", 200)  
  44.         )  
  45.     ]  
  46.   
  47.   
  48. if __name__ == "__main__":  
  49.     TestBaiduRequestTestCase().test_start()  

如果使用过pytest的参数化的小伙伴一定不会陌生,@pytest.mark.parametrize()会先将param作为一个动态参数,传递给param,然后由httprunner在进行参数化,httprunner在pytest的parametrize上封装了一层,增加了csv及debugtalk.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. import pytest  
  15. from httprunner import Parameters  
  16. from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase  
  17.   
  18.   
  19. class TestBaiduRequestTestCase(HttpRunner):  
  20.     @pytest.mark.parametrize("param", Parameters(  
  21.         {"username": [111, 222, 333]}  
  22.     ))  
  23.     def test_start(self, param):  
  24.         super().test_start(param)  
  25.   
  26.   
  27.     config = (  
  28.         Config("get user list")  
  29.         .variables(  
  30.             **{  
  31.                 "username": "${get_username()}"  
  32.             }  
  33.         )  
  34.         .base_url("https://www.baidu.com")  
  35.         .verify(False)  
  36.     )  
  37.   
  38.     teststeps = [  
  39.         Step(  
  40.             RunRequest("get info")  
  41.             .get("/")  
  42.             .with_params(**{"username": "$username"})  
  43.             .validate()  
  44.             .assert_equal("status_code", 200)  
  45.         )  
  46.     ]  
  47.   
  48.   
  49. if __name__ == "__main__":  
  50.     TestBaiduRequestTestCase().test_start()  

结果:

  1. collecting ... collected 3 items  
  2.   
  3. demo_baidu_request_test.py::TestBaiduRequestTestCase::test_start[param0]   
  4. demo_baidu_request_test.py::TestBaiduRequestTestCase::test_start[param1]   
  5. demo_baidu_request_test.py::TestBaiduRequestTestCase::test_start[param2]   

第二种debugtalk.py的回调函数:

在debugtalk.py中定义一个函数,返回列表:

  1. def get_username():  
  2.     return [  
  3.         {"username": "111111"},  
  4.         {"username": "222222"},  
  5.         {"username": "333333"},  
  6.         {"username": "444444"},  
  7.         {"username": "555555"},  
  8.         {"username": "666666"},  
  9.     ]  

在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. import pytest  
  15. from httprunner import Parameters  
  16. from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase  
  17.   
  18.   
  19. class TestBaiduRequestTestCase(HttpRunner):  
  20.     @pytest.mark.parametrize("param", Parameters(  
  21.         {"username": "${get_username()}"}  
  22.     ))  
  23.     def test_start(self, param):  
  24.         super().test_start(param)  
  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.             .with_params(**{"username": "$username"})  
  37.             .validate()  
  38.             .assert_equal("status_code", 200)  
  39.         )  
  40.     ]  
  41.   
  42.   
  43. if __name__ == "__main__":  
  44.     TestBaiduRequestTestCase().test_start()  

结果:

  1. collecting ... collected 6 items  
  2.   
  3. demo_baidu_request_test.py::TestBaiduRequestTestCase::test_start[param0]   
  4. demo_baidu_request_test.py::TestBaiduRequestTestCase::test_start[param1]   
  5. demo_baidu_request_test.py::TestBaiduRequestTestCase::test_start[param2]   
  6. demo_baidu_request_test.py::TestBaiduRequestTestCase::test_start[param3]   
  7. demo_baidu_request_test.py::TestBaiduRequestTestCase::test_start[param4]   
  8. demo_baidu_request_test.py::TestBaiduRequestTestCase::test_start[param5]  

使用csv文件作为参数化输入时注意三点:

1,csv文件中的title要为变量名

2,csv映射的时候,参数名要以“-”分割,name和pwd使用的-进行分割

3,csv的路径要使用相对路径,不支持绝对路径不支持\\符号的路径

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

posted @ 2020-09-21 10:02  成都-阿木木  阅读(2928)  评论(0编辑  收藏  举报