Какой нужен тип тестов для проверки пользовательского flow?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Типы тестов для проверки пользовательского flow
Для проверки пользовательского flow нужна пирамида тестов, где каждый уровень решает свою задачу:
Пирамида тестов
E2E (Selenium, Playwright) сверху, API Tests и Integration посередине, Unit тесты внизу — всего ~70% Unit, 20% Integration, 10% E2E.
1. Unit тесты (основание) — 70%
Тестируют отдельные функции и методы в изоляции:
import pytest
from dataclasses import dataclass
@dataclass
class UserRegistration:
email: str
password: str
def validate(self):
if not self.email or "@" not in self.email:
return False, "Некорректный email"
if len(self.password) < 8:
return False, "Пароль короче 8 символов"
return True, None
def test_valid_registration():
reg = UserRegistration("user@example.com", "password123")
is_valid, error = reg.validate()
assert is_valid is True
assert error is None
def test_invalid_email():
reg = UserRegistration("invalid-email", "password123")
is_valid, error = reg.validate()
assert is_valid is False
assert "email" in error.lower()
Плюсы: Быстрые, изолированные, легко отлаживать. Минусы: Не проверяют интеграцию компонентов.
2. Integration тесты (середина) — 20%
Тестируют взаимодействие компонентов: БД, API, кэш:
import pytest
from sqlalchemy.orm import Session
class UserService:
def __init__(self, db: Session):
self.db = db
def register_user(self, email: str, password: str):
existing = self.db.query(User).filter_by(email=email).first()
if existing:
raise ValueError("Email уже зарегистрирован")
user = User(email=email, password=hash_password(password))
self.db.add(user)
self.db.commit()
return {"id": user.id, "email": user.email}
def test_register_new_user(db_session):
service = UserService(db_session)
result = service.register_user("new@example.com", "password123")
assert result["email"] == "new@example.com"
assert result["id"] is not None
Плюсы: Проверяют реальное взаимодействие. Минусы: Медленнее unit тестов.
3. E2E тесты (вершина) — 10%
Тестируют полный пользовательский flow от интерфейса до БД:
import pytest
from playwright.async_api import async_playwright
@pytest.mark.asyncio
async def test_user_registration_flow(page):
await page.goto("http://localhost:3000/register")
await page.fill('input[name="email"]', "newuser@example.com")
await page.fill('input[name="password"]', "SecurePass123!")
await page.click("button[type=submit]")
await page.wait_for_selector(".success-message", timeout=5000)
assert await page.is_visible(".success-message")
Плюсы: Проверяют реальный flow пользователя. Минусы: Медленные, хрупкие.
4. API тесты (параллельно Unit) — 10%
Тестируют API endpoints:
from fastapi.testclient import TestClient
def test_register_api():
client = TestClient(app)
response = client.post("/api/v1/auth/register", json={
"email": "user@example.com",
"password": "password123"
})
assert response.status_code == 201
assert response.json()["email"] == "user@example.com"
Рекомендации
Когда писать Unit тесты: Любая бизнес-логика, расчеты, валидация, трансформация данных.
Когда писать Integration: Когда нужно проверить взаимодействие с БД, кэшем, внешними сервисами.
Когда писать E2E: Критичные path'ы (регистрация, платежи, бронирование), сложное взаимодействие фронта и бэка.
Когда писать API тесты: Для каждого endpoint, проверка статус кодов, валидации, обработки ошибок.
Вывод: Используй пирамиду 70/20/10 (Unit/Integration/E2E) для максимального покрытия при минимальных затратах на тестирование.