Как вы правильно указали, 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 ==========================