Posted by Kosal
pytest is a popular testing framework for Python that makes writing and running unit tests easier and more efficient. Here's a guide on how to use pytest to unit test your Python code:
Installation:
First, you need to install pytest if you haven't already done so. You can install it via pip:
pip install pytest
Writing Test Functions:
Create a Python file for your tests, typically named test_<module_name>.py. In this file, write test functions using the naming convention test_<something>.
# test_my_module.py
def test_addition():
assert 1 + 1 == 2
def test_subtraction():
assert 5 - 3 == 2
Running Tests:
To run tests, simply execute pytest in the terminal in the directory containing your test files:
pytest
pytest will automatically discover and execute your test functions.
Output:
===================== test session starts ======================
platform win32 -- Python 3.12.1, pytest-8.1.1, pluggy-1.4.0
rootdir: C:\Users\kosal\code\python\test\pytest
collected 2 items
test_my_module.py .. [100%]
====================== 2 passed in 0.02s =======================
Assertions:
Use Python's assert statement inside test functions to check if certain conditions are met. If the condition is False, the test will fail.
Fixtures:
Fixtures are functions that provide data to your tests. They are defined using the @pytest.fixture decorator.
import pytest
@pytest.fixture
def setup_data():
data = {'name': 'John', 'age': 30}
return data
def test_data(setup_data):
assert setup_data['name'] == 'John'
assert setup_data['age'] == 30
Parameterized Tests:
You can create parameterized tests using the @pytest.mark.parametrize decorator.
import pytest
@pytest.mark.parametrize('a, b, expected', [(1, 1, 2), (2, 3, 5), (5, 5, 10)])
def test_addition(a, b, expected):
assert a + b == expected
Skipping Tests:
You can skip certain tests under specific conditions using the @pytest.mark.skip decorator.
import pytest
@pytest.mark.skip(reason="Test not implemented yet")
def test_some_feature():
...
Assertions and Exceptions:
You can also test for exceptions using context managers.
import pytest
def test_exception():
with pytest.raises(ValueError):
raise ValueError
Coverage Reporting:
You can generate test coverage reports using pytest-cov plugin.
pip install pytest-cov
Run tests with coverage:
pytest --cov=my_module
These are the basic steps to get started with pytest for unit testing your Python code. pytest offers many more features and plugins for advanced testing scenarios. You can refer to the official documentation for more details and advanced usage.