pytest-reverse icon indicating copy to clipboard operation
pytest-reverse copied to clipboard

Pytest plugin to reverse test order.

============== pytest-reverse

.. image:: https://img.shields.io/github/actions/workflow/status/adamchainz/pytest-reverse/main.yml.svg?branch=main&style=for-the-badge :target: https://github.com/adamchainz/pytest-reverse/actions?workflow=CI

.. image:: https://img.shields.io/pypi/v/pytest-reverse.svg?style=for-the-badge :target: https://pypi.org/project/pytest-reverse/

.. image:: https://img.shields.io/badge/code%20style-black-000000.svg?style=for-the-badge :target: https://github.com/psf/black

.. image:: https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white&style=for-the-badge :target: https://github.com/pre-commit/pre-commit :alt: pre-commit

Pytest plugin to reverse test order.


Testing a Django project? Check out my book Speed Up Your Django Tests <https://adamchainz.gumroad.com/l/suydt>__ which covers loads of recommendations to write faster, more accurate tests. I created pytest-reverse whilst working on the book!


Installation

Install with:

.. code-block:: bash

python -m pip install pytest-reverse

Python 3.8 to 3.12 supported.

Usage

Pytest will automatically find the plugin and use it when you run pytest. You can reverse test order by passing the --reverse flag:

.. code-block:: bash

pytest --reverse

You can make this always apply by adding it to the addopts setting in your pytest.ini (or other configuration file <https://docs.pytest.org/en/latest/customize.html#adding-default-options>__):

.. code-block:: ini

[pytest]
addopts = --reverse

History

I'm the creator and maintainer of pytest-randomly <https://github.com/pytest-dev/pytest-randomly>, a plugin for randomly ordering tests. @thbde opened an issue there pointing to the paper Empirically revisiting the test independence assumption <https://dl.acm.org/doi/10.1145/2610384.2610404>, which covers test reordering techniques. It turns out that reversal is nearly as effective as randomization.

Test reversal is available in Django's test runner <https://docs.djangoproject.com/en/dev/ref/django-admin/#cmdoption-test-reverse>__. I figured such an option or plugin would exist for pytest already, but it didn't, so I made it here.