Pytest - skip (xfail) смешанный с параметризацией

есть ли способ использовать плагин @incremental, как описано att Pytest: как пропустить остальные тесты в классе, если один из них не прошел? в сочетании с @ pytest.mark.parametrize, как показано ниже :

@pytest.mark.incremental
Class TestClass:
  @pytest.mark.parametrize("input", data)
  def test_preprocess_check(self,input):
    # prerequisite for test

  @pytest.mark.parametrize("input",data)
  def test_process_check(self,input):
    # test only if test_preprocess_check succeed

Проблема, с которой я столкнулся, заключается в том, что при первом сбое test_preprocess_check с заданным вводом моего набора данных следующие test_preprocess_check и test_process_check помечаются как " xfail ". Я ожидаю, что при каждом новом «входе» моего параметризованного набора данных тест будет действовать постепенно.

пример: данные = [0,1,2]

если не удалось выполнить только test_preprocess_check (0):

я получил следующий отчет: 1 неудачный, 5 xfailed

но я ожидаю отчета: 1 неудачно, 1 xfailed, 4 прошло

Спасибо


person Floghi    schedule 16.12.2015    source источник


Ответы (1)


После некоторых экспериментов я нашел способ обобщить @incremental для работы с аннотацией параметризация. Просто перепишите аргумент _previousfailed, чтобы сделать его уникальным для каждого ввода. Аргумент _genid был как раз необходимостью.

Для этого я добавил @ pytest.mark.incrementalparam.

Код становится:

def pytest_runtest_setup(item):

    previousfailed_attr = getattr(item, "_genid",None)
    if previousfailed_attr is not None:
        previousfailed = getattr(item.parent, previousfailed_attr, None)
        if previousfailed is not None:
            pytest.xfail("previous test failed (%s)" %previousfailed.name)

    previousfailed = getattr(item.parent, "_previousfailed", None)
    if previousfailed is not None:
        pytest.xfail("previous test failed (%s)" %previousfailed.name)

def pytest_runtest_makereport(item, call): 

    if "incrementalparam" in item.keywords: 
        if call.excinfo is not None:
            previousfailed_attr = item._genid
            setattr(item.parent,previousfailed_attr, item)

    if "incremental" in item.keywords:
        if call.excinfo is not None:
            parent = item.parent
            parent._previousfailed = item

Интересно отметить, что его нельзя использовать без параметризации, потому что аннотация параметризации автоматически создает переменную _genid.

Надеюсь, это поможет другим, кроме меня.

person Floghi    schedule 16.12.2015
comment
позаботьтесь о том, чтобы _genid состоял из вашего набора входных данных и, таким образом, мог привести к недопустимому имени переменной, сопоставление его со 100% допустимым именем переменной могло бы избежать некоторых проблем - person Floghi; 18.12.2015