摘自:https://blog.csdn.net/sunny_happy08/article/details/83658661
最近因工作需要用到@pytest.mark.parametrize()传多个参数,实现执行不同数据。
我的需求
数据源是excel,excel的每一行都是一条测试用例,已实现读取测试用例和处理测试用例的逻辑。接下来就是将这些测试数据通过pytest.mark.parametrize()传入测试函数,循环执行这些测试数据,每次执行时都需要assert用例结果, 以便将测试结果展示到pytest的结果文件中(通过pytest --html=./report/report.html)
实现可行性
上篇文章已经很详细的指出了用@pytest.mark.parametrize()传多个参数实现执行不同数据的情况。通过上篇文章的例子,我们发现,pytest会自动执行循环,且对用户是透明的,用户不需要自己去写循环逻辑。直接将测试的list丢进去,就会循环执行,这是我们所期望的。也是符合我的需求的。
遇到问题
安照这个逻辑,我只需要将excel读出来的所有数据当做一个list传到测试函数里就可以了,等着pytest自行调度执行,最后assert每条执行结果是True还是False就成了。实际是:pytest的确是执行了每条测试案例,虽然每条案例也写了assert,但是pytest把所有案例执行完了当做一个整体返回assert结果。pytest的执行记录里显示的也是只有一个案例。这个结果与我的预期是不一样的。怎么办?
解决方案
想不出原因,只好硬着头皮去写试验代码,由结果猜测原因了。
难道不支持多个参数?不太可能,因为明明是写着多个参数的。那就是多个参数写法的问题咯。翻了代码发现,当传多个参 数时,第二个参数是多个元组组成的list。一一列出来写的。我是将这个元组参数化了,用一个形参穿进去的。有了这个猜 测,就写代码验证下,果然是这么个样子。
通过执行试验代码发现,一一列出来写,是把每个元组的元素作为形参传进去的;按形参传是吧一个list传进去的,所以,一一列出会每个元素都会有一个结果,按形参传入就整个list执行完了才出结果。ok,问题解决。
实验代码
执行结果
PS:当有多个参数都是list,且list的长度不一致时,要这样一一列出来就略尴尬了,记录一下pytest.mark.parametrize()的局限性的。另外,当@pytest.mark.parametrize()只一个参数时,是把list的每个元素当做形参传入的,会assert每次执行结果。
传一个参数时,两种写法都可以,具体看以下实例
写法一:
@pytest.mark.parametrize('name', ['sunny', 'kevinse', 'jacky'])
def test_name(name):
print name
写法二:
name_list = ['sunny', 'kevinse', 'jacky']
@pytest.mark.parametrize('name', name_list)
def test_name(name):
print name