Ad – 728Γ—90
βœ… Real-World

Python Testing – unittest & pytest

Tests catch bugs before users do. Python offers unittest (standard library) and pytest (industry standard). Learn fixtures, mocking, and coverage.

⏱️ 20 min read🎯 Real-WorldπŸ“… Updated 2026

unittest – Standard Library

Python
import unittest

def divide(a, b):
    if b == 0:
        raise ValueError("Cannot divide by zero")
    return a / b

class TestMath(unittest.TestCase):
    def test_divide_normal(self):
        self.assertAlmostEqual(divide(10, 3), 3.333, places=3)

    def test_divide_zero(self):
        with self.assertRaises(ValueError):
            divide(10, 0)

if __name__ == "__main__":
    unittest.main()

pytest – Industry Standard

Python
import pytest

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

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

@pytest.mark.parametrize("a,b,expected", [
    (2, 3, 5),
    (-1, 1, 0),
    (0, 0, 0),
])
def test_add_parametrize(a, b, expected):
    assert add(a, b) == expected

Fixtures

Python
import pytest
import sqlite3

@pytest.fixture
def db():
    conn = sqlite3.connect(":memory:")
    conn.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)")
    yield conn
    conn.close()

def test_insert(db):
    db.execute("INSERT INTO users VALUES (1, 'Alice')")
    result = db.execute("SELECT name FROM users").fetchone()
    assert result[0] == "Alice" 

Mocking

Python
from unittest.mock import patch, MagicMock
import requests

def fetch_user(user_id):
    resp = requests.get(f"https://api.example.com/users/{user_id}")
    return resp.json()

def test_fetch_user():
    with patch("requests.get") as mock_get:
        mock_get.return_value.json.return_value = {"id": 1, "name": "Bob"}
        user = fetch_user(1)
        assert user["name"] == "Bob" 
Bash
pytest -v --cov=mymodule  # pip install pytest-cov
Tip: Name tests test_what_when_expected() β€” e.g., test_divide_by_zero_raises_value_error. Failures become self-documenting.