参数化测试是指 允许传递多组数据,对多组数据进行循环调用,pytest 会及时报告失败和passed case.
1.一组数据
咱们先看只有一组数据:
def test_add():
def equivalent(a,b):
return a+b
assert 10 == equivalent(5, 5)
执行结果如图:

测试通过了,但只是一条,能不能批量呢? 难不倒优秀pytest 同学, 使用
2.批量参数
@pytest.mark.parametrize(argnames,argvalues)
修改代码如下:
import pytest
@pytest.mark.parametrize('a,b',[(5,5),(6,4),(3,7),(8,8)])
def test_add(a,b):
def equivalent(a,b):
return a+b
assert 10 == equivalent(a,b)
我们传递了 四组数据>(5,5),(6,4),(3,7),(8,8)
语法要记住
- @pytest.mark.parametrize(argnames,argvalues) , 在函数添加了装饰器
- argnames 要用 ‘args1 ,args2,args3’ , 用单引号并args 之间用逗号隔开,相当于Key
-
argvalues 要用[(args1_value,args2_value,args3_value),(args1_value,args2_value,args3_value)]
使用中括号,并用tuple 和args 对应,顺序不能变哦.
咱们看看执行结果吧
Pytest05:参数化测试
信息相当清晰, 参数 8-8 传入的参数校验失败,并指出了 assert 10 ==16 是错的.
如果想看passed 参数的情况,可以用-v 查看 ,请看截图:
【5-5】,【6-4】等都显示了出来 .
刚才的小伙伴提出了,我只想运行 【3-7】这个参数,有办法吗, 当然可以了, 看下边的截图
3. 参数的数据分离
@pytest.mark.parametrize(‘a,b’,[(5,5),(6,4),(3,7),(8,8)]) ,我们直接把数据传入不大友好,
我们修改下:
import pytest
data=[(5,5),(6,4),(3,7),(8,8)]
@pytest.mark.parametrize('a,b',data)
def test_add(a,b):
def equivalent(a,b):
return a+b
assert 10 == equivalent(a,b)
data=[(5,5),(6,4),(3,7),(8,8)]
我们同样也可以为类添加 @pytest.mark.parametrize
修改代码如下 :
import pytest
data=[(5,5),(6,4),(3,7),(8,8)]
@pytest.mark.parametrize('a,b',data)
class Test_add:
def test_add(self,a,b):
def equivalent(a,b):
return a+b
assert 10 == equivalent(a,b)
打印结果如下:
4. @pytest.mark.parametrize 添加ID标识
语法为 pytest.param(,id=“something”)
修改代码:
import pytest
data=[pytest.param(5,5,id="5+5:passed"),pytest.param(6,4,id="6+4:passed"),pytest.param(5,4,id="5+4:failed")]
@pytest.mark.parametrize('a,b',data)
class Test_add:
def test_add(self,a,b):
def equivalent(a,b):
return a+b
assert 10 == equivalent(a,b)
可以看出value 可以放多个值,
输出结果如下:
test_add_variety.py::Test_add::test_add**[5+5:passed]** PASSED [ 33%]
test_add_variety.py::Test_add::test_add[6+4:passed] PASSED [ 66%]
test_add_variety.py::Test_add::test_add[5+4:failed] FAILED [100%]
其中test_add[5+5:passed] 中括号里显示我们的id .
有理解错误,或者好的建议请留言 ,谢谢