如何使用pytest跳过参数化测试



是否可以有条件地跳过参数化测试
这里有一个例子:

@pytest.mark.parametrize("a_date", a_list_of_dates)
@pytest.mark.skipif(a_date > date.today())
def test_something_using_a_date(self, a_date):
assert <some assertion>

当然,我可以在测试方法中做到这一点,但我正在寻找一种使用pytest的结构化方法。

如果您创建自己的方法,您将在测试收集时间检查值,并仅运行相关测试

a_list_of_dates = [date.today(), date(2024, 1, 1), date(2022, 1, 1)]
def get_dates():
for d in a_list_of_dates:
if d <= date.today():
yield d
class TestSomething:
@pytest.mark.parametrize("a_date", get_dates())
def test_something_using_a_date(self, a_date):
print(a_date)

输出

TestSomething::test_something_using_a_date[a_date0] PASSED [ 50%] 2022-08-24
TestSomething::test_something_using_a_date[a_date1] PASSED [100%] 2022-01-01

如果您仍然想查看跳过的测试,可以将skip标记添加到相关测试

def get_dates():
for d in a_list_of_dates:
markers = []
if d > date.today():
markers.append(pytest.mark.skip(reason=f'{d} is after today'))
yield pytest.param(d, marks=markers)

输出

TestSomething::test_something_using_a_date[a_date0] PASSED [ 33%] 2022-08-24
TestSomething::test_something_using_a_date[a_date1] SKIPPED (2024-01-01 is after today) [ 66%]
Skipped: 2024-01-01 is after today
TestSomething::test_something_using_a_date[a_date2] PASSED [100%] 2022-01-01

这样做是可能的,尽管这可能需要一些工作,具体取决于您想要什么。

如果你只需要跳过特定的参数集(即,如果你不需要使用表达式来识别要跳过的参数集(,这很容易:

@pytest.mark.parametrize("a", [
1,
pytest.param(2, marks=[pytest.mark.skip]),
])
def test_a(a):
assert a == 1

如果确实需要使用表达式,那么我认为最好的方法是编写一个自定义的pytest_runtest_setup钩子。这个钩子可以访问每个测试的标记和参数,所以它是实现所需逻辑的好地方。基本思想是从自定义标记中获得跳过条件,在参数的上下文中评估该条件,然后根据结果跳过:

# conftest.py
import pytest
def pytest_runtest_setup(item):
skip_funcs = [
mark.args[0]
for mark in item.iter_markers(name='parametrize_skip_if')
]
if any(f(**item.callspec.params) for f in skip_funcs):
pytest.skip()
# test_file.py
@pytest.mark.parametrize("b", [1, 2])
@pytest.mark.parametrize_skip_if(lambda b: b == 2)
def test_b(b):
assert b == 1

相关内容

  • 没有找到相关文章

最新更新