paramtrize 参数化:
众所周知,测试用例需要尽可能多的(有代表性)的测试数据,在pytest中,我们可以往test数组中添加很多同样格式的测试数据,这个过程就是所谓的参数化。
参数化即对同一个接口,使用多种不同的输入对其进行测试,以验证每一组输入的参数是否都可以得到预期的结果。Pytest提供了pytest.mark.paramtrize这种方式来进行参数化
一、参数说明
@pytest.mak.paramtrize(argsnames, argsvalues, ids=None)
如上所示是paramtrize 使用格式,其中
argsnames :参数名,是个字符串,如中间用逗号分隔则表示为多个参数名;
argsvalues :参数值,参数组成的列表,列表中有几个元素,就会生成几条测试用例;
二、使用方法
- 使用@pytest.mak.paramtrize()装饰待测试的方法;
- paramtrize(‘a’, testdata)中’a’是自定义的参数名,testdata即为引入的参数列表;
- 将自定义的参数名str等作为参数传给test_one;
单个参数名代码示例:
# 文件名为 test_in_time.py
import pytest
testdata1 = [1, 2, 3]
@pytest.mark.parametrize("a", testdata1)
def test_one(a):
print("\n 参数a的值为", a)
如上代码所示,将自定义的参数名 a 做为参数传给test_one后,该测试方法就可以获得testdata列表中的每一项数据做为一个测试用例,如上代码所示,即有三条测试用例,执行 pytest -v test_in_time.py
,结果如下:
多个参数名代码示例
# 文件名 test_in_time.py
import pytest
from datetime import datetime, timedelta
testdata1 = [1, 2, 3]
@pytest.mark.parametrize("a", testdata1)
def test_one(a):
print("\n 参数a的值为", a)
testdata2 = [
(datetime(2001, 12, 12), datetime(2001, 12, 11), timedelta(1)),
(datetime(2001, 12, 11), datetime(2001, 12, 12), timedelta(-1))
]
@pytest.mark.parametrize("a, b, expected", testdata2)
def test_timedistance(a, b, expected):
diff = a - b
assert diff == expected
前面参数说明里提到了“ 参数名可以就用逗号分隔”,表示为多个参数名,当使用多个参数名时要注意,参数列表中的元素必须是可拆分的数组,并且数组内的元素数必须和参数名的数量相同,如上述代码所示的testdata2;
执行 pytest -vs test_in_time.py
,结果如下:
同一个方法多次使用paramtrize代码示例
# 文件名为test_in_time.py
import pytest
testdata1 = [1, 2, 3]
testdata2 = [4, 5, 6]
@pytest.mark.parametrize("b", testdata2)
@pytest.mark.parametrize("a", testdata1)
def test_one(a, b):
print("\n 参数a的值为", a)
print("参数b的值为", b)
如上结果所示,总共产生9个(3 * 3)个测试用例,如果testdata2有两个元素,则会产生6(3 * 2)个测试用例,类似于笛卡尔积。所以可以使用这种方法,使多个 paramtrize 的所有元素互相组合,生成大量测试用例。
【注】pytest的安装使用教程移步Pytest测试框架