В каких случаях тестирование безопасности относится к нефункциональному тестированию?

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

Ответ

Тестирование безопасности становится нефункциональным, когда оценивает не бизнес-логику, а атрибуты качества системы, связанные с защитой. Ключевые аспекты:

  1. Тестирование на отказоустойчивость (Resilience): Как система ведет себя при целенаправленных атаках (например, DDoS), сохраняя доступность основных функций.
  2. Тестирование производительности под нагрузкой атаки: Падает ли производительность при сканировании уязвимостей или попытках подбора учетных данных.
  3. Оценка устойчивости (Penetration Testing): Время и усилия, необходимые для взлома системы (обход аутентификации, инъекции).

Пример: Тест устойчивости к brute-force-атаке

import requests

API_LOGIN_URL = "https://api.example.com/auth/login"

def test_brute_force_protection():
    """Система должна блокировать учетную запись после N неудачных попыток."""
    username = "test_user"
    max_attempts = 5

    for attempt in range(1, max_attempts + 2):  # +1 попытка сверх лимита
        response = requests.post(API_LOGIN_URL, 
                                 json={"login": username, "password": "wrong"})

        if attempt > max_attempts:
            # После превышения лимита должна быть ошибка блокировки
            assert response.status_code == 429 or "locked" in response.text, 
                   f"Система не заблокировала аккаунт после {max_attempts} попыток."
        else:
            # До лимита — стандартный отказ
            assert response.status_code == 401

Такие тесты проверяют не что делает система (функциональность входа), а как она это делает в условиях угроз.