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

Ответ

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

  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

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

Ответ 18+ 🔞

Да ты посмотри, какой заковыристый поворот, блядь! Безопасность — это ж не про то, чтобы кнопочки нажимались, а про то, чтобы вся эта конструкция не развалилась, когда на неё начнут хуярить со всех сторон, как по тарелкам в тире!

Вот смотри: функциональное тестирование — это «а пашет ли кнопка «войти»». А нефункциональное тестирование безопасности — это «а не сломается ли нам вся эта херня, если на кнопку «войти» начнут давить десять тысяч ботов в секунду, пытаясь подобрать пароль?». Суть, блядь, в атрибутах, в качестве, в том, КАК система держит удар, а не в том, ЧТО она делает в спокойной обстановке.

Основные грабли, на которые можно наступить, если этого не проверять:

  1. Тестирование на отказоустойчивость (Resilience). По-русски: «А не сдохнем ли мы полностью, если нам устроят DDoS?». Проверяем, останется ли хоть что-то живое для нормальных пользователей, пока нас ебут.
  2. Тестирование производительности под атакой. Интересный момент, блядь! Сканер уязвимостей запустили — и вся система легла, потому что каждый запрос сканера вызывает дикие запросы к базе. Получается, сам факт проверки безопасности убивает доступность. Ёперный театр!
  3. Оценка устойчивости (Penetration Testing). Это уже не просто тесты, а почти искусство. Смотрим, сколько времени, сил и костылей нужно, чтобы вломиться в систему. Не «можно ли», а «насколько это сложно и долго». Если за пять минут и тремя запросами — пиши пропало.

Вот, на, погляди, как это может выглядеть в коде. Просто пример, для понимания масштаба трагедии:

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

Видишь, в чём прикол? Мы тут проверяем не логин-пароль, блядь. Мы проверяем, сработает ли механизм защиты от тупого перебора. Функционально-то кнопка входа работает — всегда возвращает 401 на неправильный пароль. А нефункционально мы проверяем, не проёбывается ли система, если на неё лить тонны дерьма. Если после пятой попытки не прилетела ошибка 429 (Too Many Requests) или сообщение про блокировку — значит, защита хуёвая, и любой школьник сможет перебрать пароль. Вот и вся разница, ебать мои старые костыли.