@pytest.mark.parametrize实例讲解

       最近因工作需要用到@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

  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值