Ответ
Основное различие лежит в подходе к изменению требований, структуре процесса и роли тестирования.
| Критерий | Waterfall («Водопад») | Agile (Scrum, Kanban) |
|---|---|---|
| Подход к требованиям | Фиксированные на этапе анализа. Изменения сложны и дороги. | Итеративный и адаптивный. Требования уточняются и могут меняться в процессе работы (Product Backlog). |
| Структура процесса | Линейная последовательность фаз: Анализ → Дизайн → Разработка → Тестирование → Внедрение. | Циклическая (итерации/спринты). Каждый цикл включает планирование, разработку, тестирование и ревью готового инкремента. |
| Роль тестирования | Отдельная фаза после разработки. Тестировщики вовлекаются поздно. | Непрерывная и интегрированная. Тестирование происходит в каждой итерации. Тестировщик — полноправный член команды с первого дня спринта. |
| Документация | Объемная, формальная, создается на ранних этапах. | Рабочий продукт важнее документации. Документация легковесная (User Stories, задачи в трекере). |
| Поставка ценности | В конце проекта, после полного цикла. | Частая, инкрементальная (в конце каждого спринта/итерации). |
| Гибкость | Низкая. Плохо подходит для проектов с неясными или меняющимися требованиями. | Высокая. Позволяет быстро реагировать на обратную связь от заказчика и рынка. |
Практическое влияние на разработчика/тестировщика в Agile (Scrum):
- Работа ведется по User Stories, которые оцениваются в story points.
- Каждый день — стендап для синхронизации.
- Тестирование начинается сразу, как только готова первая функциональность в спринте.
-
Пример задачи в спринте и связанного с ней теста:
# User Story: Как пользователь, я хочу применять скидку к корзине. # Код реализации (упрощенно): def apply_discount(subtotal: float, discount_percent: float) -> float: if discount_percent < 0 or discount_percent > 100: raise ValueError("Discount must be between 0 and 100") return subtotal * (1 - discount_percent / 100) # Модульный тест, написанный в том же спринте: def test_apply_discount(): assert apply_discount(100, 10) == 90.0 assert apply_discount(200, 25) == 150.0 def test_apply_discount_invalid_input(): with pytest.raises(ValueError): apply_discount(100, -5) with pytest.raises(ValueError): apply_discount(100, 110)
DevOps является эволюцией Agile, фокусируясь на автоматизации (CI/CD) и стирании границ между разработкой и эксплуатацией для максимально быстрой и надежной поставки.