Что такое предугадывание ошибок?
Предугадывание ошибок (Error Guessing) — техника тест-дизайна на основе опыта, при которой тестировщики используют знание типичных ошибок, характерных дефектов и прошлых отказов для предвидения того, где программа с наибольшей вероятностью сломается.
Почему предугадывание работает
Опытные тестировщики развивают интуицию о местах концентрации дефектов. Это приходит из:
- Лет нахождения похожих багов в разных проектах
- Знания типичных ошибок программирования
- Понимания поведения пользователей, ломающего софт
- Осведомлённости о точках интеграции, которые часто отказывают
Подход с таксономией дефектов
Чтобы сделать предугадывание систематическим, создайте таксономию дефектов:
Типичные категории ошибок
Обработка ввода:
| Паттерн ошибки | Тест |
|---|---|
| Null/пустой | Отправить пустые поля формы |
| Спецсимволы | <script>alert(1)</script>, '; DROP TABLE-- |
| Очень длинный | Строка в 10 000 символов в поле имени |
| Unicode | Эмодзи, текст справа налево, иероглифы |
| Отрицательные числа | -1 в поле количества |
| Ноль | 0 товаров, оплата $0 |
| Пробелы в начале/конце | " admin " как username |
Вычисления:
| Паттерн ошибки | Тест |
|---|---|
| Деление на ноль | Вычислить среднее 0 элементов |
| Переполнение целого | Количество = 2 147 483 647 + 1 |
| Точность float | $0.1 + $0.2 = ? |
| Арифметика дат | Добавить 1 месяц к 31 января |
Состояние/Время:
| Паттерн ошибки | Тест |
|---|---|
| Двойная отправка | Нажать кнопку отправки дважды быстро |
| Кнопка «Назад» | Отправить форму, нажать назад, отправить снова |
| Истёкшая сессия | Оставить страницу открытой на ночь, затем отправить |
| Параллельное редактирование | Два пользователя редактируют одну запись |
Реальный пример: Тестирование корзины
| # | Предугаданная ошибка | Обоснование |
|---|---|---|
| 1 | Добавить товар, затем он раскупается | Race condition инвентаря |
| 2 | Добавить 999 999 одного товара | Переполнение количества |
| 3 | Применить просроченный купон | Валидация даты |
| 4 | Сменить валюту посреди оформления | Повреждение состояния |
| 5 | Открыть корзину в двух вкладках, оформить в обеих | Параллельная модификация |
| 6 | Добавить товар по $0.001 | Округление итога |
| 7 | Корзина со 100+ уникальными товарами | Производительность |
| 8 | Удалить все товары и перейти к оформлению | Обработка пустого состояния |
Создание личного каталога дефектов
Структурированный фреймворк
Создайте каталог, организованный по:
1. Категория — Какой тип ошибки? 2. Триггер — Какой ввод или действие вызывает? 3. Симптом — Что видит пользователь? 4. Вероятность — Насколько часто встречается в вашей области?
Пример записей каталога:
| Категория | Триггер | Симптом | Вероятность |
|---|---|---|---|
| Ввод | Вставка текста со скрытыми Unicode-символами | Повреждение данных | Средняя |
| Время | Отправка во время автосохранения | Дубликат или потеря данных | Высокая |
| Авторизация | Токен истекает в многошаговой форме | Тихий отказ, потеря работы | Высокая |
| Данные | Импорт CSV с лишними столбцами | Crash или неверный маппинг | Средняя |
| Отображение | Очень длинный текст без пробелов | Поломка вёрстки | Высокая |
| Локализация | Поле даты ДД/ММ vs ММ/ДД | Неверная дата сохранена | Высокая |
Комбинирование с формальными техниками
Лучшая практика:
- Сначала применить формальные техники
- Затем предугадывание для поиска упущенного
- Сфокусировать предугадывание на областях наибольшего риска
Упражнение: Сессия предугадывания ошибок
Сценарий: Вы тестируете страницу редактирования профиля с полями: Имя, Биография (макс 500 символов), Загрузка фото профиля, Дата рождения, URL сайта.
Задание: Сгенерируйте минимум 10 тест-кейсов предугадывания ошибок, организованных по категориям.
Подсказка
Подумайте о каждом поле: что самое плохое может ввести пользователь? Что на границах? А edge cases загрузки файлов (0 байт, 10ГБ, неверный формат, исполняемый файл)? А edge cases дат (будущая дата, 29 фев, год 0)?
Решение
| # | Категория | Тест | Обоснование |
|---|---|---|---|
| 1 | Ввод | Имя = <img src=x onerror=alert(1)> | XSS в хранимом поле |
| 2 | Ввод | Биография = ровно 500 + ещё 1 символ | Проверка границы |
| 3 | Ввод | Биография из одних эмодзи (500 шт) | Подсчёт Unicode-символов |
| 4 | Загрузка | Фото = файл 0 байт | Обработка пустого файла |
| 5 | Загрузка | Фото = переименованный .exe в .jpg | Обход валидации типа |
| 6 | Загрузка | Фото = изображение 50МБ | Проверка ограничения размера |
| 7 | Дата | Рождение = завтрашняя дата | Будущая дата невалидна |
| 8 | Дата | Рождение = 29 фев 2023 (не високосный) | Обработка невалидной даты |
| 9 | URL | Сайт = javascript:alert(1) | XSS через схему URL |
| 10 | URL | Сайт = очень длинный URL (2000+ символов) | Валидация длины |
| 11 | Состояние | Изменить имя, не сохранить, уйти со страницы | Предупреждение о несохранённых? |
| 12 | Параллельность | Редактировать профиль в двух вкладках | Last-write-wins или конфликт? |
Советы профессионала
- Ведите личный дневник багов. Записывайте каждый интересный баг — со временем это станет вашим самым ценным активом тестирования.
- Учитесь на инцидентах в продакшене. Post-mortem выявляют паттерны ошибок, которые формальный тест-дизайн редко покрывает.
- Думайте как злоумышленник. Изучите OWASP Top 10 для паттернов тестирования веб-приложений.
- Учитывайте окружение пользователя. Медленные сети, старые браузеры, блокировщики рекламы, средства доступности — создают ошибки, которые разработчики редко предвидят.
- Делитесь каталогом с командой. Командная таксономия дефектов мощнее индивидуального знания.