例子:
from pytest import fixture, skip
@fixture(params=['a', 'b'])
def f1(request):
yield request.param
params = [('a', 1), ('a', 2), ('b', 10), ('b', 20)]
@fixture(params=params, ids=[str(x) for x in params])
def f2(f1, request):
if request.param[0] == f1:
yield request.param[1]
else:
skip('invalid')
def test_foo(f1, f2):
return
Run Code Online (Sandbox Code Playgroud)
那是一个“基础”装置f1。然后,“堆叠”灯具f2应该产生价值(1, 2)的f1='a'价值观和(10, 20)对f1='b'
给出:
a.py::test_foo[a-('a', 1)] PASSED
a.py::test_foo[a-('a', 2)] PASSED
a.py::test_foo[a-('b', 10)] SKIPPED
a.py::test_foo[a-('b', 20)] SKIPPED
a.py::test_foo[b-('a', 1)] SKIPPED
a.py::test_foo[b-('a', 2)] SKIPPED
a.py::test_foo[b-('b', 10)] PASSED
a.py::test_foo[b-('b', 20)] PASSED
Run Code Online (Sandbox Code Playgroud)
这接近我想要实现的目标,除了我想改进这个
f1夹具。理想情况下像<f1-value><separator><f2-value>like a-2, b-10, 等等。有一种使用参数化的解决方法:
a.py::test_foo[a-('a', 1)] PASSED
a.py::test_foo[a-('a', 2)] PASSED
a.py::test_foo[a-('b', 10)] SKIPPED
a.py::test_foo[a-('b', 20)] SKIPPED
a.py::test_foo[b-('a', 1)] SKIPPED
a.py::test_foo[b-('a', 2)] SKIPPED
a.py::test_foo[b-('b', 10)] PASSED
a.py::test_foo[b-('b', 20)] PASSED
Run Code Online (Sandbox Code Playgroud)
然而,这并不是真正的解决方案,因为它仅适用于相对简单和隔离的设置。它崩溃的地方f1是在许多测试用例中使用基础夹具时,并且有其他夹具f1_n仅堆叠在顶部,f1例如:
@pytest.mark.parametrize(params=('f1,f2', (('a', 1), ('b', 10))))
def test_foo():
return
Run Code Online (Sandbox Code Playgroud)
此时,使用参数化解决方法会导致重复并损害其他堆叠装置的可重用性。
https://docs.pytest.org/en/latest/parametrize.html
f2_vals = {'a': (1,2), 'b': (10,20)}
def pytest_generate_tests(metafunc):
if "f2" in metafunc.fixturenames:
assert "f1" in metafunc.fixturenames
metafunc.parametrize("f2", f2_vals[get_f1_val()])
Run Code Online (Sandbox Code Playgroud)
但是我不知道如何实现get_f1_val并且对这种方法几乎没有信心,因为 pytest 似乎分阶段运行,首先收集测试用例然后执行它们。
目前,https://github.com/pytest-dev/pytest/issues/3730 上的功能请求仅解决了从测试会话结果中删除无效测试用例组合的部分。
为您的替代方案 2 进一步努力:
f2_vals = {'a': (1,2), 'b': (10,20)}
params = [(key, value) for key in f2_vals for value in f2_vals[key]]
@pytest.mark.parametrize("f1, f2", params)
def test_foo(f1, f2):
return
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
292 次 |
| 最近记录: |