Home [python] Mastering Unit Testing in Python with pytest
Post
Cancel

[python] Mastering Unit Testing in Python with pytest

Intro

Introduction

Unit testing is an essential practice in software development where individual units of source code are tested to ensure they function correctly in isolation. In Python, one popular tool for unit testing is pytest, which provides a simple and flexible way to write test cases. In this blog post, we will dive into the world of unit testing in Python using pytest and explore its features and capabilities.

Setting up pytest

Before getting started with writing test cases using pytest, you need to install the pytest library. You can do this using pip by running the following command:

1
pip install pytest

Writing your first test case

Let’s start by writing a simple test case using pytest. Create a new Python file and import the pytest module at the beginning of the file. Then, define a test function that begins with the prefix test_. Here’s an example of a basic test case to check if the add function correctly adds two numbers:

1
2
3
4
5
6
7
import pytest

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

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

Running pytest

You can run the test cases using the pytest command in the terminal. Just navigate to the directory containing your test files and run:

1
pytest

pytest will automatically discover and run all the test cases in your project, providing detailed output about the tests that passed or failed.

Advanced features of pytest

pytest offers many advanced features that make it a powerful tool for unit testing in Python. Some of these features include fixtures, parameterized tests, and test markers. Fixtures allow you to set up preconditions for your tests, while parameterized tests enable you to run the same test with multiple sets of inputs. Test markers provide a way to categorize and run specific test cases based on certain criteria.

Using fixtures in pytest

Fixtures in pytest are reusable setup and teardown functions that can be shared across multiple test cases. You can define fixtures using the @pytest.fixture decorator and use them by including them as arguments in your test functions. Here’s an example of using a fixture to set up a database connection for your test cases:

1
2
3
4
5
6
7
8
9
10
import pytest

@pytest.fixture
def db_connection():
    # set up the database connection
    yield
    # close the database connection

def test_query(db_connection):
    # test case that uses the database connection

Parameterized tests with pytest

Parameterized tests allow you to run the same test logic with different inputs, making your test suite more efficient and readable. You can use the @pytest.mark.parametrize decorator to define the inputs and expected outputs for a parameterized test. Here’s an example of a parameterized test for the multiply function:

1
2
3
4
5
6
7
8
9
10
11
12
import pytest

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

@pytest.mark.parametrize("a, b, expected", [
    (2, 3, 6),
    (5, 5, 25),
    (0, 10, 0),
])
def test_multiply(a, b, expected):
    assert multiply(a, b) == expected

Conclusion

In conclusion, pytest is a versatile and easy-to-use tool for writing unit tests in Python. By following the best practices and leveraging the advanced features of pytest, you can create a robust test suite that ensures the reliability and correctness of your code. Start incorporating unit testing with pytest into your workflow to improve the quality of your Python projects. Happy testing!

This post is licensed under CC BY 4.0 by the author.
Contents