Может ли pytest выполнить тест, если другой не удастся? - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть ситуация, когда я могу сделать очень быструю проверку достоверности для всего объекта, и если эта проверка пройдет, объект гарантированно будет исправен.Если это не удается, мне нужно определить аспекты, которые являются проблематичными, с помощью проверок, требующих значительных затрат времени.

Я надеялся на что-то вроде: "@ pytest.mark.dependency (зависимость = [" test_a "])" за исключением того, что вместо этогоработать только в случае успеха, он будет работать только в случае ошибки.

1 Ответ

0 голосов
/ 30 ноября 2018

Как вы правильно указали, pytest-dependency не может обработать ваше дело, потому что оно пропускает тесты в случае неудачи, а не в случае успеха.Тем не менее, с некоторыми настройками этого плагина, вы можете получить желаемый результат.Пример:

# conftest.py

import pytest
from pytest_dependency import DependencyManager


def pytest_collection_modifyitems(session, config, items):
    modules = (item.getparent(pytest.Module) for item in items)
    marked_modules = {m for m in modules if m.get_closest_marker('depend_on_failures')}
    for module in marked_modules:
        module.dependencyManager = FailureDepManager()


class FailureDepManager(DependencyManager):

    def checkDepend(self, depends, item):
        for i in depends:
            if i in self.results:
                if self.results[i].isSuccess():
                    pytest.skip('%s depends on failures in %s' % (item.name, i))
                    break

FailureDepManager - это пользовательская версия pytest-dependency DependencyManager, которая будет пропускать зависимые тесты только в случае успешного завершения зависимости (имеет результат passed или XPASS).К сожалению, такое поведение может быть запущено только для каждого модуля, так как это текущее ограничение плагина (см. этот вопрос для получения более подробной информации об этом).Пример использования:

import pytest

pytestmark = pytest.mark.depend_on_failures


@pytest.mark.dependency()
@pytest.mark.xfail(reason='simulate failing test')
def test_foo():
    assert False


@pytest.mark.dependency(depends=['test_foo'])
def test_bar():
    assert True

Из-за отметки depend_on_failures на уровне модуля test_bar теперь будет работать, если test_foo завершится ошибкой:

================================== test session starts ==================================
platform linux -- Python 3.7.0, pytest-4.0.1, py-1.7.0, pluggy-0.8.0
...
plugins: dependency-0.3.2
collected 2 items                                                                           

test_spam.py::test_foo xfail
test_spam.py::test_bar PASSED

========================== 1 passed, 1 xfailed in 0.08 seconds ==========================
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...