Pytest参数化:parametrize简单应用

在unittest测试中,有参数化的概念,那么在pytest中也有。

 

 如何理解参数化:

        当对一个测试函数进行测试时,通常会给函数传递多组参数。比如测试账号登陆,我们需要模拟各种千奇百怪的账号密码。可以把这些参数写在测试函数内部进行遍历。不过虽然参数众多,但仍然是一个测试,当某组参数导致断言失败。我们想要的是一个的失败不影响其他的失败。通过参数化的方式来管理组织。那么我们看下pytest如何实现参数化的。

 

argnames:是一个字符串,是参数的名字,如果有多个参数时,用逗号分隔
argvalues:是一个列表(或者元祖),是具体的要传入的数据

indirect:为true时,那argnames一定是一个fixture函数名称,argvalues值将传入对应的fixture内,相当于@pytest.fixture(params=)的用法,默认False

ids:标记子用例执行名称,与argvalues数量一致,未指定自动生成,默认None

scope:如果指定,则表示参数的范围。范围用于按参数实例对测试进行分组。它还将覆盖任何fixture函数定义的范围,允许使用测试上下文或配置设置动态范围

 

1
pytest.mark.parametrize(argnames, argvalues,indirect=False,ids=None,scope=None)

 

假设要测试密码的长度必须大于8位且小于16位。设计了几个密码

1
['123','12345678','1234567890123456','12345678901234561']

 

我们看下如何使用

1
2
3
4
5
6
7
8
9
import pytest
 
@pytest.mark.parametrize('passwd',
                      ['123','12345678','1234567890123456','12345678901234561'])
 
 
def test_passwd_length(passwd):
    assert len(passwd) >= 8
    assert len(passwd)<=16

 正常应该执行四个测试用例

 

 失败用例:

 

 

 

如果我们要验证用户名和密码呢,两个参数如何实现呢。

1
2
3
4
5
6
7
8
9
10
11
12
13
import pytest
 
 
@pytest.mark.parametrize('user,passwd', [
    ('lowen', '123'), ('lowen', '12345678'),
    ('lowen', '1234567890123456'),
    ('lowenlowen', '12345678901234561')
])
 
def test_passwd_length(user, passwd):
    assert len(passwd) >= 8
    assert len(passwd) <= 16
    assert user == 'lowen'

  

 

 

 当然还可以给每组参数增加id

1
2
3
4
5
6
7
8
9
10
11
12
import pytest
 
 
@pytest.mark.parametrize('user,passwd',
                         [pytest.param('lowen', '123', id='case_name_1'),
                          pytest.param('lowen', '12345678', id='case_name_2'),
                          pytest.param('ll', '1234567890123456', id='case_name_3'),
                          pytest.param('lowenlowen', '12345678901234561', id='case_name_4')])
def test_passwd_length(user, passwd):
    assert len(passwd) >= 8
    assert len(passwd) <= 16
    assert user == 'lowen'

  

执行结果为:

 

 上面的都是写固定的,实际的工作中,很多时候的参数都是实时读取的。这些参数数据都是动态读取来的。如何给参数动态传递呢,这里获取数据,写了一个demo。

1
2
3
4
5
6
7
8
9
10
11
12
13
import pytest
 
 
def getparame() -> list:
    return [('lowen', '123'), ('lowen', '12345678'), ('ll', '1234567890123456'),
            ('lowenzishuoceshikaifa', '12345678901234561')]
 
 
@pytest.mark.parametrize('user,passwd',getparame())
def test_passwd_length(user, passwd):
    assert len(passwd) >= 8
    assert len(passwd) <= 16
    assert user == 'lowen'

 

执行结果为:

 

posted @   北京测试菜鸟  阅读(617)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示