Package: pytest-depends
pytest-dependsThis pytest plugin allows you to declare dependencies between pytest tests, where dependent tests will not run if the
tests they depend on did not succeed.Of course, tests should be self contained whenever possible, but that doesn't mean this doesn't have good uses.This can be useful for when the failing of a test means that another test cannot possibly succeed either, especially
with slower tests. This isn't a dependency in the sense of test A sets up stuff for test B, but more in the sense of if
test A failed there's no reason to bother with test B either.InstallationSimply install usingpip(oreasy_install):pip install pytest-dependsUsageBUILD_PATH='build'deftest_build_exists():assertos.path.exists(BUILD_PATH)@pytest.mark.depends(on=['test_build_exists'])deftest_build_version():result=subprocess.run([BUILD_PATH,'--version'],stdout=subprocess.PIPE)assertresult.returncode==0assert'1.2.3'inresult.stdoutThis is a simple example of the situation mentioned earlier. In this case, the first test checks whether the build file
even exists. If this fails, the other test will not be ran, as there is no point in doing to.OrderThis plugin will automatically re-order the tests so that tests are run after the tests they depend on. If another
plugin also reorders tests (such aspytest-randomly), this may cause problems, as dependencies that haven't ran yet
are considered failures.This plugin attempts to make sure it runs last to prevent this issue, but there are no guarantees this is successful. If
you run into issues with this in combination with another plugin, feel free to open an issue.NamingThere are multiple ways to refer to each test. Let's start with an example, which we'll calltest_file.py:classTestClass(object):@pytest.mark.depends(name='foo')deftest_in_class(self):pass@pytest.mark.depends(name='foo')deftest_outside_class():passdeftest_without_name(num):passThetest_in_classtest will be available under the following names:test_file.py::TestClass::test_in_classtest_file.py::TestClasstest_file.pyfooThetest_outside_classtest will be available under the following names:test_file.py::test_outside_classtest_file.pyfooThetest_without_nametest will be available under the following names:test_file.py::test_without_nametest_file.pyNote how some names apply to multiple tests. Depending onfooin this case would mean depending on bothtest_in_classandtest_outside_class, and depending ontest_file.pywould mean depending on all 3 tests in this
file.Another example, with parametrization. We'll call this onetest_params.py:@pytest.mark.depends(name='bar')@pytest.mark.parametrize('num',[pytest.param(1,marks=pytest.mark.depends(name='baz')),2,])deftest_with_params(num):passThe first run of the test, withnum = 1, will be available under the following names:test_params.py::test_with_params[num0]test_params.py::test_with_paramstest_params.pybarbazThe second run of the test, withnum = 2, will be available under the following names:test_params.py::test_with_params[num1]test_params.py::test_with_paramstest_params.pybarNote that the first name has a partially autogenerated name. If you want to depend on a single instance of a
parametrized test, it's recommended to use thepytest.dependssyntax to give it a name rather than depending on the
autogenerated one.