How to keep Unit tests and Integrations tests separate in pytest How to keep Unit tests and Integrations tests separate in pytest python python

How to keep Unit tests and Integrations tests separate in pytest


Yes, you can mark tests with the pytest.mark decorator.

Example:

def unit_test_1():    # assert heredef unit_test_2():    # assert here@pytest.mark.integtestdef integration_test():    # assert here

Now, from the command line, you can run pytest -m "not integtest" for only the unit tests, pytest -m integtest for only the integration test and plain pytest for all.

(You can also decorate your unit tests with pytest.mark.unit if you want, but I find that slightly tedious/verbose)

See the documentation for more information.


You can also structurally separate unit and integration tests into specific directories. Here is a sample file structure from A. Shaw's article Getting Started With Testing in Python:

enter image description here

With a structural approach, you:

  1. do not need to manually mark various tests with attributes or @pytest.mark.
  2. are not limited to a specific test runner. See examples below.

Examples

Here we run various test runners on integration tests alone. See the sample project/ directory in the figure above.

With unittest from the standard library:

λ python -m unittest discover -s tests/integration

With nose:

λ nose tests/integration

With pytest:

λ pytest tests/integration

Many test runners have an auto test-discovery mechanism that can find tests in sub-directories. This offers the choice to run all tests with ease, e.g.

λ cd <root_dir>λ pytest project/