Skip to main content

A pytest plugin to find dependencies between tests

Project description

PyPI version Python versions Test suite pre-commit Code coverage PyPI - Downloads

A pytest plugin to find dependencies between tests.


This pytest plugin was generated with Cookiecutter along with @hackebrot’s cookiecutter-pytest-plugin template.

Summary

Tests shall generally not depend on each other. To ensure this, plugins like pytest-randomly or pytest-reverse are commonly used. These plugins find dependent tests, but it is up to you to find which test they are depend upon.

The plugin aims to automate this task. Dependencies are found in the first place by running all tests in forward and backwards direction and checking if any tests fail if executed in one order but not in the other. This will find most (but not all) test dependencies (the same way as pytest-reverse). If any dependent test is found, more test runs with a subset of all tests are run using binary search, until a test is found that causes the other test to fail.

Installation

You can install pytest-find-dependencies via pip from PyPI:

$ pip install pytest-find-dependencies

Usage

If the plugin is installed, it can be used by adding the pytest option --find-dependencies. After running all needed tests, all found dependencies are listed. Here is an example:

=================================================
Run dependency analysis for 7 tests.
Executed 19 tests in 4 test runs.
Dependent tests:
test_one.py::test_b depends on test_one.py::test_e
=================================================

In this case 7 tests have been analyzed, one dependent test has been found after running the tests forwards and backwards, and after 2 additional test runs with an overall of 5 tests, the test it depended on was found.

Some dependencies can be due to a permanent change in the environment (for example by adding a change to a database that is not reverted in subsequent test runs). In this case, the dependency cannot be found reliably, and these tests are listed separately:

============================== Results ===============================
Run dependency analysis for 5 tests.
Executed 11 tests in 3 test runs.
Tests failing permanently after all tests have run:
test_one.py::test_b
======================================================================

Dependencies due to a permanent change will only be found if the offending test is run before the dependent test, otherwise the test will just fail both times.

Options

--run-serially

By default, the forward and reversed test runs are executed in parallel in separate processes. The option --run-serially allows to change this behavior to run all tests sequentially. This increases the overall runtime, but sometimes may reveal permanent changes not reliably found in the default mode.

--reversed-first

This option allows you to reverse the sequence of the first two test runs. Note that it only makes sense in combination with --run-serially, as per default these test runs are executed in parallel.

--fail-on-failed-tests

Per default, the dependency test only returns the exit code 1, if any dependency has been found, otherwise 0. This option changes this behavior - any failing test will also fail the dependency test (e.g. the exit code will be 1).

--markers-to-ignore

This option allows to define a comma-separated list of marker names. Tests that have these markers will be ignored in the analysis (e.g. not run at all). This can be used to exclude tests that have markers that define the test order. Examples include dependency (from the pytest-dependency plugin), order (from pytest-order) or depends (from pytest-depends). To ignore all tests with a dependency marker, you can use:

python -m pytest --find-dependencies --markers-to-ignore=dependency

Note that in this case you also won’t find other tests depending on the ordered markers.

Notes

  • command line options given in the test are passed to all test runs in dependency find mode

  • if any dependent tests are found, the exit code of the pytest run will be set to 1, see also the option --fail-on-failed-tests above

  • if pytest-xdist is detected, it is ensured that the internal tests are not distributed, as this would break the dependency check

  • if no dependent tests are found, the test will run a bit longer than the original tests (without xdist), with the option --run-serially about twice as long; with one dependent test it will take about 1.5 times as long as the original tests, and with each found dependent test it will take more time (due to more repeated tests)

Usage of ordering plugins

If you use plugins which change the test order using markers, these will only be applied in the first test run. The order of the following test runs is solely defined by pytest-find-dependencies. This means that if you use ordering plugins like pytest-order, the dependencies will still be found, if you don’t exclude these tests (which may or may not be wanted). Using pytest-randomly will randomize only the first test run and can be used in combination with pytest-find-dependencies without problems.

Contributing

Contributions are very welcome. Tests can be run with tox, please ensure the coverage at least stays the same before you submit a pull request.

License

Distributed under the terms of the MIT license, “pytest-find-dependencies” is free and open source software.

Issues

If you encounter any problems or have a feature request, please file an issue along with a detailed description.

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_find_dependencies-0.6.0.tar.gz (15.4 kB view details)

Uploaded Source

Built Distribution

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

pytest_find_dependencies-0.6.0-py3-none-any.whl (9.7 kB view details)

Uploaded Python 3

File details

Details for the file pytest_find_dependencies-0.6.0.tar.gz.

File metadata

  • Download URL: pytest_find_dependencies-0.6.0.tar.gz
  • Upload date:
  • Size: 15.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for pytest_find_dependencies-0.6.0.tar.gz
Algorithm Hash digest
SHA256 4fe28781d4478b01bd52baac3d77a2cba5f8441a420e847059bbaadad86aab64
MD5 e37ca0ab2e9a59615de8ef001302da45
BLAKE2b-256 5e8a378f07e9fe4779622d6cac934c98b133ec3f376a49f82b0b88cecb0aa3a5

See more details on using hashes here.

File details

Details for the file pytest_find_dependencies-0.6.0-py3-none-any.whl.

File metadata

File hashes

Hashes for pytest_find_dependencies-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6aa3f612742e5b3d6e7bf265943b3997f9b9d3f5e89ef75f944c597fbc590426
MD5 9841842f3e375c1f8d182b66a46f4586
BLAKE2b-256 d8c845d6fd35753ae290a5d3b7627c38370d1232f9d577f8cea8e54ec573fab5

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