pytest
Origin and Evolution
The pytest
project was initially created by Holger Krekel in 2004. At its inception, pytest
aimed to provide a more agile and less verbose testing framework compared to what was available at the time, such as Python’s built-in unittest
module. Krekel sought to create a tool that would support simple test writing, with the ability to scale up to support complex functional testing for applications and libraries.
Key Features and Philosophy
pytest
introduced several innovative features that set it apart from other testing frameworks. Its use of simple assert statements, without requiring special syntax, made tests more readable and intuitive. The framework’s powerful fixture model provided a flexible approach to setup and teardown operations, enhancing test modularity and reuse. Additionally, pytest
offered extensive support for parameterised testing, allowing developers to easily execute a test function with different input values.
The philosophy behind pytest
has always been to facilitate easy test writing and execution, promoting test-driven development (TDD) and behavior-driven development (BDD) methodologies. Its design principles include minimal boilerplate code, the ability to run tests in parallel, and a rich plugin architecture.
Cookbook
Run specific tests
Run all tests in a project
$ pytest
Run tests in a Single Directory
To run all the tests from one directory, use the directory as a parameter to
pytest
:
$ pytest tests/my-directory
Run tests in a Single Test File/Module
To run a file full of tests, list the file with the relative path as a parameter to pytest
:
$ pytest tests/my-directory/test_demo.py
Run a Single Test Function
To run a single test function, add ::
and the test function name:
$ pytest -v tests/my-directory/test_demo.py::test_specific_function
-v
is used so you can see which function was run.
Run a Single Test Class
To run just a class, do like we did with functions and add ::
, then the class name to the file parameter:
$ pytest -v tests/my-directory/test_demo.py::TestClassName
Run a Single Test Method of a Test Class
If you don’t want to run all of a test class, just one method, just add
another ::
and the method name:
pytest -v tests/my-directory/test_demo.py::TestClassName::test_specific_method
Run a Set of Tests Based on Test Name
The -k
option enables you to pass in an expression to run tests that have
certain names specified by the expression as a substring of the test name.
It is possible to use and, or, and not to create complex expressions.
For example, to run all of the functions that have _raises
in their name:
$ pytest -v -k _raises