Отметьте ввод параметров pytest parametrize

У меня есть тест, который я хотел бы запустить как часть двух различных наборов тестов с различными входами параметров на основе набора тестов. Набор тестов идентифицирован с помощью маркеров pytest.

Есть ли способ отметить записи параметризации, чтобы они выполнялись только в этом конкретном наборе тестов?

Вот что я хотел бы сделать:

@pytest.mark.suiteA # include the test in Suite A
@pytest.mark.suiteB # include the test in Suite B
@pytest.mark.parametrize("inputParameter", [
 (10), # use this input for Suites A and B
 pytest.mark.suiteB(12)]) # only use this input for Suite B
def test_printInputParameter(inputParameter):
 print inputParameter

Запуск кода, подобного этому, не приводит к результатам я want--, оба входа используются для обоих наборов.

Я видел, что pytest позволит использовать xfail или пропустить в параметризе (см. "Skip/xfail с параметризацией" на http://pytest.org/latest/skipping.html). Если есть способ написать условное утверждение, которое будет оценивайте как истинный только при запуске Suite B, который также выполнит то, что мне нужно.

Заранее спасибо за помощь.

1 ответ

Похоже, вы можете сделать это с помощью знака skipif, как описано в http://pytest.org/latest/skipping.html#skip-xfail-with-parametrize (о котором вы говорите). Все, что вам нужно сделать, это иметь способ узнать, работает ли ваш код в SuiteA или SuiteB, который вы, вероятно, уже имеете с тех пор, как у вас есть suiteA и SuiteB. Таким образом, для примера допустим установить (уродливый) вспомогательный атрибут в модуле sys аналогично тому, как вы это сделали бы, чтобы определить, работает ли ваш код под py.test:

# E.g. in conftest.py; in real life the value probably comes from a
# command line option added by pytest_addoption()
def pytest_configure(config):
 sys._my_test_suite = 'A' # or 'B'

# The actual test can now use this in skipif
@pytest.mark.suiteA # include the test in Suite A
@pytest.mark.suiteB # include the test in Suite B
@pytest.mark.parametrize(
 "inputParameter",
 [(10), pytest.mark.skipif(sys._my_test_suite == 'A', reason='suite A only')(12)])])
def test_printInputParameter(inputParameter):
 print inputParameter

Да, установка атрибута в модуле sys является уродливым взломом, но это простое решение для этого случая.

licensed under cc by-sa 3.0 with attribution.