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' |
执行结果为:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?