Ответ
Оба вида тестирования проверяют корректность работы функциональности программного обеспечения, но с разными акцентами в рамках жизненного цикла изменений.
Общая цель: Убедиться, что система ведёт себя ожидаемо и соответствует требованиям.
Связь и отличия:
| Вид тестирования | Фокус | Контекст | Пример проверки |
|---|---|---|---|
| Функциональное | Проверка нового или существующего функционала на соответствие требованиям (спецификациям, user stories). | Может выполняться на новой функции или на старой (приёмочное тестирование). | «Новая кнопка «Экспорт в PDF» корректно генерирует документ из текущих данных таблицы». |
| Связанное с изменениями (Регрессионное, Дымовое, Санитарное) | Проверка, что после внесения изменений (новый код, фикс) не сломался существующий, критически важный функционал. | Всегда выполняется после изменений в коде или окружении. | «После добавления кнопки «Экспорт в PDF» по-прежнему работает кнопка «Экспорт в Excel» и сохранение формы». |
Практический пример (в коде): Допустим, в форму входа добавили функцию «Запомнить меня».
# 1. Функциональный тест для НОВОЙ функции
def test_new_remember_me_functionality():
login(remember_me=True)
assert session.is_persistent() == True # Проверяем новое требование
# 2. Регрессионный тест (связанный с изменениями) для СТАРОГО функционала
def test_regression_login_basic():
# Проверяем, что базовая логика входа не сломалась
result = login(username="valid_user", password="valid_pass")
assert result.success == True
assert result.redirect == "/dashboard"
# Проверяем, что не появился побочный эффект
assert not has_unexpected_cookie("test_cookie")
Вывод: Функциональное тестирование отвечает на вопрос «Работает ли функция как задумано?», а тестирование, связанное с изменениями, — «Не сломали ли мы что-то работавшее, добавляя эту функцию?». Они взаимодополняют друг друга в процессе контроля качества.