51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 4225|回复: 0
打印 上一主题 下一主题

[原创] Pytest的参数化

[复制链接]
  • TA的每日心情
    擦汗
    7 天前
  • 签到天数: 1027 天

    连续签到: 2 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2021-3-23 11:06:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    前言
      无论什么自动化,都会需要参数化。unittest可以通过ddt来完成参数化,那么pytest通过什么呢?

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

      使用方法
      通过下方装饰器,使用在需要传入参数的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次。每次都是不同的参数信息。


      自定义参数信息
      在自动化中每个参数化中的参数都有不同的意义,可以进行备注参数信息。这样在执行后更加清楚的知道我们每个参数的内容。这里通过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'])




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


      跳过不需要的参数
      比如在某次测试过程中,遇到了不必要的参数,我们可以进行通过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的参数已经被跳过了。


      多组参数化数据
      在测试过程中,会遇到多组数据同时使用的情况。比如两组数据一起混合使用,结果就会有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条。



      字典参数形式
      上面的案例中,我们可以看出来,参数化的书写格式不仅仅只有元祖,还支持列表,元祖和列表都支持了,当然还支持字典形式。
    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也是支持字典的形式进行传参。



      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完成了参数化内容。



      传参形式
      上面介绍了字典的传参形式,下面给大家介绍列表的传参形式。
    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'])




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


      字典和列表的都介绍完了,下面肯定是元祖的传参方式了。
    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'])




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


      自定义参数信息
      前面介绍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'])




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


      好了,简单的给大家介绍了pytest的参数化方法,小伙伴们,可以同手进行操作下,毕竟孰能生巧。
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-10-7 04:31 , Processed in 1.031355 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表