网易首页 > 网易号 > 正文 申请入驻

学习Python自动化测试,Pytest的参数化你必须了解一下

0
分享至

无论什么自动化,都会需要参数化。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次。每次都是不同的参数信息。

  自定义参数信息

在自动化中每个参数化中的参数都有不同的意义,可以进行备注参数信息。这样在执行后更加清楚地知道我们每个参数的内容。这里通过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的参数化方法,小伙伴们,可以同手进行操作下,毕竟熟能生巧。

最后邀请想提升实力的测试人一起学习

  如果你的也有很多问题想要解决,你的测试职业规划也需要一点光亮,你也想跟着大家一起分享探讨,我给你推荐一个「Python自动化测试学习交流群」你缺的知识这里有,你少的技能这里有,你要的大牛也在这里……

  来吧!!一起进阶自动化测试!!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
2026年开始否极泰来,运势持续走高,越来越顺的三个星座

2026年开始否极泰来,运势持续走高,越来越顺的三个星座

小晴星座说
2026-01-02 18:10:36
解放军围台三天,美军要出手了?双航母已到西太,随时能南北夹击

解放军围台三天,美军要出手了?双航母已到西太,随时能南北夹击

触摸史迹
2026-01-02 19:01:48
特朗普警告伊朗若杀示威者:美国将军事介入

特朗普警告伊朗若杀示威者:美国将军事介入

桂系007
2026-01-02 18:33:59
单节20分刷爆队史纪录!健康的伦纳德,让快船6连胜彻底失控

单节20分刷爆队史纪录!健康的伦纳德,让快船6连胜彻底失控

格斗联盟
2026-01-02 19:27:32
赵丽颖冯绍峰活动现场同框,二叔低头瞬间引关注

赵丽颖冯绍峰活动现场同框,二叔低头瞬间引关注

付老师种植技术团队
2026-01-01 19:52:18
多项数据创赛季新高,李凯尔10中8高效得到22分8板1助2断2帽

多项数据创赛季新高,李凯尔10中8高效得到22分8板1助2断2帽

懂球帝
2026-01-02 14:15:06
32GB+2TB !这款 25500mAh 新机真的有点疯狂啊

32GB+2TB !这款 25500mAh 新机真的有点疯狂啊

科技堡垒
2026-01-02 12:11:00
有4种家庭不能考公务员!考了也白考,政审时会查得一清二楚

有4种家庭不能考公务员!考了也白考,政审时会查得一清二楚

前沿天地
2026-01-02 09:26:29
南博出大事:调查组连夜抄前院长的家,地下室古董编号全对上了!

南博出大事:调查组连夜抄前院长的家,地下室古董编号全对上了!

娱乐的硬糖吖
2026-01-02 15:53:41
13岁小女孩说肚子里有东西,父母带她去检查,结果出来父母大哭

13岁小女孩说肚子里有东西,父母带她去检查,结果出来父母大哭

青青会讲故事
2025-07-02 17:20:57
看完电影《寻秦记》,我如鲠在喉、难以下咽,写下这篇真实影评

看完电影《寻秦记》,我如鲠在喉、难以下咽,写下这篇真实影评

晴晴的娱乐日记
2026-01-01 15:58:51
郭正亮:毛选第四卷令我惊讶,毛主席的判断几乎跟后来的历史吻合

郭正亮:毛选第四卷令我惊讶,毛主席的判断几乎跟后来的历史吻合

混沌录
2026-01-02 17:35:08
震惊!一尊78厘米高、19.5公斤重的明代鎏金佛像,捐赠去向不明…

震惊!一尊78厘米高、19.5公斤重的明代鎏金佛像,捐赠去向不明…

火山詩话
2026-01-01 06:03:57
四川多名游客合伙爬上大佛拿走“香火钱”,景区回应:已报警

四川多名游客合伙爬上大佛拿走“香火钱”,景区回应:已报警

半岛晨报
2026-01-02 17:16:12
特朗普白忙活一年,中国在年底打响声势,王毅一番话直戳美国心窝

特朗普白忙活一年,中国在年底打响声势,王毅一番话直戳美国心窝

胡麒牧博士
2026-01-02 19:26:46
赵薇钻空子,凌晨空降酒庄直播间,多次亲自家主播,正嗨聊时被封

赵薇钻空子,凌晨空降酒庄直播间,多次亲自家主播,正嗨聊时被封

非常先生看娱乐
2026-01-01 18:03:27
新年首击:圣彼得堡大面积断电!乌克兰摧毁黑海最大石油港

新年首击:圣彼得堡大面积断电!乌克兰摧毁黑海最大石油港

项鹏飞
2026-01-01 12:50:56
顺德鱼生是淡水生鱼片,不担心寄生虫吗?网友:大数据不会骗人!

顺德鱼生是淡水生鱼片,不担心寄生虫吗?网友:大数据不会骗人!

夜深爱杂谈
2025-12-23 17:35:17
香港豪门圈有个有趣的说法:豪门太太最怕郭晶晶参加晚宴

香港豪门圈有个有趣的说法:豪门太太最怕郭晶晶参加晚宴

动物奇奇怪怪
2026-01-02 15:20:47
被索赔23亿元,欣旺达“问题电芯”发酵:极氪车主喊话换电池,有理想准车主放弃提车

被索赔23亿元,欣旺达“问题电芯”发酵:极氪车主喊话换电池,有理想准车主放弃提车

红星新闻
2026-01-02 14:55:09
2026-01-02 20:27:00
51Testing软件测试网 incentive-icons
51Testing软件测试网
中国软件测试人的精神家园
1517文章数 13251关注度
往期回顾 全部

科技要闻

新势力年榜:零跑险胜华为,蔚来小鹏新高

头条要闻

媒体:赖清德叫嚣"中共不敢越雷池" 转头就被狠抽耳光

头条要闻

媒体:赖清德叫嚣"中共不敢越雷池" 转头就被狠抽耳光

体育要闻

英超离谱夜?4战全平3场0-0 曼城红军翻车

娱乐要闻

田亮一家新年全家福!森碟变清纯少女

财经要闻

8200亿扩产潮下的锂电供应链之战

汽车要闻

奇瑞汽车12月销量超23万辆 全年超263万辆

态度原创

房产
数码
旅游
公开课
军事航空

房产要闻

海大誉府新年家年华暨2号楼耀世加推发布会圆满落幕

数码要闻

三星发布The Freestyle+便携投影仪 亮度翻倍并加入多项AI功能

旅游要闻

旋转木马、城市冰场同步开放,冰雪与童话交织在陆家嘴商圈

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

泽连斯基:乌全力推动恢复战俘交换工作

无障碍浏览 进入关怀版