Unit Testing in Python with pytest: A Comprehensive Guide

Master Unit Testing and TDD Using pytest

Learn how to effectively perform unit testing in Python using pytest. This comprehensive guide covers the basics of pytest, real-world examples, and test-driven development (TDD) practices to help you write robust, maintainable code.

Programming
Author
Affiliation
Published

February 8, 2024

Modified

February 9, 2025

Keywords

pytest tutorial, unit testing in Python, Python TDD, pytest examples, test-driven development Python

Introduction

Unit testing is an essential part of building robust, maintainable software. By writing tests for individual units of code, you ensure that your functions behave as expected and can catch bugs early in the development process. In this guide, we’ll introduce you to pytest—a powerful testing framework for Python—and demonstrate how to write tests, adopt test-driven development (TDD) practices, and incorporate real-world examples into your workflow.



Why Unit Testing and TDD?

Testing helps you catch errors early and gives you the confidence to refactor code without breaking functionality. Test-Driven Development (TDD) takes this further by writing tests before the code itself, guiding your design and ensuring a robust codebase.

Getting Started with pytest

Installing pytest

To get started, install pytest using pip:

pip install pytest

Writing Your First Test

Let’s create a simple function and write a test for it. Suppose we have an add function:

def add(a, b):
    return a + b

Now, create a test for this function:

def test_add():
    assert add(2, 3) == 5
    assert add(-1, 1) == 0

To run the test, execute pytest in your terminal.

Test-Driven Development (TDD) with pytest

TDD involves writing tests before writing the code. Here’s a simple workflow:

  1. Write a test that defines a function’s desired behavior.
  2. Run the test to see it fail.
  3. Write the minimal code necessary to pass the test.
  4. Refactor the code if necessary, and repeat.

Example: TDD Workflow

Suppose we need a function multiply that multiplies two numbers. We start by writing a test:

def test_multiply():
    assert multiply(3, 4) == 12
    assert multiply(-2, 5) == -10

Run pytest, and you’ll see the test fail because multiply is not defined. Now, implement the function:

def multiply(a, b):
    return a * b

Re-run pytest to ensure the test passes.

Advanced pytest Features

Parameterized Tests

pytest allows you to run a test function with different sets of inputs using the @pytest.mark.parametrize decorator.

#| label: parameterized-tests, code-fold: true
import pytest

@pytest.mark.parametrize("a,b,expected", [
    (2, 3, 6),
    (5, 5, 25),
    (-1, 8, -8),
])
def test_multiply_param(a, b, expected):
    assert multiply(a, b) == expected

Fixtures

Fixtures in pytest allow you to set up data or state before running tests and clean up afterward.

import pytest

@pytest.fixture
def sample_data():
    return [1, 2, 3, 4, 5]

def test_sum(sample_data):
    assert sum(sample_data) == 15

Best Practices for Unit Testing

  • Write Tests for Every Function:
    Ensure that every unit of your code has corresponding tests.
  • Keep Tests Independent:
    Tests should not depend on each other; each test should set up its own context.
  • Use Descriptive Test Names:
    Clearly name your test functions so that failures are easy to diagnose.
  • Leverage Fixtures and Parameterization:
    Use these features to write cleaner and more efficient tests.
  • Run Tests Frequently:
    Integrate testing into your development process to catch issues early.

Conclusion

By adopting pytest and TDD practices, you can build a robust testing suite that improves code quality and reliability. This guide has introduced you to the basics of writing tests, creating fixtures, parameterizing tests, and following TDD workflows in Python. With these tools, you’ll be better equipped to maintain and scale your projects.

Further Reading

Happy testing, and enjoy building reliable Python applications with pytest!

Back to top

Reuse

Citation

BibTeX citation:
@online{kassambara2024,
  author = {Kassambara, Alboukadel},
  title = {Unit {Testing} in {Python} with Pytest: {A} {Comprehensive}
    {Guide}},
  date = {2024-02-08},
  url = {https://www.datanovia.com/learn/programming/python/tools/pytest-unit-testing.html},
  langid = {en}
}
For attribution, please cite this work as:
Kassambara, Alboukadel. 2024. “Unit Testing in Python with Pytest: A Comprehensive Guide.” February 8, 2024. https://www.datanovia.com/learn/programming/python/tools/pytest-unit-testing.html.