How to keep Unit tests and Integrations tests separate in pytest
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:
With a structural approach, you:
- do not need to manually mark various tests with attributes or
@pytest.mark
. - 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/
Yes, you can mark tests with the pytest.mark
decorator.
Example:
def unit_test_1():
# assert here
def unit_test_2():
# assert here
@pytest.mark.integtest
def 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.