Какие знаешь библиотеки для тестирования?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Библиотеки для тестирования в 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 тестирования.