Как тестировать нефункциональные требования (NFR)?

«Как тестировать нефункциональные требования (NFR)?» — вопрос из категории Основы тестирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нефункциональные требования (NFR) определяют как система должна работать, а не что она делает. Их тестирование требует специализированных методов и метрик.

Основные типы NFR и подходы к их тестированию:

Тип требования Цель тестирования Методы и инструменты Ключевые метрики
Производительность Оценить скорость, стабильность и масштабируемость. Нагрузочное (Load), стресс- (Stress), объемное (Volume) тестирование.
Инструменты: JMeter, k6, Gatling.
Время отклика (Response Time), пропускная способность (RPS/TPS), утилизация ресурсов (CPU, RAM).
Надежность Проверить отказоустойчивость и способность к восстановлению. Тестирование восстановления после сбоев, Chaos Engineering.
Инструменты: Chaos Monkey, Gremlin.
Время наработки на отказ (MTTF), время восстановления (MTTR), доступность (Availability, e.g., 99.9%).
Безопасность Выявить уязвимости и слабые места. Статический/динамический анализ кода (SAST/DAST), пентесты.
Инструменты: OWASP ZAP, Burp Suite, SonarQube.
Количество/серьезность найденных уязвимостей (по CVSS), покрытие OWASP Top-10.
Совместимость Убедиться в работе в разных окружениях. Кроссбраузерное, кроссплатформенное тестирование.
Инструменты: Selenium, Playwright, BrowserStack.
% поддерживаемых комбинаций браузер/ОС/устройство, где функционал работает корректно.
Удобство использования Оценить удобство и понятность интерфейса. Юзабилити-сессии, A/B-тестирование, экспертные оценки.
Инструменты: Hotjar, UserTesting.
Время выполнения задачи, показатель ошибок пользователя, результаты опросов (NPS, SUS).

Пример базовой проверки производительности на Python:

import requests
import time

def test_api_response_time():
    """Проверяет, что время отклика API не превышает 500 мс."""
    url = "https://api.example.com/v1/data"
    headers = {"Authorization": "Bearer token123"}

    start_time = time.perf_counter()
    response = requests.get(url, headers=headers)
    elapsed_time = (time.perf_counter() - start_time) * 1000  # в мс

    assert response.status_code == 200, f"HTTP {response.status_code}"
    assert elapsed_time < 500, f"Время отклика {elapsed_time:.2f} мс превышает лимит"
    print(f"Успех: {elapsed_time:.2f} мс")

Важно: Тестирование NFR должно быть измеримым (на основе метрик) и повторяемым (интегрировано в CI/CD).