В чём разница между регрессионным и Smoke тестирования?
Комментарии (3)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между регрессионным и Smoke-тестированием
Разница между регрессионным и Smoke-тестированием (также известным как Sanity Check или Build Verification Testing) фундаментальна и касается целей, глубины, объёма и момента выполнения в жизненном цикле разработки ПО. Оба являются критически важными видами тестирования, но служат разным целям.
Ключевые определения
- Smoke-тестирование — это поверхностный, быстрый набор тестов, выполняемый над новым билдом (сборкой) ПО с целью проверить его базовую работоспособность. Основной вопрос: "Можно ли вообще начинать углублённое тестирование этого билда?".
- Регрессионное тестирование — это полномасштабное тестирование, направленное на обнаружение новых дефектов в уже протестированном функционале после внесения изменений (правка бага, добавление новой функции, рефакторинг кода). Основной вопрос: "Не сломали ли наши изменения то, что работало раньше?".
Сравнительная таблица
| Критерий | Smoke-тестирование | Регрессионное тестирование |
|---|---|---|
| Основная цель | Проверка стабильности билда для дальнейшего тестирования ("Врата" для билда). | Проверка отсутствия регрессий в существующем функционале после изменений. |
| Глубина и объём | Поверхностное и узкое. Проверяются только ключевые, самые важные сценарии (часто < 5% от всех тестов). | Глубокое и широкое. Покрывает значительную часть уже протестированного функционала, связанного с изменениями. |
| Время выполнения | Очень быстрое (минуты или десятки минут). | Длительное (часы, дни, в зависимости от стратегии и автоматизации). |
| Момент выполнения | Сразу после получения нового билда (сборки). | После внесения изменений в код (новый функционал, исправление багов) и успешного Smoke-теста. |
| Результат при провале | Билд отвергается, отправляется на доработку. Глубокое тестирование не начинается. | Находятся регрессионные баги, которые фиксируются. Билд при этом может быть стабильным. |
| Приоритет | Высший. Без успешного Smoke-теста все остальные процессы замирают. | Высокий, но выполняется после "входного контроля" (Smoke). |
| Основной метод | Часто ручное тестирование для скорости, но стремится к автоматизации. | Активно использует автоматизированные регрессионные тест-сьюты для покрытия объёма. |
Пример на практике (с кодом)
Представьте веб-приложение — интернет-магазин.
Сценарий Smoke-теста (автоматизированный):
# smoke_test.py - пример быстрых проверок
import requests
BASE_URL = "https://demo-store.com/api"
def test_build_stability():
"""Smoke-набор: проверяем, что основные сервисы отвечают и ключевые потоки работают."""
# 1. Проверка доступности API (health check)
health_response = requests.get(f"{BASE_URL}/health")
assert health_response.status_code == 200, "Сервис недоступен"
# 2. Проверка базового сценария: получение главной страницы товаров
catalog_response = requests.get(f"{BASE_URL}/catalog")
assert catalog_response.status_code == 200, "Каталог не загружается"
assert len(catalog_response.json()) > 0, "Каталог пуст"
# 3. Проверка возможности логина (критичный путь)
login_data = {"username": "test_user", "password": "test_pass"}
login_response = requests.post(f"{BASE_URL}/login", json=login_data)
assert login_response.status_code in [200, 401], "Сервис авторизации не работает"
print("Smoke-тест пройден. Билд стабилен для дальнейшего тестирования.")
# Выполнение
if __name__ == "__main__":
test_build_stability()
Сценарий регрессионного тестирования: Допустим, мы исправили баг в корзине товаров, где неверно считалась скидка.
# regression_test_cart.py - часть регрессионного набора
import pytest
from shopping_cart import Cart, Product
class TestCartRegression:
"""Регрессионные тесты корзины после исправления бага со скидкой."""
def setup_method(self):
self.cart = Cart()
self.product_1 = Product(id=1, name="Книга", price=500, discount=10) # Скидка 10%
self.product_2 = Product(id=2, name="Мышка", price=1000, discount=0)
def test_total_calculation_with_discount_fix(self):
"""Проверка исправленного расчета общей суммы со скидкой."""
self.cart.add_item(self.product_1, quantity=2) # 500 * 2 * 0.9 = 900
self.cart.add_item(self.product_2, quantity=1) # 1000 * 1 = 1000
assert self.cart.calculate_total() == 1900.0, "Неправильный расчет суммы со скидкой"
# РЕГРЕССИЯ: проверяем, что НЕ сломались старые функции
def test_adding_removing_items_still_works(self):
"""Проверка, что базовые методы добавления/удаления всё еще работают."""
self.cart.add_item(self.product_1, quantity=1)
assert len(self.cart.items) == 1
self.cart.remove_item(self.product_1.id)
assert len(self.cart.items) == 0
def test_empty_cart_total(self):
"""Проверка, что сумма пустой корзины по-прежнему ноль."""
assert self.cart.calculate_total() == 0.0
def test_cart_clear_functionality(self):
"""Проверка старого функционала очистки корзины."""
self.cart.add_item(self.product_1)
self.cart.add_item(self.product_2)
self.cart.clear()
assert self.cart.is_empty()
Стратегическая взаимосвязь
Эти виды тестирования выстроены в последовательную стратегию:
- Разработчики предоставляют новый билд.
- QA инженер или CI/CD пайплайн запускает Smoke-тест.
- Если Smoke-тест провален → билд отвергается, возвращается разработчикам. Экономим время.
- Если Smoke-тест пройден → билд считается стабильным для приёмочного тестирования новой функциональности и, что критично, для запуска автоматизированного регрессионного тест-сьюта.
- Регрессионное тестирование выявляет, не затронули ли изменения старый код. Его глубина зависит от стратегии (полная регрессия, выборочная, по приоритетам).
Итог: Smoke-тестирование — это быстрый "чек-ап" для билда, стража перед воротами. Регрессионное тестирование — это глубокое "обследование" системы на предмет побочных эффектов после "лечения" (изменений кода). Успешный Smoke-тест — необходимое условие для начала регрессионного.