跳过参数化组合

Skipping a parametrized combination

我正在 python2.7 中编写测试,测试方法接收两个参数。

@pytest.mark.parametrize("letter", [
    "A", "B", "C"])
@pytest.mark.parametrize("number", [
    1, 2, 3])
def my_test(letter, number):
    if letter == "B" and number == 2:
        pytest.skip("redundant")

我需要跳过一个多余的组合,比方说 (B, 2)。唯一的“工作”解决方案导致调用 setup_methods 这是无用的。是否有更优雅的解决方案来跳过组合而无需编写额外的“if”条件并且无需访问 setup_method ?

除了你的解决方案,我唯一会看到的选择是自己写下所有可能的组合并注释掉或删除所有多余的组合(这可能更明确一点):

@pytest.mark.parametrize("letter,number", [
    ("A", 1),
    ("A", 2),
    ("A", 3),
    ("B", 1),
    # ("B", 2),
    ("B", 3),
    ("C", 1),
    ("C", 2),
    ("C", 3),
])
def test_foo(letter, number):
    assert something...

这样你就省去了 if,但我喜欢你的解决方案,因为 pytest 会产生一个很好的输出,告诉你哪个/哪个组合被跳过了:

============================= test session starts ==============================
collecting ... collected 9 items

Whosebug.py::test[1-A] PASSED                                       [ 11%]
Whosebug.py::test[1-B] PASSED                                       [ 22%]
Whosebug.py::test[1-C] PASSED                                       [ 33%]
Whosebug.py::test[2-A] PASSED                                       [ 44%]
Whosebug.py::test[2-B] SKIPPED                                      [ 55%]
Skipped: redundant

Whosebug.py::test[2-C] PASSED                                       [ 66%]
Whosebug.py::test[3-A] PASSED                                       [ 77%]
Whosebug.py::test[3-B] PASSED                                       [ 88%]
Whosebug.py::test[3-C] PASSED                                       [100%]

========================= 8 passed, 1 skipped in 0.07s =========================

我想在这种情况下这是一个主观决定。两种选择都有其优点和缺点。