Какие аспекты системы проверяются в рамках нефункционального тестирования?

Ответ

Нефункциональное тестирование оценивает как система работает, а не что она делает. Основные направления:

1. Тестирование производительности (Performance Testing)

  • Нагрузочное тестирование (Load Testing): Проверка поведения под ожидаемой нагрузкой.
    • Цель: Определить пропускную способность и время отклика.
    • Инструменты: k6, Apache JMeter, Gatling.
  • Стресс-тестирование (Stress Testing): Проверка за пределами нормальной нагрузки до точки отказа.
    • Цель: Найти "слабое звено" и проверить механизмы восстановления.
  • Тестирование стабильности/надежности (Soak Testing): Длительная работа под средней нагрузкой.
    • Цель: Обнаружение утечек памяти или деградации производительности.

Пример конфигурации сценария в k6:

import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  stages: [
    { duration: '2m', target: 100 }, // Плавный рост до 100 пользователей
    { duration: '5m', target: 100 }, // Стабильная нагрузка
    { duration: '1m', target: 0 },   // Плавное снижение
  ],
};

export default function () {
  const res = http.get('https://api.example.com/data');
  check(res, { 'status was 200': (r) => r.status == 200 });
  sleep(1);
}

2. Тестирование безопасности (Security Testing)

  • Статический анализ кода (SAST).
  • Динамический анализ (DAST) и проверка уязвимостей (OWASP Top 10).
  • Тесты на инъекции (SQLi, XSS), аутентификацию и авторизацию.

3. Тестирование совместимости (Compatibility Testing)

  • Кроссбраузерное/кроссплатформенное тестирование.
  • Тестирование на разных мобильных устройствах и ОС.

4. Тестирование удобства использования (Usability Testing)

  • Оценка эргономики и интуитивности интерфейса.
  • Тестирование доступности (Accessibility / a11y) на соответствие стандартам WCAG.

5. Тестирование надежности (Reliability Testing)

  • Оценка вероятности отказа системы за определенный период.
  • Проверка восстановления после сбоев (failover).

Ответ 18+ 🔞

Ну, вот смотри, как оно бывает. Сидишь ты такой, пишешь код, и вроде всё работает: кнопка жмётся, данные летят, красота. А потом заходит какой-нибудь пользователь с древним телефоном, или их сразу десять тысяч наваливается, или какой умник пытается SQL-инъекцию впиздюрить — и тут начинается настоящий цирк, ёпта. Это и есть нефункциональное тестирование — проверка не что система делает, а как она это делает, и не обосрётся ли при этом.

1. Тестирование производительности (Performance Testing) Тут мы проверяем, не сломается ли всё, если навалится толпа. Как в метро в час пик.

  • Нагрузочное тестирование (Load Testing): Это как загнать в систему столько народу, сколько мы ожидаем в реальности. Цель — понять, не упрётся ли всё в потолок и не начнёт ли тормозить так, что волнение ебать.
    • Инструменты: k6, Apache JMeter, Gatling. Взял, настроил, запустил — и смотришь, как система пыхтит.
  • Стресс-тестирование (Stress Testing): А это уже сверхреализм. Наваливаем народу овердохуища, пока система не начнёт хрипеть и не накроется медным тазом. Цель — найти самое слабое звено: где первым пиздец наступит — в базе, в памяти или ещё где.
  • Тестирование стабильности (Soak Testing): А тут мы систему мучаем не спеша, но долго. Средняя нагрузка, но на протяжении часов или даже дней. Цель — поймать коварные утечки памяти, которые тихой сапой съедают все ресурсы. Система вроде работает, а потом — бац! — и терпения ноль ебать, потому что всё зависло.

Вот, смотри, как это примерно в k6 выглядит, чтоб ты понимал масштаб:

import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  stages: [
    { duration: '2m', target: 100 }, // Плавно нагоняем сотню юзеров
    { duration: '5m', target: 100 }, // Держим их, как на раскалённой сковороде
    { duration: '1m', target: 0 },   // Плавно отпускаем, смотрим, отдышится ли
  ],
};

export default function () {
  const res = http.get('https://api.example.com/data');
  check(res, { 'status was 200': (r) => r.status == 200 });
  sleep(1);
}

2. Тестирование безопасности (Security Testing) Тут мы примеряем роль хитрожопого злоумышленника. Задача — найти дыры, куда можно пролезть.

  • Ищем уязвимости из священного списка OWASP Top 10.
  • Пробуем всякие инъекции: SQL, XSS — вдруг система проглотит эту хуйню и отдаст все пароли?
  • Проверяем, нельзя ли зайти в админку, просто поменяв цифру в адресной строке. Если можно — пидарас шерстяной тому, кто это писал.

3. Тестирование совместимости (Compatibility Testing) А вот это весёлый аттракцион. Надо проверить, будет ли твой шедевр работать не только у тебя на новом Макбуке в Хроме, но и у тёти Маши на Windows XP в древнем IE, или на каком-нибудь левом андроид-смартфоне. Иначе выходит, что вы ходите по охуенно тонкому льду, когда половин пользователей всё плывёт.

4. Тестирование удобства использования (Usability Testing) Тут мы смотрим на систему глазами пользователя, который в жизни не видел твоего интерфейса. Кнопка спрятана так, что её найти — это квест? Шрифт такой мелкий, что глаза сходят с ума? А сможет ли человек, который не видит, пользоваться сайтом? Если нет — это пиздопроебибна с точки зрения доступности.

5. Тестирование надежности (Reliability Testing) И, наконец, главный вопрос: а можно ли на эту штуку положиться? Не отвалится ли она через неделю работы? А если отвалится (например, сервер базы данных), то как быстро и без потерь встанет обратно? Проверка на вшивость, одним словом.

Вот так, блядь. Писать код, который просто работает, — это полдела. А вот сделать так, чтобы он работал хорошо, быстро, безопасно и для всех — это уже высший пилотаж, ёпта. И без такого тестирования можно неожиданно оказаться в глубокой жопе.