首页 > 其他分享 >pytest入门四:参数化

pytest入门四:参数化

时间:2024-12-13 16:00:42浏览次数:6  
标签:parametrize 入门 py 测试数据 pytest 参数 PASSED test

当测试数据和期望结果不一样,但操作步骤是一样的测试用例可以用上参数化。

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

参数说明:

argnames: 一个或多个参数名,用逗号分隔的字符串,如"arg1,arg2,arg3",参数名与用例入参数一致。

argvalues:参数值,必须是列表类型;如果有多个参数,则用元组存放值,一个元组存放一组参数值,元组放在列表中。

indirect:如果设置成True,则把传进来的参数当函数执行,而不是一个参数。

默认是False

False: 就是parametrize里面argnames 参数当作一个普通的变量,不会去找变量对应函数的名的方法

True: 就是parametrize里面argnames 参数当作函数执行,它会去找对应的函数,去执行

如下:

第一种,test_a就是一个单纯的变量,它接收的就是 "1", "2", "3",将这写数据传给了 test_login1用例。

第二种,test_a就不是一个变量,把它当作一个函数,将 "1", "2", "3" 数据给了test_a函数,函数的返回结果再传给了 test_login2用例。

ids:用例的ID,传一个字符串列表,可以标识每一个测试用例,自定义测试数据结果的显示,为了增加可读性,ids的长度需要与测试数据列表的长度一致。

 

import pytest

def add(a,b):
    return a + b


@pytest.mark.parametrize("a,b,expect",[
    [1,2,3],
    [2,3,5],
    [1,5,6]
])
def test_add(a,b,expect):
    assert add(a,b) == expect

@pytest.mark.parametrize("a,b,expect",[
    (1,2,3),
    (2,3,5),
    (1,5,6)
],ids=['test1','test2','test3'])
def test_add2(a,b,expect):
    assert add(a,b) == expect


@pytest.mark.parametrize("data",[
    {'a':1,'b':2,'expect':3},
    {'a':2,'b':2,'expect':4}
])
def test_add3(data):
    assert add(data['a'],data['b']) == data['expect']


@ pytest.mark.parametrize("a,b,expect",[
    pytest.param(1,1,2,id="pass"),
    pytest.param(1.2,.2,2.4,id="fail")
])
def test_add4(a,b,expect):
    assert add(a,b) == expect


# 标记参数化
@pytest.mark.parametrize("test_input,expected", [
    ("3+5", 8),
    pytest.param("6 * 9", 42, marks=pytest.mark.xfail,id='xfial'),
    pytest.param("6*6", 42, marks=pytest.mark.skip)
])
def test_mark(test_input, expected):
    assert eval(test_input) == expected

# 笛卡尔积,组合数据
data_1 = [1, 2, 3]
data_2 = ['a', 'b']


@pytest.mark.parametrize('a', data_1)
@pytest.mark.parametrize('b', data_2)
def test_parametrize_1(a, b):
    print(f'笛卡尔积 测试数据为 : {a},{b}')

@pytest.mark.parametrize("test_a",["1","2","3"],indirect=False)
def test_login1(test_a):
    print(f"测试数据为:{test_a}")

@pytest.fixture()
def test_a(request):
    return "函数:"+request.param

@pytest.mark.parametrize("test_a",["1","2","3"],indirect=True)
def test_login2(test_a):
    print(f"测试数据为:{test_a}")
    

if __name__ == "__main__":
    pytest.main(['-v', '-s','test.py'])

结果: 

collecting ... collected 25 items

test.py::test_add[1-2-3] PASSED
test.py::test_add[2-3-5] PASSED
test.py::test_add[1-5-6] PASSED
test.py::test_add2[test1] PASSED
test.py::test_add2[test2] PASSED
test.py::test_add2[test3] PASSED
test.py::test_add3[data0] PASSED
test.py::test_add3[data1] PASSED
test.py::test_add4[pass] PASSED
test.py::test_add4[fail] FAILED
test.py::test_mark[3+5-8] PASSED
test.py::test_mark[xfial] XFAIL
test.py::test_mark[6*6-42] SKIPPED (unconditional skip)
test.py::test_parametrize_1[a-1] 笛卡尔积 测试数据为 : 1,a
PASSED
test.py::test_parametrize_1[a-2] 笛卡尔积 测试数据为 : 2,a
PASSED
test.py::test_parametrize_1[a-3] 笛卡尔积 测试数据为 : 3,a
PASSED
test.py::test_parametrize_1[b-1] 笛卡尔积 测试数据为 : 1,b
PASSED
test.py::test_parametrize_1[b-2] 笛卡尔积 测试数据为 : 2,b
PASSED
test.py::test_parametrize_1[b-3] 笛卡尔积 测试数据为 : 3,b
PASSED
test.py::test_login1[1] 测试数据为:1
PASSED
test.py::test_login1[2] 测试数据为:2
PASSED
test.py::test_login1[3] 测试数据为:3
PASSED
test.py::test_login2[1] 测试数据为:函数:1
PASSED
test.py::test_login2[2] 测试数据为:函数:2
PASSED
test.py::test_login2[3] 测试数据为:函数:3
PASSED
 

标签:parametrize,入门,py,测试数据,pytest,参数,PASSED,test
From: https://blog.csdn.net/daxiashangxian/article/details/144448877

相关文章

  • 一篇入门广度优先搜索BFS
    注:本篇博客参考《算法图解》,读者阅读BFS一篇时大受启发所以想要记录下来并搭配例题给网友分享。BFS解决的问题从节点A出发,有前往节点B的路径吗?从节点A出发,前往节点B的哪条路径最短?应用:图的遍历搜索,最短路径,层级遍历,网络爬虫等一个例子+一个例题搞懂BFS把人和人的关......
  • 《安富莱嵌入式周报》第347期:分立元件自制14bit分辨率DAC,开源电池测试仪,大量位操作技
    周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 视频版https://www.bilibili.com/video/BV1SFq9YAE4j/目录:1、分立元件自制14bit分辨率DAC2、开源电池测试仪3、微软为VSCode制作的AIToolkit插件4、Zephyr相关(1)好消......
  • RabbitMQ快速入门 - 生产者和消费者的简单实现
    引入依赖<dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.7.3</version></dependency>编写生产者代码        RabbitMQ默认的⽤于客户端连接的TCP端⼝号是5672,需要提前进⾏开放代码及其注解p......
  • 0基础如何入门大模型? 这是我看过最全的大模型学习路线
    0基础入门大模型,transformer、bert这些是要学的,但是你的第一口不一定从这里咬下去。真的没有必要一上来就把时间精力全部投入到复杂的理论、各种晦涩的数学公式还有编程语言上,这样不仅容易让你气馁,而且特别容易磨光热情。当我们认识复杂新事物时,最舒适的路径应当是:感性认......
  • 大模型快速入门+学习路线,非常详细收藏我这一篇就够了!
    什么是大模型大模型,是指在人工智能领域,特别实在自然语言处理和机器学习中,拥有大量参数的深度学习模型。这些模型通过在大规模数据集上进行训练,能够学到丰富的数据表示和模式,从而在各种任务上表现出色,如文本生成,语言理解,图像识别等。大模型是具有大量参数和复杂结构的模型......
  • 苹果开发者入门:修复 SwiftUI 中“跑偏的”动画(下)
    概述大家知道SwiftUI不仅仅是一款App界面布局的超级利器,它同样提供了花样百出的动画和转场机制将UI世界点缀的“楚楚动人”。不过,对于苹果开发新入门的秃头小码农来说,使用动画貌似没有想象的那么易如反掌。如上图所示,在游戏成功和失败时红色圆形到图片的转变并没......
  • url链接中如果有两个问号会出现什么问题?如果通过js获取url的参数时能正常获取到吗?
    URL中出现两个问号会导致一些问题,主要取决于第二个问号的位置。情况一:第二个问号在片段标识符(fragmentidentifier)中如果第二个问号出现在#后面,也就是片段标识符部分,则不会有任何问题。片段标识符用于指定页面中的特定位置,其内容由浏览器自行处理,并不会发送到服务器。因此,第二......
  • 【.Net动态Web API】参数验证异常返回
    ​......
  • 【入门】晶晶的补习班
    描述晶晶上初中了。妈妈认为晶晶应该更加用功学习,所以晶晶除了上学之外,还要参加妈妈为她报名的各科补习班。晶晶的妈妈给了晶晶的下周每天上补习班的小时数,晶晶同学想知道,下周平均一天要上多少小时的补习班(结果保留1位小数),最长的补习班需要上几小时,最短的补习班需要上几小时?......
  • 零基础前端项目实战】数据大屏可视化项目完整教程 - 手把手教你用Vue+ECharts打造炫酷
    效果图:完整代码<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>数据大屏展示</title><scriptsrc="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script><scrip......