Skip to main content

Tests that depend on other tests

Project description

pytest-depends

This 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.

Installation

Simply install using pip (or easy_install):

pip install pytest-depends

Usage

BUILD_PATH = 'build'

def test_build_exists():
    assert os.path.exists(BUILD_PATH)

@pytest.mark.depends(on=['test_build_exists'])
def test_build_version():
    result = subprocess.run([BUILD_PATH, '--version'], stdout=subprocess.PIPE)
    assert result.returncode == 0
    assert '1.2.3' in result.stdout

This 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.

Order

This 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 as pytest-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.

Naming

There are multiple ways to refer to each test. Let's start with an example, which we'll call test_file.py:

class TestClass(object):
    @pytest.mark.depends(name='foo')
    def test_in_class(self):
        pass

@pytest.mark.depends(name='foo')
def test_outside_class():
    pass

def test_without_name(num):
    pass

The test_in_class test will be available under the following names:

  • test_file.py::TestClass::test_in_class
  • test_file.py::TestClass
  • test_file.py
  • foo

The test_outside_class test will be available under the following names:

  • test_file.py::test_outside_class
  • test_file.py
  • foo

The test_without_name test will be available under the following names:

  • test_file.py::test_without_name
  • test_file.py

Note how some names apply to multiple tests. Depending on foo in this case would mean depending on both test_in_class and test_outside_class, and depending on test_file.py would mean depending on all 3 tests in this file.

Another example, with parametrization. We'll call this one test_params.py:

@pytest.mark.depends(name='bar')
@pytest.mark.parametrize('num', [
    pytest.param(1, marks=pytest.mark.depends(name='baz')),
    2,
])
def test_with_params(num):
    pass

The first run of the test, with num = 1, will be available under the following names:

  • test_params.py::test_with_params[num0]
  • test_params.py::test_with_params
  • test_params.py
  • baz

The second run of the test, with num = 2, will be available under the following names:

  • test_params.py::test_with_params[num1]
  • test_params.py::test_with_params
  • test_params.py
  • bar

Note that that version that got its own mark with pytest.depends doesn't have bar as name. This is because this completely replaces the depends mark for this test. If you want it to also have bar as name, do the following instead:

pytest.param(1, marks=pytest.mark.depends(name=['bar', 'baz']))

Also note 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 the pytest.depends syntax to give it a name rather than depending on the autogenerated one.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pytest-depends-1.0.0.tar.gz (8.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pytest_depends-1.0.0-py3-none-any.whl (10.1 kB view details)

Uploaded Python 3

File details

Details for the file pytest-depends-1.0.0.tar.gz.

File metadata

  • Download URL: pytest-depends-1.0.0.tar.gz
  • Upload date:
  • Size: 8.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/46.1.3 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.7.4

File hashes

Hashes for pytest-depends-1.0.0.tar.gz
Algorithm Hash digest
SHA256 e172bfdc621057467630f1d6ff4949d257b8b265c2de660efe07f1cbf2e59b71
MD5 2e9aeff1db47ea6460c2e4336ad7f132
BLAKE2b-256 496ad2c3c761214a756b6911c9861130f6e36da50122f50f4b1a21aa410946c9

See more details on using hashes here.

File details

Details for the file pytest_depends-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: pytest_depends-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 10.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/46.1.3 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.7.4

File hashes

Hashes for pytest_depends-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 14aa546d0cee28fc4da35aa1568210eabbe8b17af7863b9cc980ed1742d56aaf
MD5 836eac4d72ddd92028aef4e026db1772
BLAKE2b-256 b3985c7fdfd8d6001da9efd7ff4f0f9f4e9fdd5b2d7c94af97a936c50c74b7a2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page