• 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软件测试网原创

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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • postman 测试工具很多时候只用于简单的get或post请求,普通的请求只要加入适当的参数点击send就可以正常请求并得到相应的响应结果。当涉及到文件下载时,需要把点击send改为点击send and download(默认send处下拉选择)。如果请求参数很长要怎么复制完全:首选谷歌浏览器,在浏览器控制台指定请求地址处鼠标右击选择store as global variable,游览器会自动在控制台建立含参数信息的临时变量,此时用控制器函数JSON.stringfy(临时变量名称)展开所有参数信息方便复制。1、请求参数:2、浏览器控制台获取参数信息3、加全局参数,如加当前登入入或登入机构...
            0 0 3674
            分享
          • 一、测试需求:测试20个用户访问网站在负载达到30QPS时的平均响应时间二、QPS:Query Per Second 每秒查询率。(一台查询服务器每秒能够处理的查询次数,作为域名服务器的性能经常用每秒查询率来衡量)三、测试步骤1、添加线程组(线程数+准备时长+循环次数)1)线程数:虚拟用户数,一个虚拟用户占用一个进程或线程(设置多少个虚拟用户=设置多少个线程)2)准备时长(s):设置的虚拟用户数需要多长时间全部启动。eg:线程数为20,准备时长为10,则说明需要10秒钟启动20个进程。3)循环次数:每个线程发送请求的次数。eg:线程数为20,循环次数为5,那么每个线程发送5次请求,总...
            10 9 2570
            分享
          •   据外媒报道,当地时间周三,通用汽车旗下的自动驾驶子公司Cruise宣布,将召回950辆自动驾驶汽车,以解决其碰撞检测系统的问题。  就在一个多月前,该公司的一辆汽车在无人驾驶模式下行驶时撞上并拖拽了一名行人。具体来说,这起事故于10月2日发生在旧金山,当时一辆有驾驶员的车辆撞到了一名行人,并将这名行人推到了一辆Cruise自动驾驶汽车的车道上。Cruise的自动驾驶汽车在撞到行人后最初停了下来,但随后,为了避开车流,这辆车又向右行驶,将这名行人向前拖了约20英尺(6米)。这名行人被压在汽车的一个轮胎下,伤势严重。  经过为期三周的审查,Cruise确定其自动驾驶汽车碰撞检测子系统在这种情况...
            0 0 507
            分享
          • 一、什么是测试报告?测试报告是指把测试的过程和结果写成文档,对发现的问题和缺陷进行分析,为纠正软件存在的质量问题提供依据,同时为软件验收和交付打下基础。二、测试执行和结束的准则1、测试执行的结束的原因1)测试达到预期目的后,按计划结束2)受时间进度、资源的限制,考试被迫结束2、测试执行结束后1)在测试计划中明确说明测试结束的条件2)Good-Enough原则3)结束条件的判定是在质量和成本之间的折衷4)指定的时间段内没有发现新的缺陷5)基于成本的考虑(不适用武器、医疗设备)3、测试执行结束后1)达到了覆盖率的要求2)单元测试:语句覆盖、…3)集成测试:API、参数组合…4)系统测试:功能、用例...
            0 0 2078
            分享
          • 读者提问:偶现 BUG,怎么报?阿常回答:这个方面我从三方面回答:1、出现偶发 BUG,报不报;2、出现偶发 BUG,怎么报;3、偶发 BUG 如何跟踪闭环。一、出现偶发 BUG,报不报偶发 BUG 要报。偶发 BUG 即低概率 BUG,它也许只会出现一次,但我们要相信,即使是偶发 BUG 也有其必现的路径,只是我们暂时未找到复现的方法。二、出现偶发 BUG,怎么报增加一类偶现 BUG 类型。先分析 BUG 严重程度,如果是严重影响系统的 BUG,第一时间反馈给研发处理。记录 BUG 复现的测试场景、测试步骤,上传日志文件以及其他相关截图,提交 BUG 单。三、偶发 BUG 如何跟踪...
            0 0 953
            分享
      • 51testing软件测试圈微信