Ответ
Оба метода относятся к неформальному тестированию без заранее подготовленных тест-кейсов, но имеют фундаментальное различие в подходе и структуре.
Ad-hoc тестирование — это спонтанная, неструктурированная проверка ПО без какой-либо документации или плана. Тестировщик действует интуитивно, часто для быстрой "проверки" или "прогона" функционала.
- Цель: Быстро найти очевидные, критические дефекты.
- Процесс: Хаотичный, зависит от сиюминутных идей тестировщика.
- Документация: Отсутствует. Результаты часто не фиксируются.
- Аналогия: "Потыкать палкой" в систему, чтобы посмотреть, что сломается.
Exploratory тестирование (ET) — это одновременное изучение системы, проектирование тестов и их выполнение. Это структурированный, интеллектуальный и документируемый процесс.
- Цель: Исследовать продукт, понять его поведение, найти неочевидные дефекты и проблемы с юзабилити.
- Процесс: Цикличный: Изучить -> Спроектировать тест -> Выполнить -> Зафиксировать результат -> Проанализировать -> Изучить...
- Документация: Обязательна. Фиксируются тестовые идеи (charters), найденные баги, наблюдения, риски.
- Аналогия: Исследование новой местности с картой и компасом, где вы отмечаете интересные находки.
Ключевые различия:
| Аспект | Ad-hoc тестирование | Exploratory тестирование |
|---|---|---|
| Планирование | Отсутствует. | Есть тест-чартер (миссия, например: "Исследовать процесс оплаты с разными способами"). |
| Документация | Нет. | Да (заметки, скриншоты, сессионные листы). |
| Воспроизводимость | Низкая (сложно повторить). | Средняя/высокая (можно повторить по чартеру и заметкам). |
| Фокус | Найти баг. | Понять продукт, оценить качество, найти баги. |
| Навыки тестировщика | Базовое знание продукта. | Требует аналитического мышления, любознательности, умения структурировать информацию. |
Практический пример на Python:
# Тестируемая функция
def process_order(item_id, quantity, discount_code=None):
"""Обрабатывает заказ. Возвращает итоговую стоимость."""
price = get_price(item_id) # Допустим, возвращает 100
total = price * quantity
if discount_code == "SAVE10":
total *= 0.9
elif discount_code == "SAVE20":
total *= 0.8
# ...
return total
# --- Ad-hoc подход (в консоли, спонтанно) ---
# >>> process_order(123, 2)
# 200
# >>> process_order(123, 0) # Спонтанная мысль: а что если 0?
# 0
# >>> process_order(123, -1) # А если отрицательное?
# -100 # Баг! Стоимость не может быть отрицательной.
# Результат: Нашли баг, но контекст и шаги могут быть забыты.
# --- Exploratory подход (структурированное исследование) ---
# Чартер: "Исследовать функцию process_order на корректность расчетов и обработку граничных случаев."
# Запускаем сессию и делаем заметки:
session_notes = """
**Test Charter:** Исследование process_order().
**Тест-идея 1:** Стандартный сценарий.
- Данные: item_id=123, quantity=2 -> Ожидаем 200. Результат: 200 (OK).
**Тест-идея 2:** Граничные значения quantity.
- quantity=0 -> Ожидаем 0 или ошибку. Результат: 0 (OK, но бизнес-логика?).
- quantity=-1 -> Ожидаем ошибку/исключение. Результат: -100 (БАГ! Цена отрицательная).
- quantity=999999 (большое число) -> Проверка на переполнение/производительность.
**Тест-идея 3:** Купоны на скидку.
- discount_code="SAVE10" -> Ожидаем скидку 10%. Результат: 180 (OK).
- discount_code="INVALID" -> Ожидаем игнорирование или ошибку. Результат: 200 (OK).
- discount_code="" (пустая строка) -> ?
- discount_code=None (явно) -> ?
**Находки/Риски:**
1. Критический баг: функция допускает отрицательное количество, что приводит к отрицательной цене.
2. Вопрос к аналитику: Допустимо ли quantity=0?
"""
Вывод: Ad-hoc — это неконтролируемая разовая проверка, в то время как Exploratory Testing — это управляемый, обучающий и документируемый процесс, который является мощным инструментом в арсенале профессионального тестировщика.