ТЕСТИРОВАНИЕ ПО
весь курс — 40 вопросов зачёта
Лекции Клименкова · «зачет подготовка» · вопросы 2021
⚠️ личная дека, 18+, преподу не показывать
Вопросы 21-40 — обязательно с примерами!
Жми красную кнопку → Светлана сама всё расскажет и пролистает
1. Основы: определения, цели, принципы
2. V-модель, верификация/валидация
3. Модульное: драйверы, заглушки
4. Тест-кейсы и покрытие
5. Техники чёрного ящика
6. JUnit + Mockito
7. Интеграционное
8. Системное, CARAT, приёмка
9. Статическое: ревью, Фаган
10. Selenium + XPath
11. JMeter
12. Безопасность
115 слайдов · 48 минут озвучки · все 163 страницы лекций внутри — хватает одного внимательного прогона
1
Основы тестирования
определения · цели · принципы · роли (в.1-6)
Mistake
человек проебался
Fault
дефект в коде
Failure
внешний отказ
Error
задачу не выполнить
Отказ может прилететь и от среды, не только от кода
public int countPositive(int[] data) {
int count = 0;
for (int i = 1; i < data.length; i++) {
if (data[i] > 0) count++;
}
return count;
}
Дефект: i = 1 — data[0] проёбан
[−1, 5, 5] → ответ 2, верный. Дефект есть, отказа нет
[5, −1, −1] → ответ 0 вместо 1. Вот это уже failure
Мораль: тест может пройти на дефектном коде — всё решает выбор данных
Где Что случилось Причина
🚀 Ariane 5 ракета взорвалась ошибка модуля управления
💸 Knight Capital −$500 млн за полчаса торговый софт
☢️ Лучевая терапия смерть пациента передозировка радиации
☁️ Amazon каскадный сбой началось с грозы
🔌 Блэкаут США северо-восток без света ПО мониторинга
✈️ American Airlines рейсы встали интеграция систем бронирования
Это не страшилки — это аргумент за бюджет на тестирование
Тестирование — поиск дефектов: реальное vs ожидаемое на конечном наборе тестов
Отладка — локализация и устранение
Кто путает — сидит на уровне зрелости ноль, и это хуёво
Дейкстра: «Тестирование может показать наличие дефектов, но НЕ, сука, их отсутствие»
Стоимость исправления
Требования ~1
Дизайн ~1
Кодинг ~1
Функц. тест ~6
Сист. тест ~12
ПРОД ~20
×10 со стадией. Раннее тестирование — экономия бабла, а не занудство
SEI · Carnegie Mellon · CMU/SEI-96-HB-002
🐞
Обнаружение
найти дефекты
📈
Уверенность
в уровне качества
🧭
Информация
для принятия решений
Качество: функциональное + нефункциональное (надёжность, практичность, эффективность, сопровождаемость, переносимость) — ISO 9126, ISO/IEC 25010 (SQuaRE)
Другие способы оценки качества: стандарты, обучение, анализ дефектов
Увеличить пользовательское доверие , что программа работает корректно во всех необходимых обстоятельствах.
Уровень доверия : «меньше 10 критических дефектов за 7 дней»
Корректное поведение : из требований и спецификаций
Реальное окружение : 5000 студентов → тест на 5000-7000, а не на 10000, не выёбывайся
public long multiply(int A, int B) // как протестировать?
Полный перебор: 2³² × 2³² = 2⁶⁴ кейсов
Хранить входы и выходы: ~300 эксабайт
Прогнать на 3 ГГц CPU: ~200 лет
Полный перебор — дохлый номер даже для одной функции → классы эквивалентности и границы (блок 5)
0 тест == отладка. Дно
1 «показать корректность» хуйня: недоказуемо
2 демонстрация ошибок война разрабов и тестеров
3 наличие ошибок, риски снижают вместе
4 оценка качества по найденным дефектам
Наличие дефектов, не отсутствие
Исчерпывающее недостижимо
Раннее тестирование (×10 со стадией)
Скопление : дефекты кучкуются
Парадокс пестицида : старые тесты слепнут
Зависит от контекста
Заблуждение об отсутствии ошибок : нет багов ≠ юзер доволен
Роль Что делает
Test manager объёмы, стратегия, списания
Test designer анализ системы, тестовые случаи, покрытие
Test engineer вся грязная работа: создание, прогон, отчёты
Исполнять может любой; проектировать — нужна экспертиза
Этап Что требуется
Проектирование тестов формальные критерии + предметка, опыт, экспертиза
Автоматизация знание средств, скриптов
Исполнение нет специальных требований
Анализ результатов знание предметной области
Поэтому исполнять может кто угодно, а проектировать — тест-дизайнер
Тестирование процесс идёт
Метрики покрытие · тесты · дефекты
Мониторинг смотрит: план? бюджет?
Контроль рулит: действия
ресурсы · приоритеты · урезание релиза
Мониторинг смотрит , контроль рулит
2
V-модель, верификация и валидация
в.8-9
🥟📏
ВЕРИФИКАЦИЯ
«have we done the thing right ?» по спецификации : размер, прожарка, начинка на месте
🥟❤️
ВАЛИДАЦИЯ
«have we done the right thing?» по ожиданиям юзера : а нужен был мясной, а не сладкий, блять
Верификация — внутренний контроль · Валидация — про пользователя
Бизнес-требования
Требования к ПО
Архитектура
Детальное проект.
Приёмочное
Системное
Интеграционное
Модульное
Статическое : без выполнения (ревью, инспекции, анализаторы). Можно до написания кода
Динамическое : код запускается
Чёрный ящик : по спецификациям, кода не видим
Белый ящик : по исходникам — пути, условия, структура
📜
Описания
спецификации, требования, дизайн → чёрный ящик
🔬
Код
переходы, условия, пути → белый ящик
🧠
Опыт
экспертиза, интуиция, error guessing
📐
Модели
UML: автоматы, последовательности
Чёрный ящик = запуск и сравнение с эталоном · Белый = анализ путей и структуры
3
Модульное тестирование
драйверы · заглушки · test doubles (в.7)
Модуль : компонент минимального размера, тестируемый независимо (функция / класс / компилируемый элемент)
Цель: изолировать кусок и показать работоспособность
Бонусы: смелый рефакторинг, упрощение интеграции, живая документация
ДРАЙВЕР (вместо верха)
МОДУЛЬ под тестом
заглушка (низ)
заглушка (низ)
Нельзя тестировать заглушку, блять! 50 раз вернёт 42, на 51-й — IndexOutOfBounds
Эмулирует вызываемый компонент: подпрограмму, прерывание, передачу данных
Интерфейс совпадает, нутро — нет. Компилируется и линкуется как настоящая
Простая, обычно 1 строка кода . Возможна доп. логика и чтение ответов из файла
Настраивается драйвером перед выполнением
Тестировать заглушку нельзя! Её работа — прикидываться, а не работать
Эмулирует вызывающий модуль — сам дёргает тестируемый код
Сложнее заглушки: устанавливает окружение, готовит входные данные
Дополнительно: гоняет серии тестов, настраивает заглушки, ведёт журнал результатов
XXXunit-фреймворки — это и есть промышленные драйверы
Программисту для разбора нужны: входы и выходы , значения изменённых переменных
Пройденные пути и принятые решения
Симптомы сбоя
Главный вопрос: ошибка в тесте или в ПО? Тест — тоже код, и тоже с багами
🪑
Dummy
мебель: передаётся, не вызывается
⚙️
Fake
рабочий, но упрощённый (in-memory БД)
📼
Stub
предзаписанные ответы → состояние
🎯
Mock
+ verify вызовов → поведение
🕵️
Spy
обёртка над реальным (бонус)
Stub = «что вернулось» · Mock = «что вызвалось» . Перепутаешь — пиздец
4
Тест-кейсы и покрытие
в.10-12
Тест-кейс : входы + пред/постусловия + ожидаемый результат ДО запуска
Сценарий : последовательность кейсов (типичный + ошибочный)
Банкомат: 3 раза неверный PIN → блок карты
Неправильные переходы → внятные сообщения об ошибках
№ Состояние Ввод Вывод Новое состояние
1 Готов вставил карточку «введите PIN» Ожидание PIN
2 Ожидание PIN верный PIN выбор транзакции Ожидание выбора
3 Ожидание выбора снять 5000 деньги Выдача денег
4 Выдача денег забрал деньги и карту «спасибо» Готов
Сценарий = последовательность кейсов, типичное использование системы
№ Состояние Ввод Вывод Новое состояние
1 Ожидание PIN неверный PIN ошибка Ожидание PIN
2 Ожидание PIN неверный PIN ошибка Ожидание PIN
3 Ожидание PIN неверный PIN!!! ошибка + блокировка карты Готов
Сценарии обязаны покрывать и корректное поведение, и вариант ошибки
Корректное поведение определено в Уровень тестирования
Требованиях системное, приёмочное
Архитектуре интеграционное
Проектных документах модульное
Сценарии можно брать прямо из документации проекта: use-case → test-case
⋯
2³²
случаев на ОДИН int-вход
жизни не хватит
Принцип №2: исчерпывающее недостижимо → техники выбора покрытия
Кейс должен быть повторяемым и автоматизируемым
Регрессионное : после изменений — не сломали ли рабочее
Руками после каждого коммита = ёбаный сизифов труд → автоматизация
Помни парадокс пестицида: тесты надо обновлять
5
Техники чёрного ящика
в.20-23 — обязательно с примерами!
Разбить входы на классы, тестировать по одному представителю
Классы: валидные и невалидные
Банкомат: купюры $100, max $2000 за раз, $10000 в день, комиссия 1% но ≥$5
Сумма к снятию Результат Класс
−1 отказ невалидный
1..99, 101..199, … отказ: не кратно $100 невалидный
100..2000 кратно 100 выдача (+1%, мин $5) валидный
2100, 2200, … отказ: лимит за раз невалидный
2000+100 выдача в 2 этапа валидный
5 × 2000 = 10000 выдача в 5 этапов — дневной потолок валидный
Number line: invalid | 100 … 2000 valid | invalid · границы каждого класса — отдельными тестами
invalid
valid (1..15)
invalid
0,1
15,16
Баги живут на границах. < vs <= — самый частый человеческий проёб
Комбинации условий (T/F) → действия. По сути конечный автомат
Условие К1 К2 К3
Возраст > 18 T T F
Доход > X T F —
Действие выдать на проверку отказ
Каждый столбец = тест-кейс. Невозможные комбинации вычёркиваем
создан
оплачен
отправлен
доставлен
доставить неоплаченный? это что за хуйня → ТЕСТ!
Таблица: состояние × событие → новое состояние + действие
Позволяет выбрать состояния и комбинации, которые можно опустить (Рекс Блэк)
Алгоритм: пока есть непокрытые строки → берём клетку «не определено» → пытаемся покрыть тестом
«Не определено» — самые вкусные клетки: там и живут падения
Прецедент: ID, описание, актёры, предусловия, основной поток
Use-case → test-case: сценарии прямо из документации
Основной поток + альтернативные + ошибочные ветки
ViewInformationAboutTheRoute · ID: 2
Описание : пользователь просматривает информацию о маршруте
Актёры : клиент или любой пользователь; второстепенных нет
Предусловия : выведен список маршрутов; авторизация не обязательна
Основной поток : выбрал маршрут → система показала подробную информацию
Тест: выбираем сценарий → проверяем его. Дальше альтернативные и ошибочные ветки
6
JUnit + Mockito
в.24-28 — с примерами!
БИБЛИОТЕКА
твой main()
ты вызываешь
библиотека
ФРЕЙМВОРК (JUnit)
фреймворк
ОН вызывает тебя
твои @Test методы
Стрелка перевернулась — это и есть инверсия управления
public class WhaleTest {
private Whale whale;
@Before public void setUp() {
whale = new Whale();
whale.setLocation("где-то высоко");
}
@Test public void testDown() {
whale.fallDown();
assertEquals("Кит не упал", "на земле", whale.getLocation());
}
}
setUp перед каждым тестом → тесты независимы · первый аргумент assertEquals — сообщение при провале
@Test // тест
@Before / @After // до/после КАЖДОГО (JUnit5: @BeforeEach/@AfterEach)
@BeforeClass / @AfterClass // один раз (JUnit5: @BeforeAll/@AfterAll)
@Ignore("причина") // пропуск (JUnit5: @Disabled)
@Test(timeout = 10) // упасть по таймауту
@Test(expected = ...Exception.class) // ждём исключение
assertEquals/True/Null/Throws, fail(), assertAll (выполнит все, даже если один упал)
long sum(int a, int b) { ... }
assertEquals(4, sum(2, 2));
// FAIL: "expected: <4> but was: <4>" — ЧТО ЗА ХУЙНЯ?!
JUnit4: 4 → Integer, sum → Long. Integer(4) ≠ Long(4)
Фикс: assertEquals(4L, sum(2,2))
// JUnit5:
@ParameterizedTest
@ValueSource(ints = {1, 2, 3})
@CsvFileSource(files = "data.csv")
Один тест × N наборов. Класс эквивалентности = строка данных
MyService m = mock(MyService.class);
when(m.getData()).thenReturn(42);
when(m.getData()).thenReturn(1).thenReturn(2); // цепочка
when(m.find(anyInt())).thenReturn(x); // матчеры
verify(m).getData(); // проверка вызова
в.26-28: техника блока 5 + параметризация + ассерты. Пример готовь свой
when(i.next()).thenReturn("Mockito").thenReturn("rocks");
i.next() + " " + i.next(); // "Mockito rocks"
when(c.compareTo("Mockito")).thenReturn(1); // ответ зависит
when(c.compareTo("Eclipse")).thenReturn(2); // от аргумента
when(c.compareTo(anyInt())).thenReturn(-1); // любой int
when(c.compareTo(isA(Todo.class))).thenReturn(0); // любой Todo
Цепочка thenReturn — ответы по порядку вызовов. Матчеры: anyInt, anyString, isA
7
Интеграционное тестирование
в.13
Интерфейсы и взаимодействие : API, сообщения, БД, GUI, сеть
Можно начинать с 2 готовых компонентов
Сложные компоненты первыми, регрессия после каждого этапа
Build 1 ModA + StubB + ModC
Build 2 + реальный B, − заглушка
…
Build N вся система
Модули добавляются в сборки по готовности , заглушки выбывают
На каждый интерфейс — короткий тест-план. Больше объём интеграции — больше сложность
Стратегия Суть Нужны
Top-down сверху вниз заглушки
Bottom-up снизу вверх драйверы
Функциональная по сценарию end-to-end —
Ядро скелет + наращивание —
Big bang всё сразу и молиться удача
Big bang — самая ебанутая: ошибку не локализовать
Top-down ▼
готов
заглушка
заглушка
Bottom-up ▲
драйвер
готов
готов
Big bang 💥
🧩🧩🧩
всё сразу + молитва
UI A — готов
BL B — логика
BL C — логика
Stub D (хранение)
Stub E (хранение)
Слоями вниз: UI → бизнес-логика → хранение; низ — заглушки
+ быстро появляется «осязаемое» приложение · − дохуя заглушек
Начинаем с нижних модулей — вплоть до железа (HW, карты)
Сверху вместо ещё не готовых модулей — драйверы
Поднимаемся: драйверы по очереди заменяются реальным кодом
+ фундамент (библиотеки, железо, БД) проверен рано
− целое приложение появляется в самом конце
Сложные компоненты — первыми : снижает риски, больше времени на фиксы
Порядок интеграции — с учётом порядка разработки
Регрессия после каждого этапа интеграции
Автоматизируй тесты
Можно гонять и нефункциональные характеристики
8
Системное, CARAT, приёмка
в.14-16 — подробно в деке ЛР4
🏭
Системное
внутри организации-разработчика
🧪
Альфа / Бета
пользователи, под контролем разработчика
💰
Приёмочное
пользователь сам. Итог: платить или не платить
Методики практически одинаковые — различается строгость интерпретации результатов
Тестирование — как научный эксперимент: нужно повторение → автоматизация, скриптинг
Результаты — в журнал; на каждый дефект — инцидент ; периодические отчёты
Окружение максимально близко к боевому: железо, ОС, сеть, тайминги
Тестеры исполняют роли реальных юзеров, скрипты — реальные сценарии
Сначала верификация, потом валидация. В основном чёрный ящик
Возможности
Стабильность
Устойчивость Let's break it!
Совместимость
Производительность
простые сценарии →→→ сложные
Идём от простых сценариев к сложным — нет смысла грузить систему, у которой не работают кнопки
Работают ли основные функции системы вообще
Один пользователь, одна транзакция
Корректный ввод: от юзера, из файлов, из БД
Нормальные переходы между состояниями, «среднее» железо
Положительные проверки подсистем безопасности
Реалистичнее: несколько юзеров одновременно , данные всё ещё валидные
Реальные последовательности транзакций; несколько транзакций от одного юзера
Длительный запуск : утечки памяти, переполнение диска
Юзеры вводят хуйню — система обязана выжить и внятно ответить
Сбой сети, испорченные файлы
Неправильные переходы между состояниями, операции в неправильном порядке
Аварийное отключение систем и подсистем
Намеренные ошибки безопасности: плохие пароли, внешний взлом
Функционирование в разных средах
Взаимодействие с локальными и удалёнными системами
Разные версии: библиотек, браузеров, операционных систем
Системное : вся система, чёрный ящик, окружение как боевое
Лестница : возможности → стабильность → отказоустойчивость («Let's break it!») → совместимость → производительность
🔌
A
Availability (MTBF−MTTR)/MTBF
Альфа внутри · Бета внешние · Приёмка : юзер рулит, «платим или нахуй»
Кг = (MTBF − MTTR) / MTBF
работает (MTTF)
чиним (MTTR)
работает
MTBF = от сбоя до сбоя
MTBF — среднее время между сбоями · MTTF — до сбоя · MTTR — восстановления
Пять девяток 0,99999 = ≈5,3 минуты простоя в год . Посчитай сам: 525960 × 0,00001
Throughput : транзакций в секунду; всегда баланс с временем отклика
Response time : от «нажал» до «загрузилось»; мерить под минимальной, расчётной и пиковой нагрузкой
Стресс-тест : последовательно грузим систему до неприемлемого времени отклика
Capacity : максимум юзеров/записей/файлов одновременно, не нарушая остальных требований
Accuracy : корректность алгоритмов и результатов — критична для целого класса систем
Небольшая группа пользователей внутри организации , разработавшей ПО
Может проводиться до окончания системного тестирования
Цель: ранние отзывы об использовании системы в рабочем окружении
Выбранная группа внешних юзеров в своём окружении. Windows Beta — весь мир
Баги допустимы, функционал может быть неполный. Превью юзерам + отзывы разработчикам
Неформально : нет сценариев и планов — тыкают что интересно, репортят что сломалось
Фиксы не гарантированы сразу: в финальном релизе или в следующей бете
Ключевой аспект: управляется пользователем , а не разработчиком
Проверка «соответствия предназначению и практическому использованию». Формальное или нет
Источник — документ «требования к системе» (в RUP — SRS); функциональные + нефункциональные
Подготовка с ранних этапов, можно статически. Окружение полностью готово — может быть первый боевой запуск
Юзеров выбирать ответственно и обязательно обучить
9
Статическое тестирование
ревью · Фаган · анализаторы (в.17-19)
Динамике нужен код; статику можно до первого коммита
Цена ошибки растёт ×10 со стадией → ловим рано, экономим
Объекты : политики, стратегии, планы; ТЗ и спецификации; артефакты проектирования, код; планы тестирования
IEEE 1028: неформальное ревью («звонок другу»), технический анализ, management review, сквозной контроль, инспекции
🎙️
Модератор
ведёт, не автор
📢
Докладчик
читает артефакт
✍️
Автор
отвечает на вопросы
Зачем: люди ошибаются, «вторые мозги» видят то, что автор уже не видит. Неформальное ревью малоэффективно — формальные методики лучше
Walkthrough Tech review Инспекция
Ведёт автор — модератор ≠ автор
Цель обмен опытом решения дефекты + процесс
Метрики нет иногда всегда
Группа 2-7 >3 3-6
Можно ДО написания кода (IEEE 1028)
1972, IBM, Michael Fagan. Систематическая peer evaluation
Роли : менеджер, модератор, докладчик, автор, эксперты, секретарь. Ведущий — не автор, блять
Шаги : вход → планирование → обзор → подготовка → обсуждение → переработка → follow-up → выход
Встреча ≤ 2 ч. Max 2 проблемы. Решение: принят / переработка / отклонён
Вход
Планирование
Обзор kick-off, обучение, роли
Подготовка check rate, по ролям
Обсуждение сердце, ≤2ч
Переработка
Follow-up
Выход
шаги могут повторяться
Повторяется, пока все участники, включая модератора, не удовлетворены
Критерии входа проверяет ведущий — не тратить время неподготовленной встречей
Примеры входных: чеклисты готовы; базовые документы вышли из инспекций с известным уровнем ошибок; ≤1 дефект за 10 минут пробной проверки ; грамматика проверена
Планирование: check rate (скорость проверки), разбиение на «куски», метрики (размер, дефекты, цена изменений, время), расписание
Выходные критерии: документы согласованы → артефакт уходит в систему контроля версий
Чеклист — проверка по списку
Документы — целостность между доками
Фокус — поиск выделенных проблем
Перспектива — роль будущего юзера
Процедура — следование особой процедуре
Сценарий — заданный сценарий (специфичнее)
Стандарт — соответствие стандартам
Точка зрения — например, пользователя
Человек фокусируется максимум на двух проблемах одновременно — потому и роли
Обсуждение — сердце инспекции. Протоколирование результатов подготовки даёт ещё 10-20% проблем
Формат проблемы: id, severity (Major / minor), описание, документ, страница
Ведущий: дипломатичен, краток, категоричен ; глушит дискуссии; вправе удалить участника или остановить встречу
≤2 часа. Решение: принят / на переработку / отклонён
Переработка: автор, редактор или другие. Инспекция не закрыта, пока не выполнены выходные критерии
Код без запуска . Lint (C), FindBugs/SpotBugs (Java)
Находит: неинициализированные переменные, fopen без fclose, переполнение буфера, копипаст
Безопасность: Find Security Bugs. Базы: CWE Top 25, OWASP Top 10
10
Selenium + XPath
в.29-33 — с примерами!
IDE рекордер; слабая логика, динамика — боль
RC устаревший, на помойку
WebDriver современный путь, драйверы браузеров
Grid HUB + NODE, HUB один
HUB только один!
node
node
node
node
разные браузеры/ОС параллельно
Интегрированная среда записи и исполнения тестов; родилась как расширение Firefox
Запись тестов в виде Java, Ruby, HTML
assert/verify добавляются правым кликом на элементе во время записи
Ограничения: только Firefox; слабая логика (циклы, условия); запускает только свои сценарии; динамический контент — боль
Действия: open, click, type, select, store
verify упал → тест ЖИВЁТ. assert упал → тест СДОХ . Не проеби
Синхронизация: waitForPageLoad, waitForAlert, waitForTitle
verifyTextPresent текст есть на странице
verifyTitle заголовок страницы
verifyElementPresent элемент существует
verifyValue значение поля
store значение → переменная, дальше ${var}
echo запись значения в лог selenium
assert-версии — те же проверки, но валят тест. wait*** — ожидание событий (page load по таймауту, alert, table, title)
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.get(baseUrl);
driver.findElement(By.id("search-field")).clear();
driver.findElement(By.id("search-field")).sendKeys("селениум");
driver.findElement(By.id("search-button")).click();
Локаторы: By.id, By.name, By.xpath, By.cssSelector · implicitlyWait — неявное ожидание элементов
Сервер на Java, работает как прокси для web-запросов совместно с WebDriver каждого браузера
Кросс-браузерное тестирование, много языков; плагины к NetBeans и Eclipse; запуск через maven и ant
jar-ы в проект: junit, selenium-java-client-driver, selenium-server, testng
Grid : масштабирование на разные ОС и браузеры, параллельный запуск экономит время
/ от корня // где угодно
. текущий .. родитель
@ атрибут [] предикат | объединение
Оси: child::, parent::, self::, following::
Динамический ID — зло: //div[contains(@class,'heading')]
Множества: count, position, last, text
Строки: contains, starts-with, string-length, matches
Логика: true, false, not, boolean
Числа: sum, round, number, ceiling, floor
Системные: document, format-number, generate-id
Пример: //tr[position() > 1]/td[2] — вторая ячейка всех строк кроме заголовка
11
Apache JMeter
в.34-35 — подробно в деке ЛР4
HP LoadRunner
LoadComplete
IBM Rational Performance Tester
LoadUI Pro
Apache JMeter
The Grinder, Tsung
Почему JMeter: бесплатный , кроссплатформенный, GUI с графиками, распределённая нагрузка, эмуляция юзеров, метрики, плагины
Планы в XML → нормально живут в системе контроля версий
НЕ БРАУЗЕР, БЛЯТЬ! Протокольный генератор: 1 поток = 1 юзер, планы в XML
Test Plan
Thread Group
Sampler HTTP/TCP/JDBC/SMTP
Timers темп, задержки
Assertions проверки
Logic Ctrl if / loop
Listeners CSV, отчёты
Config → Pre → Timers → Sampler → Post → Assertions → Listeners · Распределёнка: jmeter-server + remote_hosts
Thread Group : пул виртуальных юзеров — количество, возрастание (ramp-up), длительность
Семплеры : формируют запросы, генерируют результаты
Протоколы из коробки: TCP, HTTP(S), FTP, JDBC, SOAP, JMS, SMTP…
Умеет записывать запросы (прокси-рекордер): функциональный тест → нагрузочный в том же плане
Слушатели : получают ответы, пишут и показывают. Данные НЕ обрабатывают в CLI — графики только в GUI
Таймеры : задержки между запросами — постоянные или по законам распределения
Assertions : проверяют результаты (код ответа, текст, длительность — SLA)
Конфиг-элементы : предустановки для семплеров · Пре/пост-процессоры : например, HTML Link Parser
Автоматическая генерация CSV с результатами
Bandwidth throttling : ограничение полосы — статически (CPS) или динамически (по error rate)
IP spoofing : подмена src IP для разделения клиентов — проверка балансировщиков нагрузки
TPC-C : стандартный тест OLTP-нагрузки
Вид Вопрос
Нагрузочное держит ли система расчётную нагрузку в рамках SLA
Стресс где предел и как система ломается за ним
Объёмное что будет на больших данных
Стабильность выдержит ли долгую работу (утечки)
ЛР4: SLA p90 ≤ 700 мс → конфиг №2 ($1800, p90 = 576) · стресс: SLA пробит на 16 юзерах, массовые 503 при ≈149
12
Тестирование безопасности
в.36-40 — с примерами!
Фокус: безопасность функциональности, политики, поведение атакующего, известные уязвимости
Цифровые активы : данные, код, ключи, репутация
Экспозиция риска = f(вероятность, ущерб)
Что воруют : данные юзеров, бизнес-планы, код и документация, торговые секреты, финансы, переписка, прототипы, репутация и доверие
Как лезут : корпоративный LAN и WiFi, VPN из публичных сетей, физика (DVD, USB), почта и мессенджеры
Защита : шифрование (криптостойкость, алгоритмы), аутентификация и токены (сертификаты, политики паролей), авторизация и права доступа
Устанавливаются административно . Примеры:
Приемлемое использование, минимальный уровень доступа, управление аккаунтами
Классификация информации: публичная / ДСП / секретная / частная
Безопасность серверов и мобильных устройств, физический доступ
Реакция на инциденты, мониторинг, защита от «закладок»
Методы: статанализ + фаззинг + пентест
Стандарты: SEI CERT, OWASP, Microsoft. Базы: CWE, OWASP Top 10
CERT Top 10: проверяй входы · слушай компилятор · политики · KISS · default deny · мин. привилегии · санитизируй · defense in depth · тестируй · стандарты
char hostname[64];
validate_addr_form(user_supplied_addr); // формат ок, но...
addr = inet_addr(user_supplied_addr);
hp = gethostbyaddr(addr, sizeof(struct in_addr), AF_INET);
strcpy(hostname, hp->h_name); // 💥 h_name длиннее 64 байт
CWE-119: запись за границей буфера → перезапись стека → выполнение чужого кода
Бонус-дефект там же: gethostbyaddr может вернуть NULL → CWE-476 NULL pointer dereference
// PHP
$username = $_GET['username'];
echo '<div>Welcome, ' . $username . '</div>';
// атака:
welcome.php?username=<script>alert("You've been attacked!")</script>
Вывод юзерского ввода без экранирования → скрипт исполняется в браузере жертвы
Лечение: экранирование вывода (htmlspecialchars), CSP. Тренажёр: alf.nu/alert1
query = "SELECT * FROM items WHERE owner = '" + userName +
"' AND itemname = '" + ItemName.Text + "'";
// ввод: name' OR 'a'='a
SELECT * FROM items WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a'; // весь WHERE по пизде
Лечение: параметризованные запросы / prepared statements. Конкатенация SQL со вводом — преступление
аномальные входы
%s%s%s ÿÿÿÿ \x00\xFF
-1 999999999 '';DROP
ПРОГРАММА
💥 краш · утечка · зависание → дефект!
✓ пережила → следующая мутация
Тип Как Инструменты
Dumb мутация готовых данных Peach, ProxyFuzz
Smart по модели формата SPIKE, Sulley
Evolutionary по покрытию кода AFL , EFS
Пентест = легальный хакинг. Без договора это статья, а не пентест!
🔍📄
SAST — белый ящик
смотрит исходный код без запускарано · точно до строки false positives
🎯🌐
DAST — чёрный ящик
атакует работающее приложение ловит конфиг, сессии, рантайм не знает, где в коде
DAST: OWASP ZAP, Burp Suite, Nikto, w3af · Гибрид = IAST
Важны на стадии продакшена для известных движков: WordPress, Joomla, Drupal
Ищут только известные уязвимости
Чужое сканировать незаконно — только с письменным разрешением!
Коммерческие: Rapid7 Nexpose, Paessler PRTG… Open source: OpenVAS, OWASP-набор, WAVSEP
Процесс обычный : планирование (сфера по рискам) → анализ и проектирование (угрозы из аудита требований и известных уязвимостей) → выполнение (взгляд внутренних и внешних юзеров, взломщиков) → отчёты → интеграция в разработку
Waterfall, боль : требования безопасности меняются, но не отражаются в доках; тесты в конце проекта; чинить найденное дорого
Agile : потребности возникают прямо в спринте; подходы могут меняться полностью; тесты идут весь проект; стратегия избегания риска может не успеть за один релизный цикл
Требования анализ рисков 📋
Код SAST · стандарты CERT 🔍
Тест фаззинг · DAST 💥
Прод сканеры · мониторинг 🛡️
Hardening : убрать лишнее, добавить защитное ПО. Аудит: пароли по умолчанию, лишняя конфигурация, дыры в библиотеках
Аутентификация и авторизация — самый ломаемый модуль: брутфорс паролей, фильтры ввода (XSS, injection), доступность URL. Шифрование : дизайн, код, конфигурация
Брандмауэры и зоны : сканирование портов, битые пакеты, dos/ddos, фрагментация
Обнаружение взлома (IDS) : инвазивные изменения данных и сообщений
Антивирус : реальные вирусы не нужны — тестовый файл EICAR
Обфускация данных : реверс-инжиниринг, брутфорс (unXOR)
Mistake→Fault→Failure→Error + Дейкстра
7 принципов · V-модель
Драйвер vs заглушка
stub=state, mock=behavior
assertEquals(4,...) → 4L
Фаган (роли, ≤2ч)
verify живёт, assert дохнет
XPath оси + 5 групп
CARAT + (MTBF−MTTR)/MTBF
3 вида фаззинга · XSS/SQLi
Вопросы 21-40 — с примерами!
🎓
Удачи на зачёте
Дейкстра, 7 принципов, stub ≠ mock. И помни, блять: JMeter — не браузер, пентест без договора — статья.
Деки ЛР4: lab4_theory/ · Аудио: tpo_exam/narration/