Функциональное и нефункциональное тестирование

Одно проверяет, что система делает нужное, другое — насколько хорошо она это делает.

Функциональное тестирование проверяет, что система делает (правильность функций), а нефункциональноекак она это делает: насколько быстро, безопасно, удобно и надёжно.

Что и как

Функция «перевод денег» может работать абсолютно правильно (функциональное ок), но падать при 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 в одном файле — для них нужны нагрузочные инструменты, сканеры безопасности, реальные пользователи. Но мыслить о них нужно с самого начала: «функция верна» ещё не значит «функция готова к продакшену».

Итог

  • Функциональное — что делает система (правильность поведения).
  • Нефункциональное — как: нагрузка, безопасность, юзабилити, совместимость.
  • Корректная функция может проваливаться по нагрузке или безопасности — проверяют обе стороны.
Проверьте себя
1. Что проверяет функциональное тестирование?
AСкорость работы под нагрузкой
BЧто система делает то, что должна (правильность функций)
CУдобство интерфейса
DЗащищённость от атак
2. Какое из этих — нефункциональное тестирование?
AПроверка, что калькулятор правильно складывает
BНагрузочное тестирование: держит ли сервис 1000 пользователей
CПроверка, что форма сохраняет данные
DПроверка валидации e-mail
3. Функция перевода денег работает корректно. Что ещё стоит проверить?
AНичего, корректной функции достаточно
BНефункциональные свойства: нагрузку, безопасность, надёжность
CТолько орфографию сообщений
DТолько цвет кнопки
Поддержать проект