Introduction
Pytest is primarily known for unit testing, but it also supports performance and benchmark testing through the pytest-benchmark plugin. This article demonstrates how to set up and execute performance tests using this powerful combination.
Prerequisites
Ensure you have Python installed along with pytest and the pytest-benchmark plugin. Install the required packages using pip:
pip install pytest pytest-benchmark
Creating the Function Under Test
First, create a function that you want to measure for performance. This could be any operation that needs benchmarking:
import time
def data_processing(delay=0.0001):
"""Simulates a data processing operation with a configurable delay."""
time.sleep(delay)
return "processing_complete"
This function simulates a processing task with an optional delay paramter for testing purposes.
Writing Performance Tests
Create a test file and write performance test functions using the benchmark fixture provided by pytest-benchmark:
import pytest
from your_module import data_processing
def test_data_processing_performance(benchmark):
"""Benchmark the data processing function."""
result = benchmark(data_processing, 0.0001)
assert result == "processing_complete"
The benchmark fixture automatically handles multiple executions and calculates statistics. Pass your function and its arguments directly to the benchmark callable.
Runing the Tests
Execute the performance tests using the standard pytest command:
pytest -v
The -v flag enables verbose output to see detailed results for each test.
Interpreting Results
After running the tests, the console displays comprehensive statistics. Here's what each colum represents:
- name: Identifier for each test function
- min: Fastest execution time observed across all runs
- max: Slowest execution time observed across all runs
- mean: Average execution time across all iterations
- stddev: Standard deviation indicating consistency of execution times
- median: Middle value when all execution times are sorted
- IQR: Interquartile range measuring statistical dispersion
- outliers: Number of anomalous measurements outside normal range
- OPS: Operations per second (higher is better)
- rounds: Total number of test execution cycles
- iterations: Number of times the function executes within each round
Use these metrics to compare different implementations and identify performance bottlenecks. Iterate on your code based on the results and re-run tests to verify improvements.