← Назад к вопросам

Какие знаешь библиотеки для тестирования?

1.0 Junior🔥 191 комментариев
#Python Core#Тестирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Библиотеки для тестирования в Python

В экосистеме Python существует множество инструментов для разных типов тестирования. Вот основные, которые я регулярно использую:

pytest — фреймворк юнит-тестов

Мощный и гибкий фреймворк, ставший стандартом индустрии. Превосходит встроенный unittest своей простотой и функциональностью.

import pytest
from decimal import Decimal
from myapp.services import calculate_discount

def test_discount_calculation():
    """Скидка 10% от цены"""
    result = calculate_discount(Decimal("100.00"), 10)
    assert result == Decimal("90.00")

def test_invalid_discount_raises_error():
    """Ошибка при скидке > 100%"""
    with pytest.raises(ValueError, match="Скидка не может быть > 100%"):
        calculate_discount(Decimal("100"), 150)

@pytest.mark.parametrize("price,discount,expected", [
    (Decimal("100"), 10, Decimal("90")),
    (Decimal("50"), 20, Decimal("40")),
])
def test_various_discounts(price, discount, expected):
    assert calculate_discount(price, discount) == expected

unittest.mock / pytest-mock — мокирование

Для изоляции компонентов и тестирования в отсутствие зависимостей.

from unittest.mock import Mock, patch, MagicMock
import pytest

def test_user_service_with_mock(mocker):
    """Тестирование сервиса с замокированной БД"""
    mock_db = mocker.MagicMock()
    mock_db.get_user.return_value = {"id": 1, "name": "Alice"}
    
    service = UserService(db=mock_db)
    user = service.fetch_user(1)
    
    assert user["name"] == "Alice"
    mock_db.get_user.assert_called_once_with(1)

pytest-asyncio — асинхронные тесты

Для тестирования async/await кода, часто используется при работе с aiohttp, FastAPI, asyncpg.

import pytest
import asyncio

@pytest.mark.asyncio
async def test_async_database_query():
    """Тестирование асинхронного запроса к БД"""
    result = await fetch_user_async(user_id=1)
    assert result["id"] == 1

pytest-cov — измерение покрытия кода

Определяет, какой процент кода охвачен тестами.

pytest --cov=myapp --cov-report=html

freezegun — фиксация времени

Для тестирования логики, зависящей от текущего времени.

from freezegun import freeze_time
from datetime import datetime

@freeze_time("2025-03-22 12:00:00")
def test_birthday_check():
    assert datetime.now() == datetime(2025, 3, 22, 12, 0, 0)

responses / vcrpy — мокирование HTTP

Для тестирования без реальных сетевых запросов.

import responses
import requests

@responses.activate
def test_api_call():
    responses.add(
        responses.GET,
        "https://api.example.com/users/1",
        json={"id": 1, "name": "Alice"},
        status=200,
    )
    
    resp = requests.get("https://api.example.com/users/1")
    assert resp.json()["name"] == "Alice"

Selenium / Playwright — браузерные тесты

Для E2E и интеграционного тестирования UI.

from playwright.sync_api import sync_playwright

def test_login_flow():
    with sync_playwright() as p:
        browser = p.chromium.launch()
        page = browser.new_page()
        page.goto("https://example.com/login")
        page.fill("input[name=email]", "user@example.com")
        page.click("button[type=submit]")
        assert "Welcome" in page.content()
        browser.close()

hypothesis — property-based тестирование

Для автоматической генерации тестовых данных и поиска edge cases.

from hypothesis import given
from hypothesis import strategies as st

@given(st.integers(), st.integers())
def test_addition_commutative(a, b):
    assert a + b == b + a

Выбор инструментов

Мой стек зависит от типа проекта: для backend микросервиса беру pytest + pytest-asyncio + responses, для веб-приложения добавляю Playwright для E2E, для критичного логики иногда использую hypothesis для property-based тестирования.