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

Resources