Функциональное и нефункциональное тестирование
Одно проверяет, что система делает нужное, другое — насколько хорошо она это делает.
Функциональное тестирование проверяет, что система делает (правильность функций), а нефункциональное — как она это делает: насколько быстро, безопасно, удобно и надёжно.
Что и как
Функция «перевод денег» может работать абсолютно правильно (функциональное ок), но падать при 1000 одновременных пользователей (нефункциональный провал по нагрузке) или сливать данные карты (провал по безопасности). Обе стороны важны.
| Вид нефункционального | Что проверяет |
| Нагрузочное / производительность | Скорость и стабильность под нагрузкой |
| Стресс-тестирование | Поведение за пределами нормальной нагрузки |
| Безопасность | Защита от атак, утечек, несанкционированного доступа |
| Юзабилити | Удобство и понятность для пользователя |
| Совместимость | Работа в разных браузерах, ОС, устройствах |
| Надёжность | Устойчивость к сбоям, восстановление |
Функциональная проверка кодом
Функциональный тест выражается напрямую через ожидаемый результат.
def transfer(balance, amount):
"""Снимает amount со счёта, если хватает средств."""
if amount <= 0:
raise ValueError("Сумма должна быть положительной")
if amount > balance:
raise ValueError("Недостаточно средств")
return balance - amount
# Функциональное: проверяем ЧТО делает функция
assert transfer(1000, 300) == 700
try:
transfer(1000, 5000) # больше баланса -> ошибка
raised = False
except ValueError:
raised = True
assert raised
print("Функциональный тест пройден: перевод и проверка лимита работают")
Вывод:
Функциональный тест пройден: перевод и проверка лимита работают
Нефункциональное — это другое
Нефункциональные свойства (производительность под нагрузкой, безопасность) обычно нельзя проверить простым assert в одном файле — для них нужны нагрузочные инструменты, сканеры безопасности, реальные пользователи. Но мыслить о них нужно с самого начала: «функция верна» ещё не значит «функция готова к продакшену».
Итог
- Функциональное — что делает система (правильность поведения).
- Нефункциональное — как: нагрузка, безопасность, юзабилити, совместимость.
- Корректная функция может проваливаться по нагрузке или безопасности — проверяют обе стороны.