• Pytest测试用例参数化


    一、背景

    python语言中request+pytest可以灵活的进行API的自动化测试,在自动化过程中,一个测试用例对应一个测试点,通常一组数据无法完全覆盖测试范围,所以,需要参数化来传递多组数据

    二、单个参数的参数化

    pytest的测试用例参数化使用@pytest.mark.parametrize(argnames, argvalues)装饰器来完成,详细信息如下:

    1 @pytest.mark.parametrize(argnames, argvalues)
    2 # 参数:
    3 # argnames:以逗号分隔的字符串
    4 # argvaluse: 参数值列表,若有多个参数,一组参数以元组形式存在,包含多组参数的所有参数
    5 # 以元组列表形式存在

    实例

     1 # ./test_case/test_func.py
     2 import pytest
     3 
     4 @pytest.mark.parametrize("arg_1", [924, 925])
     5 def test_add_by_func_aaa(arg_1):
     6     print(arg_1)
     7     
     8 # ./run_test.py
     9 import pytest
    10 
    11 if __name__ == '__main__':
    12     pytest.main(['-v','-s'])
    13     
    14 '''
    15 ============================= test session starts =============================
    16 platform win32 -- Python 3.7.0, pytest-5.3.4, py-1.8.1, pluggy-0.13.1 -- D:Python3.7python.exe
    17 cachedir: .pytest_cache
    18 rootdir: D:Python3.7projectpytest, inifile: pytest.ini
    19 plugins: allure-pytest-2.8.9, rerunfailures-8.0
    20 collecting ... collected 2 items
    21 
    22 test_case/test_func.py::test_add_by_func_aaa[924] 924
    23 PASSED
    24 test_case/test_func.py::test_add_by_func_aaa[925] 925
    25 PASSED
    26 
    27 ============================== 2 passed in 0.04s ==============================
    28 [Finished in 1.3s]
    29 '''    
    30     

    三、多个参数的参数化

    较多场景下,接口的请求体参数都不止一个的,所以需要用到多参数的参数化

    实例

     1 # ./test_case/test_func.py
     2 import pytest        
     3 
     4 @pytest.mark.parametrize("arg_1, arg_2", [(924, 'AAAA'), (925, 'BBBB')])
     5 def test_add_by_func_aaa(arg_1,arg_2):
     6     print("arg_1:{}  arg_2:{}".format(arg_1, arg_2))
     7 
     8 # ./run_test.py
     9 import pytest
    10 
    11 if __name__ == '__main__':
    12     pytest.main(['-v','-s'])
    13     
    14 '''
    15 ============================= test session starts =============================
    16 platform win32 -- Python 3.7.0, pytest-5.3.4, py-1.8.1, pluggy-0.13.1 -- D:Python3.7python.exe
    17 cachedir: .pytest_cache
    18 rootdir: D:Python3.7projectpytest, inifile: pytest.ini
    19 plugins: allure-pytest-2.8.9, rerunfailures-8.0
    20 collecting ... collected 2 items
    21 
    22 test_case/test_func.py::test_add_by_func_aaa[924-AAAA] arg_1:924  arg_2:AAAA
    23 PASSED
    24 test_case/test_func.py::test_add_by_func_aaa[925-BBBB] arg_1:925  arg_2:BBBB
    25 PASSED
    26 
    27 ============================== 2 passed in 0.05s ==============================
    28 [Finished in 1.3s]
    29 '''        

    以上示例,展现的是一个测试用例有两个参数,然后参数化了两组数据。

    在接口测试过程中,两种参数两两组合,最终会有2*2==4种场景。在场景比较复杂的情况下,人工测试一般是不会全部覆盖的,但在自动化测试中,很容易就可以做到。

     1 # ./test_case/test_func.py
     2 import pytest
     3 from func import *
     4 
     5 '''
     6 class TestFunc:
     7 
     8     # 正常测试用例
     9     def test_add_by_class(self):
    10         assert add(2,3) == 5
    11 
    12 
    13     def test_add_by_class_11(self):
    14         assert add(2,3) == 5
    15 '''        
    16 
    17 @pytest.mark.parametrize("arg_1", [4399,  2012, 1997])
    18 @pytest.mark.parametrize("arg_2", ['AAAA', 'BBBB', 'CCCC'])
    19 def test_add_by_func_aaa(arg_1,arg_2):
    20     print("arg_1:{}  arg_2:{}".format(arg_1, arg_2))
    21     
    22 
    23 # ./run_test.py
    24 import pytest
    25 
    26 if __name__ == '__main__':
    27     pytest.main(['-v','-s'])
    28         
    29     
    30 '''
    31 ============================= test session starts =============================
    32 platform win32 -- Python 3.7.0, pytest-5.3.4, py-1.8.1, pluggy-0.13.1 -- D:Python3.7python.exe
    33 cachedir: .pytest_cache
    34 rootdir: D:Python3.7projectpytest, inifile: pytest.ini
    35 plugins: allure-pytest-2.8.9, rerunfailures-8.0
    36 collecting ... collected 9 items
    37 
    38 test_case/test_func.py::test_add_by_func_aaa[AAAA-4399] arg_1:4399  arg_2:AAAA
    39 PASSED
    40 test_case/test_func.py::test_add_by_func_aaa[AAAA-2012] arg_1:2012  arg_2:AAAA
    41 PASSED
    42 test_case/test_func.py::test_add_by_func_aaa[AAAA-1997] arg_1:1997  arg_2:AAAA
    43 PASSED
    44 test_case/test_func.py::test_add_by_func_aaa[BBBB-4399] arg_1:4399  arg_2:BBBB
    45 PASSED
    46 test_case/test_func.py::test_add_by_func_aaa[BBBB-2012] arg_1:2012  arg_2:BBBB
    47 PASSED
    48 test_case/test_func.py::test_add_by_func_aaa[BBBB-1997] arg_1:1997  arg_2:BBBB
    49 PASSED
    50 test_case/test_func.py::test_add_by_func_aaa[CCCC-4399] arg_1:4399  arg_2:CCCC
    51 PASSED
    52 test_case/test_func.py::test_add_by_func_aaa[CCCC-2012] arg_1:2012  arg_2:CCCC
    53 PASSED
    54 test_case/test_func.py::test_add_by_func_aaa[CCCC-1997] arg_1:1997  arg_2:CCCC
    55 PASSED
    56 
    57 ============================== 9 passed in 0.06s ==============================
    58 [Finished in 1.4s]
    59 '''
    60     

    四、总结

    以上就是测试中使用的pytest测试用例参数化,可以实现单参数和多参数的参数化过程。如果测试数据比较多,也可以把测试数据独立到文件里,然后读取出来,传递给@pytest.mark.parametrize(argnames, argvalues)装饰器。

  • 相关阅读:
    个人项目(零)
    个人项目
    H5页面键盘弹出,遮挡输入框问题(转文)
    UEditor 使用setContent()遇到的奇葩问题
    限制textarea每行输入N个字符串
    权限管理简易实现
    使用git上传github遇到的问题
    跟随鼠标移动的遮罩层
    Web字体大揭秘
    @media的使用
  • 原文地址:https://www.cnblogs.com/sunnydev/p/15332578.html
Copyright © 2020-2023  润新知