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

Какой нужен тип тестов для проверки пользовательского flow?

1.7 Middle🔥 151 комментариев
#REST API и HTTP#Тестирование

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

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

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

Типы тестов для проверки пользовательского 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) для максимального покрытия при минимальных затратах на тестирование.