参数化用例

如果待测试的输入与输出是一组数据,可以把测试数据组织起来用不同的测试数据调用相同的测试方法。参数化顾名思义就是把不同的参数,写到一个集合里,然后程序会自动取值运用用例,直到集合为空便结束,pytest中可以使用@pytest.mark.parametrize来参数化。

1.使用parametrize实现参数化

parametrize()方法源码:
def paramtrize(argnames, argvalues, indirect=False, ids=None, scope=None,*, _param_mark=None):

  • 主要参数说明
    • argnames:参数名,是个字符串,如中间用逗号分隔则表示为多个参数名
    • argsvalues: 参数化,参数组成的列表,列表中有几个元素,就会生成几个参数用例
  • 使用方法
    • 使用@pytest.mark.paramtrize()装饰器测试方法
    • parametrize("data",param)中的"data"是自定义的参数名,param是引入的参数列表
    • 将自定义的参数名data作为参数传给测试用例test_func
    • 然后就可以在测试用例内部使用data的参数了
2.代码演示

创建测试用例,传入三组参数,每组两个元素,判断每组参数里面表达式和值是否相等

import pytest @pytest.mark.parametrize("test_input,expected",[("3+5",8),("3+9",12),("2+4",60)]) def test_eval(test_input,expected): #eval 将字符串str 当成有效的表达式来求值,并返回结果 assert eval(test_input) == expected


整个执行过程中,pytest将参数列表[("3+5",8),("3+9",12),("2+4",30)]中的三组数据取出来,每组数据生成一条测试用例,并且将每组数据中的两个元素分别赋值到方法中,作为测试方法的参数由测试用例使用。

3.多次使用parametrize

同一个测试用例还可以同时添加多个@pytest.mark.parametrize装饰器,多个parametrize的所有元素互相组合,生成大量的测试用例
场景:比如登录场景,用户名输入情况有n种,密码的输入情况有m种,希望验证用户名和密码,就会涉及到n*种组合的测试用例,如果把这些数据一一的列出来,工作量也是非常大的。pytest提供了一种参数化的方式,将多组测试数据自动组合,生成大量的测试用例:

import pytest @pytest.mark.parametrize("x",[1,2]) @pytest.mark.parametrize("y",[8,10,11]) def test_foo(x,y): print(f"测试数据的组合x: {x} , y:{y}")


分析运行结果,测试方法test_foo()添加了两个@pytest.mark.parametrize()装饰器,两个装饰器分别提供两个参数值的列表,2*3=6种组合,pytest便会生成6条测试用例,在测试中使用这种方法使参数自由组合,可以实现全面的测试

4.parametrize源码

def paramtrize(argnames, argvalues, indirect=False, ids=None, scope=None,*, _param_mark=None):
indirect参数设置为True,pytest会把argnames当作函数去执行,将argvalues作为参数传入到argnames这个函数里。

test_user_data = ["Tome","Jerry"] @pytest.fixture(scope="module") def login_r(request): # 通过request.param获取参数 user = request.param print(f"\n 登录用户:{user}") return user @pytest.mark.parametrize("login_r",test_user_data,indirect=True) def test_login(login_r): a = login_r print(f"测试用例中login的返回值;{a}")


当indirect=True时,会将login_r作为参数,test_user_data被当作参数传入到login_r方法中,生成多条测试用例。通过return将结果返回,当调用login_r可以获取到login_r这个方法的返回数据


__EOF__

本文作者cclv
本文链接https://www.cnblogs.com/lcc-lv/p/16797184.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   当时只道是寻常呀  阅读(85)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示