[英]Skip parametrized tests generated by pytest_generate_tests at module level
[英]How to skip parametrized tests with 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
。
可以做到这一点,尽管这取决于你想要什么,它可能需要一些工作。
如果您只需要跳过特定的参数集(即,如果您不需要使用表达式来确定要跳过哪些参数集),这很容易:
@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
如果您创建自己的方法,则检查测试收集时间中的值
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)
Output
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)
Output
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.