• 13
  • 15
分享

  前言

  无论什么自动化,都会需要参数化。unittest可以通过ddt来完成参数化,那么pytest通过什么呢?

  parametrize

  pytest中自带的装饰器parametrize可以来实现测试用例的参数化功能。

  使用方法

  通过下方装饰器,使用在需要传入参数的case中。用例传参中的值和装饰器传入的参数值一致。

@pytest.mark.parametrize('参数化名称',参数化值)

  安静举一个登录传参的例子。

import pytest
# 登录参数
data = [('anjing', 'anjing_pwd'), ('test', 'test_pwd'), ('admin', 'admin_pwd')]
class Test_01:
    # 通过parametrize进行参数化
    @pytest.mark.parametrize('user, pwd', data)
    def test_01(self, user,pwd):
        print('---用例01---')
        print('登录的用户名:%s' % user)
        print('登录的密码:%s' % pwd)
        
    def test_02(self):
        print('---用例02---')
        
if __name__ == '__main__':
    pytest.main(['-vs'])

   

  通过直接结果可以看出来,test_01一共执行了3次。每次都是不同的参数信息。

1-1.jpg

  自定义参数信息

  在自动化中每个参数化中的参数都有不同的意义,可以进行备注参数信息。这样在执行后更加清楚的知道我们每个参数的内容。这里通过parametrize的参数ids方法进行备注参数信息。注意:备注的参数信息一定要和参数数量保持一致。

import pytest
# 登录参数
data = [('anjing', 'anjing_pwd'), ('test', 'test_pwd'), ('admin', 'admin_pwd')]
class Test_01:
    # 通过parametrize进行参数化
    @pytest.mark.parametrize('user,pwd', data, ids=['user name is anjing','user name is test','user name is admin'])
    def test_01(self, user,pwd):
        print('---用例01---')
        print('登录的用户名:%s' % user)
        print('登录的密码:%s' % pwd)
        
    def test_02(self):
        print('---用例02---')
        
if __name__ == '__main__':
    pytest.main(['-vs'])

   

  通过执行代码结果发现我们的自定义参数信息已经生效了。在每条用例后都显示了我们备注的参数信息。

1-2.jpg

  跳过不需要的参数

  比如在某次测试过程中,遇到了不必要的参数,我们可以进行通过pytest.mark.skip的方法进行跳过。

import pytest
# 登录参数
data = [('anjing', 'anjing_pwd'), pytest.param('test', 'test_pwd',marks=pytest.mark.skip), ('admin', 'admin_pwd')]
class Test_01:
    # 通过parametrize进行参数化
    @pytest.mark.parametrize('user,pwd', data, ids=['user name is anjing','user name is test','user name is admin'])
    def test_01(self, user,pwd):
        print('---用例01---')
        print('登录的用户名:%s' % user)
        print('登录的密码:%s' % pwd)
        
    def test_02(self):
        print('---用例02---')
        
if __name__ == '__main__':
    pytest.main(['-vs'])

   

  通过执行结果可以看出来,user为test的参数已经被跳过了。

1-3.jpg

  多组参数化数据

  在测试过程中,会遇到多组数据同时使用的情况。比如两组数据一起混合使用,结果就会有2组数据的数量相乘。下方例子:每组都有3个参数,想要的混合结果,一共9种结果。这种方法就可以通过parametrize的方法进行使用,在需要用到参数的用例上加入两个装饰器即刻。

import pytest
# 登录参数
data = ['anjing', 'test', 'admin']
data1 = ['123', '456', '789']
class Test_01:
    # 通过parametrize进行参数化
    @pytest.mark.parametrize('user', data)
    @pytest.mark.parametrize('pwd', data1)
    def test_01(self, user, pwd):
        print('---用例01---')
        print('登录的用户名:%s' % user)
        print('登录的密码:%s' % pwd)
        
    def test_02(self):
        print('---用例02---')
if __name__ == '__main__':
    pytest.main(['-vs'])

   

  通过结果可以看出来,一共运行了10条用例,其中参数化一共9条。

1-4.jpg

  字典参数形式

  上面的案例中,我们可以看出来,参数化的书写格式不仅仅只有元祖,还支持列表,元祖和列表都支持了,当然还支持字典形式。

import pytest
data = [{'user': "anjing", 'pwd': "123456"},
        {'user': "test", 'pwd': "123456"},
        {'user': "admin", 'pwd': "123456"}]
        
class Test_01:
    @pytest.mark.parametrize('user', data)
    def test_01(self, user):
        print('账号信息:%s' % user)
        
    def test_02(self):
        print('---用例02---')
        
if __name__ == '__main__':
    pytest.main(['-vs'])

   

  通过执行结果发现,我们通过字典的字典的形式进行书写,parametrize也是支持字典的形式进行传参。

1-5.jpg

  fixture中params

  上面介绍了pytest中的自带的参数化方法,我们也可以通过使用fixture中的params参数来做参数化。

  使用方法

  通过fixture中的params方法进行传参,然后通过request.param进行接收结果。然后在使用的过程中直接返回。

import pytest
data = [{'user': "anjing", 'pwd': "123456"},
        {'user': "test", 'pwd': "123456"},
        {'user': "admin", 'pwd': "123456"}]
        
@pytest.fixture(params=data)
def login(request):
    print('打开浏览器')
    yield request.param
    print('关闭浏览器')
    
class Test_01:
    def test_01(self, login):
        print('用户名:%s' % login['user'])
        print('密码:%s' % login['pwd'])
    def test_02(self):
        print('---用例02---')
        
if __name__ == '__main__':
    pytest.main(['-vs'])

   

  通过执行结果可以看出,我们已经通过fixture完成了参数化内容。

1-6.jpg

  传参形式

  上面介绍了字典的传参形式,下面给大家介绍列表的传参形式。

import pytest
data = [['anjing', 'anjing_pwd'], ['test', 'test_pwd'],
        ['admin','admin_pwd']]
        
@pytest.fixture(params=data)
def login(request):
    print('打开浏览器')
    yield request.param
    print('关闭浏览器')
    
class Test_01:
    def test_01(self, login):
        print('用户名:%s' % login[0])
        print('密码:%s' % login[1])
        
    def test_02(self):
        print('---用例02---')
        
if __name__ == '__main__':
    pytest.main(['-vs'])

   

  通过执行发现,通过列表的形式也可以进行传参。

1-7.jpg

  字典和列表的都介绍完了,下面肯定是元祖的传参方式了。

import pytest
data = [('anjing', 'anjing_pwd'), ('test', 'test_pwd'),
        ('admin','admin_pwd')]
        
@pytest.fixture(params=data)
def login(request):
    print('打开浏览器')
    yield request.param
    print('关闭浏览器')
    
class Test_01:
    def test_01(self, login):
        print('用户名:%s' % login[0])
        print('密码:%s' % login[1])
        
    def test_02(self):
        print('---用例02---')
        
if __name__ == '__main__':
    pytest.main(['-vs'])

   

  通过结果可以看出来,我们通过元祖的方式也进行了传参。

1-8.jpg

  自定义参数信息

  前面介绍pytest中的parametrize方法时,可以对每条参数进行信息备注,在fixture的参数化中,也是可以的,fixture中有个ids参数就是用来表示对参数化的信息进行参数备注信息,直接在fixture的装饰器方式中加入ids参数即刻。注意:这个备注信息和参数化的数量保持一致。

import pytest
data = [['anjing', 'anjing_pwd'], ['test', 'test_pwd'],
        ['admin','admin_pwd']]
        
@pytest.fixture(params=data, ids=['user=anjing','user=test','user=admin'])
def login(request):
    print('打开浏览器')
    yield request.param
    print('关闭浏览器')
    
class Test_01:
    def test_01(self, login):
        print('用户名:%s' % login[0])
        print('密码:%s' % login[1])
        
    def test_02(self):
        print('---用例02---')
        
if __name__ == '__main__':
    pytest.main(['-vs'])

   

  通过执行结果发现,我们的结果中已经对各个参数化内容进行了信息备注。

1-9.jpg

  好了,简单的给大家介绍了pytest的参数化方法,小伙伴们,可以同手进行操作下,毕竟孰能生巧。


作者:测试安静   

来源:51Testing软件测试网原创

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 前言前面对脚本的基础配置、公共配置进行封装完成后,下一步便是对公司内部的业务进行分模块,按照模块进行对应的封装业务逻辑的封装目的将整个应用抽离分成哥哥公共模块,以便在不同的业务场景内直接复用对应的脚本文件;例如:将登录分成引导页模块、登录模块、注册模块、签到模块等等,各个模块根据业务能力划分,独立封装对应的脚本,便于后续业务功能发生变更时,快速的维护和调用脚本。脚本目录以下脚本分别对登陆模块和退出登陆模块两个模块进行独立封装本地对应的文件夹目录:脚本简述其中登录模块的测试脚本,包含了:登录的整个操作流程login_action()校验是否登录成功check_login_alter()
            0 0 1333
            分享
          •   大家测试过程中经常用的等价类划分、边界值分析、场景法等,并不能覆盖所有的需求,下面就来讲一种不经常用到但又非常重要的测试用例编写方法。  因果图  应用场景:页面上有多个控件(输入),控件(输入)之间存在不同的组合关系,不同组合之间又可以产生不同的输出结果,符合这个条件的页面可以使用因果图法。  通过应用场景我们发现,一个手机壳外形选择页面的用例就可以按照这种方法编写。  我们假设我们手机,品牌有品牌1和品牌2,品牌1对应的型号有型号1、型号2,品牌2对应的型号有型号3、型号4,我们所有的手机外形有外形1,外形2,但是外形1只能给品牌1的手机使用,外形2品牌2的手机使用;除固定选择外,还有...
            0 0 840
            分享
          •   最近在这整理知识,发现在pytest的知识文档缺少系统性,这里整理一下,方便后续回忆。  在python中,大家比较熟悉的两个框架是unittest和pytest:  ·Unittest是Python标准库中自带的单元测试框架,Unittest有时候也被称为PyUnit,就像JUnit是Java语言的标准单元测试框架一样,Unittest则是Python语言的标准单元测试框架。  · Pytest是Python的另一个第三方单元测试库。它的目的是让单元测试变得更容易,并且也能扩展到支持应用层面复杂的功能测试。  两者之间的区别如下:  这里试用的pytest框架,加上reques...
            0 0 1197
            分享
          •   爱奇艺会员又涨价了,花3块钱把自己送上了热搜。  三次涨价后,相比2020年之前,会员连续包月最低价上涨了2/3。实际上,爱奇艺并不是唯一因会员涨价站在风口浪尖的长视频平台,腾讯视频、优酷、芒果TV最近一次分别在今年4月、6月、8月上调过会员价格。在不含电视端会员中,爱优腾的六大套餐价处于同等价位;在含电视端会员中,爱奇艺季卡128元,稍低于腾讯、优酷季卡148元。  涨价带来的即时效果是明显的。爱奇艺在今年Q3营收达到74.7亿元,环比提高了12.2%,净利润也从去年同期的亏损约17亿收窄为3.956亿;腾讯视频得益于会员价格调整的积极举措,ARPU(每用户平均收入)有所提升;阿里的20...
            0 0 915
            分享
          •   背景  小S是刚工作一年半的校招生,小H是他的导师,无论是技术能力还是业务测试,小H都是团队中的榜样。小H给小S的建设性反馈是期望他能对小H做到简单相信,提升日常沟通和工作效率。  辅导过程  小Z:小H给你提了个建设性反馈,期望你能做到简单相信。我们一起来看下,我能帮助你什么,或者你在改进这些方面过程中有什么卡点,我们一起想办法解决。  小S:大家说要简单相信,我认为大家告诉我的大部分内容我都会照着做,并没有感觉到自己没有简单相信的。  小Z:嗯,我知道怎么回事儿了。当提到简单相信时,这已经是方法层面的事情了,但没有提及问题点,咱们先界定一下。我理解小H说的点在于你有一些观点和认知很难被...
            0 0 732
            分享
      • 51testing软件测试圈微信