pytest参数化:@pytest.mark.parametrize

内置的pytest.mark.parametrize装饰器可以用来对测试函数进行参数化处理。下面是一个典型的范
例,检查特定的输入所期望的输出是否匹配:
test_expectation.py

import pytest
@pytest.mark.parametrize("test_input, expected", [("3+5", 8), ("2+4", 6), ("6*9", 42),])
def test_eval(test_input, expected):
    assert eval(test_input) == expected

装饰器@parametrize定义了三组不同的(test_input, expected)数据,test_eval则会使用这三组数据
执行三次:

$ pytest
=========================== test session starts ============================
platform linux ‐‐ Python 3.x.y, pytest‐4.x.y, py‐1.x.y, pluggy‐0.x.y
cachedir: $PYTHON_PREFIX/.pytest_cache
rootdir: $REGENDOC_TMPDIR, inifile:
collected 3 items
test_expectation.py ..F [100%]
================================= FAILURES =================================
____________________________ test_eval[6*9‐42] _____________________________
test_input = '6*9', expected = 42
@pytest.mark.parametrize("test_input,expected", [
("3+5", 8),
("2+4", 6),
("6*9", 42),
])
def test_eval(test_input, expected):
> assert eval(test_input) == expected
E AssertionError: assert 54 == 42
E + where 54 = eval('6*9')
test_expectation.py:8: AssertionError
==================== 1 failed, 2 passed in 0.12 seconds ====================

该示例中,只有一组数据是失败的。通常情况下你可以在traceback中看到作为函数参数的input和output。
注意你也可以对模块或者class使用参数化的marker来让多个测试函数在不同的测试集下运行。
你也可以对参数集中的某个参数使用mark,比如下面使用了内置的mark.xfail:
test_exception.py

import pytest
@pytest.mark.parametrize("test_input, expected", [("3+5", 8), ("2+4", 6), ("6*9", 42, marks=pytest.mark.xfail),])
def test_eval(test_input, expected):
    assert eval(test_input) == expected

运行结果如下:

$ pytest
=========================== test session starts ============================
platform linux ‐‐ Python 3.x.y, pytest‐4.x.y, py‐1.x.y, pluggy‐0.x.y
cachedir: $PYTHON_PREFIX/.pytest_cache
rootdir: $REGENDOC_TMPDIR, inifile:
collected 3 items
test_expectation.py ..x [100%]
=================== 2 passed, 1 xfailed in 0.12 seconds ====================

之前结果是失败的用例在这里已经被标记为xfailed了。
如果参数化的列表是一个空列表,比如参数是某个函数动态生成的,请参考
empty_parameter_set_mark选项。
可以对一个函数使用多个parametrize的装饰器,这样多个装饰器的参数会组合进行调用:

import pytest
@pytest.mark.parametrize("x", [0, 1])
@pytest.mark.parametrize("y", [2, 3])
def test_foo(x, y):
    pass

这会穷举x和y的所有组合并进行调用。

最后:下方这份完整的软件测试视频学习教程已经整理上传完成,朋友们如果需要可以自行免费领取【保证100%免费】

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

`@pytest.fixture`和`@pytest.mark.parametrize`是pytest中的两个常用装饰器,用于测试用例的编写和组织。 `@pytest.fixture`装饰器用于定义测试用例执行前需要进行的准备工作,也就是测试夹具(test fixture)。夹具可以是创建、配置或者初始化测试用例所需的对象、数据或环境等。通过夹具,我们可以确保在每个测试用例执行前都有一致的环境和数据状态。 举个例子,假设我们有一个测试用例需要访问数据库,那么可以使用`@pytest.fixture`装饰器来创建一个数据库连接夹具,在每个测试用例执行前都创建一个连接,在用例执行后关闭连接,以保证每个测试用例都有独立的数据库连接。 `@pytest.mark.parametrize`装饰器用于参数化测试用例。参数化是一种有效的测试用例设计方法,它允许我们通过给定不同的参数组合来运行相同的测试逻辑,从而减少代码重复并增加测试覆盖性。使用`@pytest.mark.parametrize`装饰器,我们可以将测试用例定义为一个参数化的函数,并指定不同的参数组合。 举个例子,假设我们有一个加法函数`add(a, b)`,可以使用`@pytest.mark.parametrize`装饰器来定义一个参数化测试用例,传入不同的参数组合来验证加法函数的正确性,例如测试用例可以是`(1, 2, 3)`、`(0, 0, 0)`、`(-1, 1, 0)`等。 总结来说,`@pytest.fixture`用于准备测试用例执行前的环境和数据,而`@pytest.mark.parametrize`用于参数化测试用例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值