🧪 Что это
TDD Workflow — это навык (skill), который внедряет дисциплину разработки через тестирование (Test-Driven Development) прямо в ваш процесс написания кода. Он не просто напоминает писать тесты, а жёстко задаёт пошаговый регламент: сначала тест, потом реализация, потом рефакторинг. Целевая аудитория — разработчики, работающие над новыми функциями, исправлением багов или рефакторингом, особенно в проектах, где требуется высокая надёжность и минимальное количество регрессий.
Ключевое требование — покрытие кода не ниже 80%, включая модульные (unit), интеграционные (integration) и сквозные (E2E) тесты. Навык подходит для проектов на JavaScript/TypeScript, использующих Jest, Playwright и подобные инструменты.
⚙️ Как работает
Процесс строго цикличен и состоит из семи шагов. Нарушать порядок нельзя.
📝 Шаг 1: Формулировка пользовательских историй
Перед написанием кода вы описываете сценарий использования по шаблону:
As a [роль], I want to [действие], so that [польза].
Пример: «Как пользователь, я хочу искать рынки семантически, чтобы находить релевантные результаты без точных ключевых слов». Это даёт контекст и критерии успеха.
🔬 Шаг 2: Генерация тестовых случаев
Для каждой пользовательской истории создаются тесты. Навык предлагает сразу описывать тесты для счастливого пути (happy path), граничных условий и обработки ошибок.
Пример структуры теста на Jest/Vitest:
describe('Semantic Search', () => {
it('returns relevant markets for query', async () => {
// Тест реализации
})
it('handles empty query gracefully', async () => {
// Проверка граничного случая
})
it('falls back to substring search when Redis unavailable', async () => {
// Тест fallback-поведения
})
})
💥 Шаг 3: Запуск тестов (они должны упасть)
Запускаем npm test. Тесты обязаны упасть — ведь реализации ещё нет. Этот шаг подтверждает, что тесты работают и действительно проверяют то, что нужно.
💻 Шаг 4: Реализация кода
Пишется минимальный код, достаточный для прохождения проваленных тестов. Никаких избыточных оптимизаций или «на будущее» — только то, что требуется тестами.
export async function searchMarkets(query: string) {
// Минимальная реализация
}
✅ Шаг 5: Повторный запуск тестов
Снова npm test. На этот раз все тесты должны пройти зелёным. Если нет — возвращаемся к шагу 4.
🧹 Шаг 6: Рефакторинг
Улучшаем код: убираем дублирование, улучшаем именование, оптимизируем производительность, повышаем читаемость. Тесты остаются зелёными — это страховка, что рефакторинг ничего не сломал.
📊 Шаг 7: Проверка покрытия
Команда npm run test:coverage — проверяем, что покрытие кода (ветки, функции, строки, операторы) не ниже 80%. Если ниже — возвращаемся к шагу 2 и добавляем пропущенные тесты.
🧩 Структура тестов и моки
Unit-тесты (Jest / Vitest)
Проверяют отдельные функции, компоненты, хелперы.
Пример: тест кнопки — рендер, клик, состояние disabled.
Интеграционные тесты (Jest + NextRequest)
Проверяют работу API-эндпоинтов, взаимодействие с базой данных и внешними сервисами.
Пример: тест GET /api/markets — проверка успешного ответа, валидации параметров, обработки ошибок БД.
E2E-тесты (Playwright)
Имитируют действия пользователя в браузере. Проверяют полные пользовательские сценарии: навигацию, поиск, отправку форм и т.д.
Пример: пользователь заходит на страницу, вводит поисковый запрос, проверяет количество и содержимое карточек.
📁 Организация файлов
Тесты кладутся рядом с кодом (Component.test.tsx) или в отдельную папку e2e/. Это стандартная практика, которая упрощает навигацию и обнаружение тестов.
🎭 Моки для внешних сервисов
Чтобы тесты были быстрыми и надёжными, все внешние зависимости (Supabase, Redis, OpenAI) мокаются на уровне импортов. Навык приводит готовые примеры моков с использованием jest.mock.
🚦 Когда использовать
Навык активируется, когда вы:
- ✏️ Пишете новую функциональность — модули, API, компоненты.
- 🐛 Исправляете баги — сначала пишете тест, воспроизводящий баг, потом чините код.
- 🔄 Рефакторите существующий код — тесты гарантируют, что поведение не изменилось.
- 🧩 Создаёте новые компоненты или API-эндпоинты.
Не рекомендуется использовать этот навык для экспериментального кода, быстрых прототипов или одноразовых скриптов — затраты на TDD там не оправданы.
💡 Важно знать
- Тесты первичны, а не просто «хорошая практика». Навык explicitly запрещает писать код до тестов.
- Одно утверждение на тест — каждый
it проверяет только одно поведение. Это упрощает поиск проблемы при падении.
- Не тестируйте детали реализации — тестируйте то, что видит пользователь или другие части системы. Например, вместо проверки внутреннего состояния компонента (
component.state.count) проверяйте текст на экране (screen.getByText('Count: 5')).
- Изолируйте тесты — каждый тест должен создавать свои данные и не зависеть от других тестов. Общие моки — да, общее состояние — нет.
- Семантические селекторы — в E2E-тестах избегайте хрупких CSS-классов, используйте
data-testid, роли и текст.
- Непрерывное тестирование — запускайте тесты в watch-режиме (
npm test -- --watch) во время разработки, добавляйте их в pre-commit hook и в CI/CD (GitHub Actions, Codecov).
- Быстрота — unit-тесты должны выполняться быстрее 50 мс каждый. Если тесты стали медленными, пересмотрите моки или разбейте сценарии.
- Критерии успеха: 80%+ покрытия, все тесты зелёные, ни одного пропущенного или отключённого теста, E2E покрывают критические пути пользователя.
Комментарии
Комментариев пока нет. Будьте первым.