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)装饰器。

原文地址:https://www.cnblogs.com/sunnydev/p/15332578.html