Что такое предугадывание ошибок?

Предугадывание ошибок (Error Guessing) — техника тест-дизайна на основе опыта, при которой тестировщики используют знание типичных ошибок, характерных дефектов и прошлых отказов для предвидения того, где программа с наибольшей вероятностью сломается.

Почему предугадывание работает

Опытные тестировщики развивают интуицию о местах концентрации дефектов. Это приходит из:

  • Лет нахождения похожих багов в разных проектах
  • Знания типичных ошибок программирования
  • Понимания поведения пользователей, ломающего софт
  • Осведомлённости о точках интеграции, которые часто отказывают

Подход с таксономией дефектов

Чтобы сделать предугадывание систематическим, создайте таксономию дефектов:

graph TD A[Таксономия дефектов] --> B[Ошибки ввода] A --> C[Ошибки вычислений] A --> D[Ошибки состояний] A --> E[Ошибки интеграции] A --> F[Ошибки окружения] B --> B1[Null/пустой ввод] B --> B2[Спецсимволы] B --> B3[Очень длинный ввод] B --> B4[Unicode/кодировка] C --> C1[Деление на ноль] C --> C2[Переполнение целого] C --> C3[Ошибки округления] D --> D1[Race conditions] D --> D2[Устаревшие данные] E --> E1[Таймаут API] E --> E2[Обрыв сети] F --> F1[Диск полон] F --> F2[Мало памяти]

Типичные категории ошибок

Обработка ввода:

Паттерн ошибкиТест
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 ММ/ДДНеверная дата сохраненаВысокая

Комбинирование с формальными техниками

flowchart LR A[EP + BVA] --> B[Систематическое покрытие] C[Таблицы решений] --> B D[Предугадывание ошибок] --> E[Покрытие пробелов] B --> F[Комбинированный набор тестов] E --> F

Лучшая практика:

  1. Сначала применить формальные техники
  2. Затем предугадывание для поиска упущенного
  3. Сфокусировать предугадывание на областях наибольшего риска

Упражнение: Сессия предугадывания ошибок

Сценарий: Вы тестируете страницу редактирования профиля с полями: Имя, Биография (макс 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 (не високосный)Обработка невалидной даты
9URLСайт = javascript:alert(1)XSS через схему URL
10URLСайт = очень длинный URL (2000+ символов)Валидация длины
11СостояниеИзменить имя, не сохранить, уйти со страницыПредупреждение о несохранённых?
12ПараллельностьРедактировать профиль в двух вкладкахLast-write-wins или конфликт?

Советы профессионала

  • Ведите личный дневник багов. Записывайте каждый интересный баг — со временем это станет вашим самым ценным активом тестирования.
  • Учитесь на инцидентах в продакшене. Post-mortem выявляют паттерны ошибок, которые формальный тест-дизайн редко покрывает.
  • Думайте как злоумышленник. Изучите OWASP Top 10 для паттернов тестирования веб-приложений.
  • Учитывайте окружение пользователя. Медленные сети, старые браузеры, блокировщики рекламы, средства доступности — создают ошибки, которые разработчики редко предвидят.
  • Делитесь каталогом с командой. Командная таксономия дефектов мощнее индивидуального знания.