Регрессионное, smoke и sanity

Три практичных вида проверок, которые экономят командам нервы при каждом релизе.

Регрессионное тестирование проверяет, что новые изменения не сломали уже работавшее; smoke — что сборка вообще живая; sanity — что конкретная правка действительно сработала.

Регрессия: «не сломали ли старое»

Самый коварный класс багов — регрессии: вы чините одно, а ломаете соседнее. Регрессионное тестирование — это повторный прогон существующих тестов после любого изменения. Именно регрессию автоматизируют в первую очередь: вручную перепроверять всю систему на каждый коммит невозможно.

def slugify(text):
    """Превращает заголовок в URL-slug."""
    return text.strip().lower().replace(" ", "-")


# Регрессионный набор: эти проверки гоняем ПОСЛЕ КАЖДОГО изменения slugify
regression = [
    ("Hello World", "hello-world"),
    ("  Trim Me  ", "trim-me"),
    ("ALL CAPS",    "all-caps"),
]
for text, expected in regression:
    assert slugify(text) == expected

print(f"Регрессия пройдена: {len(regression)} старых сценария всё ещё работают")

Вывод:

Регрессия пройдена: 3 старых сценария всё ещё работают

Если завтра кто-то «улучшит» slugify и забудет про strip(), этот набор тут же покраснеет — регрессия поймана.

Smoke: «вообще запускается?»

Smoke-тест (термин из электроники: включили плату — дыма нет, значит ничего не сгорело, можно тестировать дальше) — это короткий набор самых базовых проверок: приложение стартует, главная страница открывается, логин работает. Его гоняют сразу после сборки. Если smoke красный — нет смысла запускать остальные тесты, сборка нерабочая.

Sanity: «починили ли именно это?»

Sanity-проверка — узкая и быстрая: после конкретного фикса убеждаемся, что именно эта функция теперь ведёт себя правильно, не прогоняя весь набор. Это «проверка здравомыслия» перед более глубоким тестированием.

ВидКогдаГлубина
SmokeСразу после сборкиШирокая, но поверхностная
SanityПосле конкретного фиксаУзкая, но точечная
РегрессияПосле любого измененияПолный прогон старых тестов

Итог

  • Регрессия защищает от поломки уже работавшего — её автоматизируют в первую очередь.
  • Smoke — быстрая широкая проверка «сборка вообще живая».
  • Sanity — узкая проверка, что конкретный фикс сработал.
Проверьте себя
1. Что такое регрессионное тестирование?
AПроверка совсем новой функции
BПроверка скорости под нагрузкой
CПроверка, что новые изменения не сломали уже работавшее
DПроверка орфографии
2. Когда обычно запускают smoke-тест?
AВ самом конце релиза
BРаз в год
CТолько вручную перед сдачей заказчику
DСразу после сборки — проверить, что приложение вообще живое
3. Чем sanity отличается от smoke?
ASanity — узкая точечная проверка конкретного фикса, smoke — широкая поверхностная
BSanity глубже и шире, чем smoke
CЭто одно и то же
DSanity запускают раньше сборки