В чем разница между Smoke, Sanity и Regression Testing?

«В чем разница между Smoke, Sanity и Regression Testing?» — вопрос из категории Основы тестирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Smoke Testing — поверхностная проверка стабильности сборки. Sanity Testing — узкая проверка конкретного функционала после изменений. Regression Testing — полная проверка всего приложения на регрессию.

Сравнительная матрица:

Критерий Smoke Testing Sanity Testing Regression Testing
Другое название Build Verification Test (BVT) Surface Testing
Глубина Поверхностный (широкий, неглубокий) Узкий и глубокий Глубокий и широкий
Цель Проверить, «не сломан» ли билд Убедиться, что конкретное изменение работает Найти регрессии во всем приложении
Объем 5-10% критических тест-кейсов 1-2 модуля/функции 70-100% регрессионной пачки
Когда выполнять После каждой сборки После конкретных изменений/фиксов Перед релизом, после значительных изменений
Автоматизация Высокий приоритет Средний/низкий Высокий приоритет
Время выполнения Минуты Минуты-часы Часы-дни
Кто выполняет QA/DevOps/CI система QA/разработчик QA-команда

Пример для веб-приложения:

# Smoke Test Suite (проверяем, что приложение «живое»)
def test_smoke_application(): 
    """Smoke: базовые функции работают после деплоя"""
    # 1. Приложение запускается
    response = requests.get("https://app.example.com/health")
    assert response.status_code == 200

    # 2. Главная страница загружается
    response = requests.get("https://app.example.com")
    assert "Welcome" in response.text

    # 3. База данных доступна
    db_status = check_database_connection()
    assert db_status == "connected"

    # 4. Критичный API endpoint отвечает
    response = requests.get("https://api.example.com/v1/products")
    assert response.status_code == 200

# Sanity Test Suite (после фикса бага в корзине)
def test_sanity_shopping_cart_fix():
    """Sanity: проверяем только исправленную функциональность корзины"""
    # Контекст: фиксили баг с добавлением товара при нулевом количестве

    # 1. Проверяем исправленный сценарий
    cart = ShoppingCart()
    result = cart.add_item("product_123", quantity=0)
    assert result == False  # Теперь должно возвращать False, а не падать

    # 2. Проверяем смежный сценарий
    result = cart.add_item("product_123", quantity=1)
    assert result == True
    assert cart.get_item_count() == 1

    # НЕ проверяем: оплату, доставку, каталог — только корзину

# Regression Test Suite (полная проверка перед релизом)
class TestRegression:
    """Regression: полная проверка всего приложения"""

    def test_regression_user_flows(self):
        # 1. Полный flow регистрации
        user_id = register_user("test@example.com", "password123")
        assert user_id is not None

        # 2. Полный flow покупки
        cart = create_cart(user_id)
        cart.add_item("product_1", 2)
        order_id = checkout(cart, "card_123")
        assert order_status(order_id) == "confirmed"

        # 3. Проверяем историю заказов
        orders = get_user_orders(user_id)
        assert order_id in [o.id for o in orders]

        # 4. Проверяем связанный функционал
        invoice = generate_invoice(order_id)
        assert invoice.total > 0

        # ... и еще 100+ тест-кейсов

Практический workflow в CI/CD:

# .gitlab-ci.yml пример
stages:
  - build
  - smoke
  - sanity
  - regression
  - deploy

smoke_test:
  stage: smoke
  script:
    - python run_tests.py --suite=smoke  # 2 минуты
  only:
    - main
    - merge_requests

sanity_test:
  stage: sanity
  script:
    - python run_tests.py --module=shopping_cart  # 5 минут
  only:
    - merge_requests  # Только для изменений в корзине

regression_test:
  stage: regression
  script:
    - python run_tests.py --suite=regression  # 2 часа
  only:
    - main  # Только перед релизом
  when: manual

Ключевое правило: Smoke → если проходит, то Sanity → если проходит, то Regression. Это фильтры, предотвращающие запуск тяжелых тестов на нестабильных сборках.