Что такое Ad Hoc тестирование?

Ad hoc тестирование — незапланированное, неформальное тестирование, движимое интуицией, опытом и знанием приложения. Нет заранее написанных тест-кейсов, формальной документации и структурированного подхода.

Термин «ad hoc» буквально означает «для этого случая» — тесты придумываются на месте для текущей ситуации.

Когда Ad Hoc тестирование приносит пользу

Быстрые проверки. Разработчик заканчивает фикс и просит QA «быстро глянуть.»

Заполнение пробелов. После выполнения всех скриптовых тест-кейсов вы тратите 15 минут на области, не покрытые формальными тестами.

Исследование новичком. Новый сотрудник тестирует приложение без обучения — его свежий взгляд часто обнаруживает проблемы юзабилити.

Smoke после деплоя. После деплоя на staging быстро проверяете критичные потоки.

Ограничения Ad Hoc тестирования

  • Не повторяемо — Без документации нельзя повторить те же тесты
  • Не измеримо — Нельзя отчитаться о покрытии или прогрессе
  • Зависит от навыка — Опытные тестировщики находят баги; неопытные тратят время впустую
  • Не прослеживаемо — Нельзя доказать, что было протестировано
  • Баги сложнее отчитывать — Без задокументированных шагов воспроизведение затруднено

Что такое Monkey-тестирование?

Monkey-тестирование заключается в подаче случайных, неожиданных или невалидных данных в приложение для проверки на краши и неожиданное поведение. Название происходит от идеи обезьяны, случайно нажимающей клавиши на клавиатуре.

Dumb Monkey

Dumb monkey генерирует полностью случайные события без понимания приложения: случайные нажатия, ввод с клавиатуры, свайпы, навигация.

Сильная сторона: Находит краши от совершенно неожиданных комбинаций ввода.

Слабая сторона: Крайне неэффективен — большинство случайных действий бессмысленны.

Smart Monkey

Smart monkey обладает знанием приложения: знает форматы валидных/невалидных данных, понимает навигацию, может имитировать реалистичное поведение с случайными ошибками.

Сильная сторона: Намного эффективнее. Проникает глубже в приложение.

Слабая сторона: Требует усилий по настройке.

Сравнение

АспектDumb MonkeySmart Monkey
Усилия на настройкуНетУмеренные — высокие
Знание приложенияНетЧастичное/полное
ЭффективностьОчень низкаяУмеренная — высокая
ГлубинаПоверхностнаяГлубокая
Типы баговКраши от случайного вводаЛогические ошибки, проблемы состояния
ВоспроизводимостьОчень сложнаяЛучше (логируемые пути)

Инструменты Monkey-тестирования

Android Monkey (встроенный)

# Отправить 10,000 случайных событий
adb shell monkey -p com.your.app -v 10000

# С задержкой и типами событий
adb shell monkey -p com.your.app \
  --throttle 300 \
  --pct-touch 40 \
  --pct-motion 25 \
  --pct-nav 15 \
  -v -v 50000

Gremlins.js (веб-приложения)

// Базовое использование
gremlins.createHorde().unleash();

// Настраиваемая конфигурация
gremlins.createHorde()
  .gremlin(gremlins.species.clicker())
  .gremlin(gremlins.species.formFiller())
  .gremlin(gremlins.species.scroller())
  .gremlin(gremlins.species.typer())
  .unleash();

Другие инструменты

ИнструментПлатформаТип
Android MonkeyAndroidDumb monkey
Gremlins.jsWebDumb/настраиваемый
Netflix Chaos MonkeyИнфраструктураСлучайное внедрение сбоев
AFLЛюбая (бинарный ввод)Smart fuzzer
Burp Suite IntruderWeb APISmart monkey для безопасности

Monkey Testing vs. Fuzz Testing

Monkey-тестирование генерирует случайные пользовательские взаимодействия (клики, тапы, навигация). Имитирует хаотичного пользователя.

Fuzz-тестирование (фаззинг) генерирует случайные или повреждённые входные данные (форматы файлов, сетевые пакеты, API payload). Нацелено на обработку данных.

Оба ищут краши и уязвимости через неожиданные данные, но работают на разных уровнях.

Упражнение: Выполните Monkey-тестирование и задокументируйте результаты

Часть 1: Ручное Monkey-тестирование

Выберите любое веб-приложение. Проведите 15 минут «человеческого обезьяньего тестирования»:

  • Быстро кликайте по случайным элементам
  • Вводите случайный текст (спецсимволы, эмодзи, очень длинные строки) во все поля
  • Используйте кнопки назад/вперёд в неожиданные моменты
  • Отправляйте формы с пустыми обязательными полями
  • Откройте несколько вкладок и взаимодействуйте одновременно
  • Быстро изменяйте размер окна браузера

Задокументируйте все краши, ошибки и неожиданное поведение.

Часть 2: Инструментальное тестирование

В тестовом окружении запустите Gremlins.js на 5 минут. Задокументируйте: были ли краши, ошибки в консоли, визуальные глюки?

Часть 3: Анализ

  1. Какие типы багов нашло monkey-тестирование, которые структурированное тестирование, скорее всего, пропустило бы?
  2. В чём сложности воспроизведения найденных багов?
  3. В каком контексте проекта вы бы рекомендовали включить monkey-тестирование в стратегию?
ПодсказкаДля Части 1 сосредоточьтесь на быстрых, неожиданных взаимодействиях. Для Части 3 учитывайте соотношение затрат: monkey-тестирование дёшево в запуске, но дорого в расследовании.
Решение

Часть 1: Типичные находки

  • Ошибки JavaScript в консоли при кликах во время переходов
  • Наложение элементов UI при быстром изменении размера окна
  • Обход валидации форм при быстрой отправке
  • Устаревшее состояние при работе в нескольких вкладках
  • Сломанная вёрстка при очень длинных строках ввода

Часть 2: Gremlins.js обычно находит: ошибки консоли, зависшие модальные окна, активацию валидаций от мусорных данных.

Часть 3:

  1. Race conditions от быстрых взаимодействий, краши от неожиданных комбинаций ввода, баги состояния от необычной навигации
  2. Точная последовательность действий неизвестна. Решение: использовать DevTools для записи ошибок и действий
  3. Мобильные приложения: Android Monkey в CI. Consumer-facing веб: перед продакшн-релизами. Всегда как дополнение, никогда как основной метод

Ключевые выводы

  • Ad hoc тестирование — незапланированное, интуитивное тестирование, полезное для быстрых проверок, но не прослеживаемое и не повторяемое
  • Monkey-тестирование генерирует случайные данные для поиска крашей и необработанных исключений
  • Dumb monkey генерирует чисто случайные события; smart monkey понимает приложение
  • Инструменты Android Monkey и Gremlins.js автоматизируют генерацию случайного ввода
  • Главная проблема — воспроизводимость: случайные данные затрудняют написание шагов воспроизведения
  • Monkey-тестирование наиболее ценно как дополнение к структурированному тестированию
  • Fuzz-тестирование — «родственник» monkey-тестирования, ориентированный на форматы данных и API