«Не работает кнопка» — такой баг-репорт отправляет разработчика на 40 минут поиска проблемы. Какая кнопка? На какой странице? В каком браузере? Плохо написанный баг-репорт — это потерянное время всей команды: тестировщика, который будет отвечать на вопросы, разработчика, который не может начать фикс, менеджера, который ждёт релиз. Хороший баг-репорт экономит часы. Эта статья — практическое руководство для QA: как описывать баги так, чтобы разработчик сразу понял проблему, воспроизвёл её и исправил.
1. Цена плохого баг-репорта
Статистика времени
| Показатель | Значение |
|---|---|
| Время на разбор плохого баг-репорта | 20–40 минут |
| Время на разбор хорошего баг-репорта | 2–5 минут |
| Среднее количество вопросов к плохому репорту | 5–8 сообщений |
| Среднее количество вопросов к хорошему репорту | 0–1 сообщение |
| Доля багов, отклонённых из-за недостатка информации | 15–25% |
| Время на переоткрытие и доработку репорта | 30–60 минут |
Что происходит с плохим баг-репортом
| Этап | Действие | Время |
|---|---|---|
1. Получение | Разработчик читает «не работает кнопка» | 1 мин |
2. Уточнение | Пишет вопросы: «Какая кнопка? Где? Что не работает?» | 5 мин |
3. Ожидание | Ждёт ответа тестировщика (переключился на другую задачу) | 2–4 часа |
4. Получение ответа | Получает дополнительную информацию | 1 мин |
5. Воспроизведение | Пытается воспроизвести (может не получиться с первого раза) | 10–20 мин |
6. Уточнение снова | Если не воспроизвёл — новая серия вопросов | +2–3 часа |
Итого: от обнаружения бага до начала фикса проходит 5–8 часов вместо 10–15 минут.
Что даёт хороший баг-репорт
| Выгода | Для тестировщика | Для разработчика | Для проекта |
|---|---|---|---|
Скорость | Меньше вопросов, меньше переписки | Сразу понятна проблема | Быстрее релиз |
Качество фикса | Баг исправлен правильно с первого раза | Понятен контекст, можно найти root cause | Меньше регрессий |
Репутация | Команда доверяет твоим репортам | Приятно работать с таким QA | Эффективный процесс |
Карьера | Быстрее растёшь как специалист | — | — |
Цена ошибки
| Сценарий | Последствия |
|---|---|
Критичный баг описан плохо | Релиз задерживается на день, теряется выручка |
Баг не воспроизводится | Закрывается как «Cannot reproduce», уходит в прод |
Баг описан неполно | Разработчик фиксит не ту проблему, баг остаётся |
Нет логов/скриншотов | Невозможно понять причину, баг переоткрывается |
2. Анатомия хорошего баг-репорта
Обязательные элементы
| Элемент | Описание | Обязателен? |
|---|---|---|
Заголовок (Summary) | Краткое описание: Что? Где? Когда? | Да |
Окружение (Environment) | ОС, браузер, версия приложения | Да |
Шаги воспроизведения (Steps to Reproduce) | Пошаговая инструкция | Да |
Ожидаемый результат (Expected Result) | Что должно было произойти | Да |
Фактический результат (Actual Result) | Что произошло на самом деле | Да |
Приоритет (Priority) | Насколько срочно исправить | Да |
Серьёзность (Severity) | Насколько сильно влияет на систему | Да |
Скриншот/Видео | Визуальное подтверждение | Для UI-багов — да |
Логи (Logs) | Ошибки из консоли/сервера | Для технических багов — да |
ID тест-кейса | Ссылка на тест-кейс, если есть | Желательно |
Пример: плохой vs хороший баг-репорт
Плохой баг-репорт
| Поле | Значение |
|---|---|
Заголовок | Не работает кнопка |
Описание | Нажал на кнопку, ничего не произошло |
Шаги | — |
Окружение | — |
Скриншот | — |
Проблемы: Какая кнопка? На какой странице? В каком браузере? Что должно было произойти?
Хороший баг-репорт
| Поле | Значение |
|---|---|
Заголовок | Кнопка «Оплатить» на странице корзины не отправляет форму в Chrome 120 |
Окружение | Windows 11, Chrome 120.0.6099.109, prod (v2.5.1) |
Шаги | 1. Открыть /cart 2. Добавить товар в корзину 3. Нажать «Оплатить» |
Ожидаемый результат | Открывается страница оплаты /checkout |
Фактический результат | Ничего не происходит, в консоли ошибка: TypeError: Cannot read property 'submit' of null |
Приоритет | High |
Severity | Critical (блокирует покупки) |
Скриншот | Прикреплён: console-error.png |
Почему хорошо: Разработчик сразу знает, где искать проблему (форма оплаты), видит ошибку, понимает окружение.
Структура идеального репорта
| Раздел | Что включить | Примерный объём |
|---|---|---|
Заголовок | Краткое описание + где + в каких условиях | 60–100 символов |
Окружение | ОС, браузер/устройство, версия билда | 1 строка |
Предусловия | Что нужно сделать до начала шагов (роль, данные) | 1–3 строки |
Шаги | Нумерованный список конкретных действий | 3–8 шагов |
Ожидаемый результат | Что должно произойти по спецификации | 1–2 предложения |
Фактический результат | Что произошло + текст ошибки | 1–3 предложения |
Вложения | Скриншоты, видео, логи, HAR-файл | 1–5 файлов |
3. Заголовок: формула идеального названия
Формула заголовка
[Что не работает] + [Где] + [При каких условиях]
| Компонент | Описание | Пример |
|---|---|---|
Что не работает | Конкретный элемент/функция | «Кнопка Сохранить», «Поиск по товарам», «Загрузка файла» |
Где | Страница/модуль/раздел | «на странице профиля», «в модальном окне регистрации» |
При каких условиях | Окружение или триггер | «в Safari», «при пустом поле email», «после 3-го клика» |
Примеры заголовков
| Плохо | Хорошо | Почему хорошо |
|---|---|---|
| Ошибка на странице | 500 Internal Server Error на /api/users при GET-запросе без токена | Указан код ошибки, эндпоинт, условие |
| Не работает форма | Форма регистрации не отправляется при вводе email с кириллицей | Понятно какая форма и при каких данных |
| Баг с кнопкой | Кнопка «Добавить в избранное» не меняет цвет при клике в Firefox 121 | Конкретная кнопка, действие, браузер |
| Проблема с загрузкой | Загрузка PDF-файлов >10 МБ зависает на 50% в Chrome на MacOS | Тип файла, размер, окружение, стадия |
| Текст обрезается | Название товара обрезается после 20 символов в карточках каталога на мобильных | Что обрезается, где, на каких устройствах |
Шаблоны заголовков для разных типов багов
| Тип бага | Шаблон | Пример |
|---|---|---|
UI-баг | [Элемент] неправильно отображается [где] [на каком устройстве] | Логотип накладывается на меню в хедере на экранах 768px |
Функциональный | [Действие] не работает [где] [при условии] | Сортировка по цене не работает в каталоге при выбранных фильтрах |
API | [Код ошибки] на [эндпоинт] [при каких данных] | 400 Bad Request на POST /orders при пустом поле delivery_address |
Performance | [Действие] медленно выполняется [где] [при каких данных] | Загрузка списка заказов занимает 15 сек в админке при 1000+ записей |
Security | [Уязвимость] в [модуле] позволяет [что] | XSS-уязвимость в форме комментариев позволяет выполнить произвольный JS |
Локализация | [Текст] не переведён [где] [на каком языке] | Текст ошибки валидации не переведён в форме логина на немецком |
Чего избегать в заголовке
| Плохая практика | Почему плохо | Что делать |
|---|---|---|
| «Не работает» | Слишком общее | Указать, что именно: не отправляется, не открывается, возвращает ошибку |
| «Баг в продакшене» | Окружение — не главное в заголовке | Описать проблему, окружение — в поле Environment |
| Эмоции: «Ужасный баг!!!» | Непрофессионально | Факты, priority/severity покажут важность |
| «Срочно!!!» | Priority/Severity для этого | Использовать поля Priority: Critical, Severity: Blocker |
| Технические детали | Заголовок для быстрого понимания | Стектрейсы и логи — в описание |
4. Шаги воспроизведения: как писать правильно
Золотые правила шагов воспроизведения
| Правило | Описание | Пример |
|---|---|---|
1. Нумеруй | Каждый шаг — отдельный пункт | 1. Открыть... 2. Кликнуть... 3. Ввести... |
2. Конкретика | Точные названия, значения, URL | Не «нажать кнопку», а «нажать кнопку "Отправить" в правом верхнем углу» |
3. Полнота | Все шаги от входа до бага | Включая логин, навигацию, ввод данных |
4. Минимализм | Только необходимые шаги | Без «включить компьютер», «открыть браузер» (если это само собой) |
5. Воспроизводимость | Другой человек должен повторить | Проверь на коллеге: он смог воспроизвести? |
Структура шагов
| Раздел | Что писать |
|---|---|
Предусловия (Preconditions) | Что нужно подготовить: роль пользователя, данные, состояние системы |
Шаг 1, 2, 3... | Последовательность действий: глагол + объект + детали |
Ожидаемый результат | Что должно произойти после последнего шага |
Фактический результат | Что произошло на самом деле |
Примеры шагов: плохо vs хорошо
Пример 1: Форма регистрации
| Плохо | Хорошо |
|---|---|
| 1. Зайти на сайт 2. Зарегистрироваться 3. Ошибка | Предусловия: Пользователь не авторизован |
Пример 2: API-запрос
| Плохо | Хорошо |
|---|---|
| Отправить запрос на сервер, получить ошибку | Предусловия: Пользователь авторизован, токен валиден |
Уровень детализации
| Ситуация | Уровень детализации | Пример |
|---|---|---|
Новый функционал | Максимальный | Указать каждый клик, каждое поле, каждое значение |
Известная часть системы | Средний | Можно объединить: «Авторизоваться как admin (admin/admin123)» |
Очевидные действия | Минимальный | Не писать «навести курсор на кнопку», «кликнуть левой кнопкой мыши» |
Баг в специфическом кейсе | Максимальный в ключевых местах | Детально описать момент, где происходит баг |
Частые ошибки в шагах воспроизведения
| Ошибка | Почему плохо | Как исправить |
|---|---|---|
| Размытые формулировки | «Нажать на что-то», «ввести данные» — непонятно что | Конкретные названия и значения |
| Пропущенные шаги | Разработчик не может воспроизвести | Записывай шаги во время тестирования |
| Лишние шаги | Загромождают репорт, отвлекают | Убрать всё, что не влияет на баг |
| «Сделать несколько раз» | Сколько именно? | «Нажать 3 раза», «повторить до появления ошибки (обычно 5–7 попыток)» |
| Без предусловий | Неясна роль, данные, состояние | Добавить блок Preconditions |
| Шаги в прошедшем времени | «Я нажал, я ввёл» — неудобно читать | Императив: «Нажать», «Ввести», «Открыть» |
Чек-лист хороших шагов
Шаги пронумерованы
Указаны предусловия (роль, данные)
Каждый шаг — одно конкретное действие
Указаны точные названия элементов (кнопок, полей)
Указаны точные значения (что вводить, что выбирать)
Коллега смог воспроизвести по этим шагам
Нет лишних шагов (только необходимые)
Шаги написаны в императиве (не «я нажал», а «нажать»)
5. Ожидаемое vs фактическое поведение
Почему это важно
| Причина | Описание |
|---|---|
Понимание проблемы | Разработчик видит разницу между должным и есть |
Валидация бага | Иногда «баг» — это ожидание, не совпадающее со спецификацией |
Приоритизация | Чем больше разрыв ОР и ФР, тем серьёзнее баг |
Тестирование фикса | ОР — критерий приёмки исправления |
Как писать ожидаемый результат
| Принцип | Описание | Пример |
|---|---|---|
Ссылка на источник | Откуда взято ожидание | «Согласно ТЗ п.3.2», «По макету Figma», «Как в требованиях USER-123» |
Конкретика | Точное описание | Не «всё работает», а «появляется уведомление "Товар добавлен в корзину"» |
Измеримость | Если можно — числа | «Загрузка занимает до 2 сек», «Отображается 10 товаров на странице» |
Полнота | Всё, что должно произойти | «Открывается страница X, показывается сообщение Y, кнопка Z становится неактивной» |
Как писать фактический результат
| Принцип | Описание | Пример |
|---|---|---|
Точность | Что именно произошло | «Показывается пустая страница», «Кнопка не реагирует на клик» |
Текст ошибки | Скопировать текст как есть |
|
Воспроизводимость | Всегда или иногда | «Происходит в 100% случаев», «Воспроизводится 3 из 5 попыток» |
Визуальное описание | Что видит пользователь | «Кнопка серая вместо зелёной», «Текст выходит за границы контейнера» |
Примеры ОР vs ФР
Пример 1: Функциональный баг
| Тип | Описание |
|---|---|
Ожидаемый результат | После нажатия кнопки «Добавить в корзину» появляется уведомление «Товар добавлен», счётчик корзины увеличивается на 1, товар отображается в /cart |
Фактический результат | Уведомление появляется, счётчик увеличивается, но в /cart товар отсутствует. В консоли: POST /api/cart 500 Internal Server Error |
Пример 2: UI-баг
| Тип | Описание |
|---|---|
Ожидаемый результат | Согласно макету Figma: кнопка «Купить» имеет цвет #10b981, размер 48px высотой, шрифт 16px |
Фактический результат | Кнопка «Купить» имеет цвет #10c982 (не соответствует), размер 44px высотой, шрифт 14px. См. скриншот button-diff.png |
Пример 3: Performance-баг
| Тип | Описание |
|---|---|
Ожидаемый результат | Согласно NFR: загрузка страницы каталога должна занимать не более 3 секунд при 1000 товарах |
Фактический результат | Загрузка страницы каталога занимает 12–15 секунд (измерено в Chrome DevTools → Network). При 500 товарах — 6 сек, при 1500 — 20 сек |
Частые ошибки
| Ошибка | Почему плохо | Как исправить |
|---|---|---|
| Нет ожидаемого результата | Неясно, баг это или фича | Всегда указывать ОР |
| ОР = «должно работать» | Слишком общее | Описать, что именно должно произойти |
| ФР = «не работает» | Непонятно, что именно не так | Описать, что конкретно происходит |
| ОР не из документации | Личное мнение ≠ требование | Ссылаться на ТЗ, макет, тикет |
| Нет текста ошибки в ФР | Разработчик не видит причину | Скопировать сообщение об ошибке |
6. Окружение (Environment): что указывать
Обязательные параметры окружения
| Параметр | Описание | Пример |
|---|---|---|
Операционная система | ОС + версия | Windows 11 Pro 23H2, macOS Sonoma 14.2, Ubuntu 22.04 |
Браузер | Браузер + версия (для веб) | Chrome 120.0.6099.109, Firefox 121.0, Safari 17.2 |
Устройство | Для мобильных/планшетов | iPhone 15 Pro, Samsung Galaxy S23, iPad Air 5 |
Разрешение экрана | Для адаптива/UI-багов | 1920x1080, 375x667 (iPhone SE), 768x1024 |
Версия приложения | Билд/релиз/коммит | v2.5.1, build 1234, commit a3f5e2b |
Окружение | Prod/staging/dev | Production, Staging (https://staging.example.com), Dev |
Дополнительные параметры (при необходимости)
| Параметр | Когда указывать | Пример |
|---|---|---|
Язык интерфейса | Баги локализации | Русский, Английский, Немецкий |
Часовой пояс | Баги с датой/временем | UTC+3 (Москва), UTC-5 (New York) |
Скорость интернета | Performance-баги, загрузки | 100 Мбит/с, 4G (10 Мбит/с), 3G (1 Мбит/с) |
Расширения браузера | Если влияют на баг | AdBlock Plus 3.15, React DevTools |
Роль пользователя | Баги с правами доступа | Admin, User, Guest, Moderator |
База данных | Backend-баги | PostgreSQL 15.3, MongoDB 6.0 |
Формат записи окружения
Веб-приложение
OS: Windows 11 Pro (23H2)
Browser: Chrome 120.0.6099.109
Resolution: 1920x1080
Version: v2.5.1 (prod)
URL: https://example.comМобильное приложение
Device: iPhone 15 Pro
OS: iOS 17.2
App version: 3.1.0 (build 456)
Network: Wi-Fi (100 Mbps)API
Environment: Staging
API version: v2
Server: api-staging.example.com
Database: PostgreSQL 15.3Как быстро собрать информацию
| Информация | Как узнать |
|---|---|
Версия браузера | Chrome: chrome://versionFirefox: about:supportSafari: Safari → About Safari |
ОС и версия | Windows: Win+R → winvermacOS: Apple → About This Mac Linux: lsb_release -a |
Разрешение экрана | Windows: Settings → Display macOS: Displays settings Browser: F12 → Console → screen.width + 'x' + screen.height |
Версия приложения | Footer сайта, Settings → About, DevTools → Console |
User Agent | F12 → Console → navigator.userAgentИли сайт: https://www.whatismybrowser.com |
Частые ошибки
| Ошибка | Почему плохо | Как исправить |
|---|---|---|
| Нет версии браузера | «Chrome» — какой версии? Баг может быть только в определённой | Указывать полную версию: Chrome 120.0.6099.109 |
| «Винда» вместо Windows | Непрофессионально | Официальные названия: Windows, macOS, Linux |
| Только «prod» | Prod чего? Какой домен? | Указать URL или environment name |
| Лишняя информация | Загромождает репорт | Не писать «Intel Core i7» для UI-бага, если не влияет |
7. Приоритет (Priority) и Серьёзность (Severity)
Разница между Priority и Severity
| Критерий | Severity (Серьёзность) | Priority (Приоритет) |
|---|---|---|
Что показывает | Насколько сильно баг влияет на систему | Насколько срочно нужно исправить |
Кто определяет | Тестировщик (техническая оценка) | Product Manager / Team Lead (бизнес-оценка) |
Зависит от | Технического влияния на функциональность | Бизнес-целей, дедлайнов, пользователей |
Может меняться? | Редко (объективный факт) | Часто (в зависимости от обстоятельств) |
Правило: Severity = насколько плохо ломается. Priority = как быстро надо чинить.
Уровни Severity
| Уровень | Описание | Примеры |
|---|---|---|
Blocker (S1) | Блокирует работу системы полностью | Сайт не открывается, приложение крашится при запуске, невозможно залогиниться |
Critical (S2) | Основная функциональность не работает | Не работает оплата, не отправляются заказы, потеря данных пользователя |
Major (S3) | Важная функция не работает, но есть workaround | Фильтры в каталоге не работают (можно искать вручную), форма не валидирует email |
Minor (S4) | Незначительная проблема, не влияет на работу | Некорректное сообщение об ошибке, неудобный UI, мелкие баги дизайна |
Trivial (S5) | Косметические дефекты | Опечатка в тексте, неровный отступ, цвет не точно по макету |
Уровни Priority
| Уровень | Описание | Когда использовать |
|---|---|---|
Critical (P1) | Исправить немедленно (hotfix) | Prod сломан, пользователи не могут работать, теряются деньги |
High (P2) | Исправить в текущем спринте | Важная фича не работает, но есть workaround |
Medium (P3) | Исправить в следующем спринте | Баг влияет на часть пользователей или редкий сценарий |
Low (P4) | Исправить когда будет время | Nice to have, не влияет на бизнес |
Матрица Severity vs Priority
| Severity / Priority | Critical (P1) | High (P2) | Medium (P3) | Low (P4) |
|---|---|---|---|---|
Blocker (S1) | Prod недоступен | — | — | — |
Critical (S2) | Оплата не работает перед чёрной пятницей | Оплата не работает в обычный день | — | — |
Major (S3) | Важная фича сломана перед демо инвесторам | Важная фича сломана | Фича работает, но неудобно | — |
Minor (S4) | — | Баг на главной странице | Баг в админке | Баг в редком сценарии |
Trivial (S5) | — | — | Опечатка на главной | Опечатка в футере |
Примеры комбинаций
High Severity + Low Priority
Баг: Критичная уязвимость безопасности в старой версии API, которую никто не использует.
Почему так: Технически серьёзно (S2), но не срочно (P4), т.к. никто не пострадает.
Low Severity + High Priority
Баг: Опечатка в названии компании на главной странице сайта.
Почему так: Технически мелочь (S5), но срочно (P2), т.к. видят все клиенты.
High Severity + High Priority
Баг: На prod не работает регистрация новых пользователей.
Почему так: Критичная функция сломана (S2), блокирует рост (P1).
Как определить Severity (для тестировщика)
| Вопрос | Если ДА → Severity |
|---|---|
| Система полностью не работает? | Blocker (S1) |
| Основная функция не работает (оплата, регистрация, заказ)? | Critical (S2) |
| Важная функция не работает, но есть обходной путь? | Major (S3) |
| Функция работает, но неудобно/некорректно? | Minor (S4) |
| Это визуальный дефект или опечатка? | Trivial (S5) |
Частые ошибки
| Ошибка | Почему плохо | Как исправить |
|---|---|---|
| Всё помечать как Critical | Обесценивается приоритизация | Реально оценивать влияние |
| Путать Severity и Priority | Разработчики не понимают, что важнее | Severity = техническое влияние, Priority = бизнес-срочность |
| Не согласовывать Priority с PM | Тестировщик не знает бизнес-контекст | Предложить Severity, PM установит Priority |
| Не обновлять Priority | Баг мог стать срочнее/менее срочным | Пересматривать перед спринтом |
8. Скриншоты, видео, логи: что прикладывать
Что прикладывать к баг-репорту
| Тип бага | Что прикладывать | Обязательно? |
|---|---|---|
UI-баг (статичный) | Скриншот + аннотации | Да |
UI-баг (анимация, ховер) | Видео/GIF + скриншот | Да |
Функциональный баг | Видео шагов + скриншот ошибки + логи из консоли | Видео желательно |
API-баг | Request/Response из DevTools + cURL команда | Да |
Performance-баг | Скриншот метрик из DevTools → Performance/Network | Да |
Crash/Error | Логи из консоли + stack trace + видео до краша | Да |
Security-баг | Видео эксплойта + payload (если безопасно) | Да |
Скриншоты: как делать правильно
| Принцип | Описание | Инструменты |
|---|---|---|
Полный экран или область | Для UI-багов — область, для контекста — весь экран | Windows: Win+Shift+S, macOS: Cmd+Shift+4 |
Аннотации | Стрелки, рамки, текст для выделения проблемы | Lightshot, Monosnap, Snagit, встроенные редакторы |
Качество | PNG для чёткости (не JPG с артефактами) | Настройки скриншотера |
Размер | Оптимизировать большие файлы (до 1–2 МБ) | TinyPNG, ImageOptim |
Naming | Понятные имена: cart-button-error.png | — |
Видео: когда нужно и как записывать
| Ситуация | Почему видео лучше |
|---|---|
Сложная последовательность шагов | Разработчик видит весь флоу |
Анимации, переходы, ховеры | Скриншот не покажет динамику |
Intermittent баги | Видео доказывает, что баг был |
Race conditions | Видно тайминги и порядок событий |
Краши | Контекст до момента краша |
Инструменты для записи видео
| Инструмент | Платформа | Особенности |
|---|---|---|
Loom | Веб, Chrome extension | Запись с камерой, голосом, облачное хранение |
OBS Studio | Windows, macOS, Linux | Бесплатно, мощный, для профи |
ShareX | Windows | Бесплатно, скриншоты + видео + GIF |
QuickTime Player | macOS | Встроенный, запись экрана |
Jam | Chrome extension | Автоматически собирает логи + видео + данные окружения |
Формат и длина видео
| Параметр | Рекомендация |
|---|---|
Длина | 30–90 секунд (только шаги воспроизведения) |
Формат | MP4 или WebM (сжатый), для Slack/Jira — GIF |
Разрешение | 1080p или нативное разрешение экрана |
FPS | 30 fps (достаточно для UI) |
Размер файла | До 10–20 МБ (сжимать если больше) |
Логи: какие и как собирать
Типы логов
| Тип | Где взять | Когда нужен |
|---|---|---|
Console logs | F12 → Console (в браузере) | Всегда для фронтенд-багов |
Network logs | F12 → Network → Export HAR | API-баги, загрузки, таймауты |
Application logs | Логи сервера (если доступ есть) | Backend-баги, 500-ошибки |
System logs | Event Viewer (Win), Console.app (Mac) | Краши приложений, нативные баги |
Mobile logs | Xcode Console (iOS), Logcat (Android) | Мобильные приложения |
Как оформлять логи
| Формат | Когда использовать | Пример |
|---|---|---|
Инлайн (в тексте) | Короткие ошибки (1–3 строки) |
|
Code block | Средние логи (до 20 строк) | Блок кода в Markdown/Jira |
Файл (.txt, .log) | Длинные логи, stack traces | Прикрепить error.log |
Скриншот консоли | Если нужен визуальный контекст (цвета ошибок) | console-error.png |
HAR-файлы для API-багов
HAR (HTTP Archive) — файл со всей информацией о сетевых запросах.
| Шаг | Действие |
|---|---|
1. Открыть DevTools | F12 → Network |
2. Воспроизвести баг | Выполнить шаги, пока не появится ошибка |
3. Экспортировать HAR | ПКМ на списке запросов → Save all as HAR with content |
4. Прикрепить к репорту | Файл содержит все запросы, headers, body, timing |
Чек-лист вложений
Скриншот проблемы (для UI-багов)
Видео воспроизведения (для сложных багов)
Логи из консоли браузера (всегда проверять)
HAR-файл (для API/network багов)
Аннотации на скриншоте (стрелки, рамки)
Понятные имена файлов (не screenshot1.png)
Оптимизированный размер (до 10 МБ видео, до 2 МБ скриншот)
Частые ошибки
| Ошибка | Почему плохо | Как исправить |
|---|---|---|
| Нет скриншота для UI-бага | Разработчик не видит проблему | Всегда прикладывать скриншот |
| Скриншот без аннотаций | Непонятно, что именно не так | Добавить стрелку/рамку на проблему |
| Видео 5 минут | Никто не будет смотреть | Обрезать до шагов воспроизведения (30–90 сек) |
| Логи в скриншоте | Нельзя скопировать текст | Текстом в code block или файлом |
| Огромные файлы (50+ МБ) | Долго загружаются, не открываются | Сжать или обрезать |
9. Типы багов и шаблоны описания
Функциональные баги
| Поле | Что писать |
|---|---|
Заголовок | [Функция] не работает [где] [при условии] |
Шаги | Детальная последовательность действий |
Ожидаемый результат | Согласно ТЗ/требованиям |
Фактический результат | Что произошло + текст ошибки |
Вложения | Видео + console logs + скриншот |
Пример:
Заголовок: Фильтр по цене не применяется в каталоге товаров после выбора категории
Окружение: Chrome 120, Windows 11, prod v2.5
Шаги:
1. Открыть /catalog
2. Выбрать категорию "Электроника"
3. В фильтре "Цена" ввести: От 1000, До 5000
4. Нажать "Применить"
Ожидаемый результат: Отображаются товары с ценой от 1000 до 5000 руб.
Фактический результат: Отображаются все товары категории, фильтр игнорируется
Вложения: video.mp4, console-error.pngUI/UX баги
| Поле | Что писать |
|---|---|
Заголовок | [Элемент] отображается неправильно [где] [на каком устройстве/разрешении] |
Ожидаемый результат | Ссылка на макет Figma + параметры (цвет, размер, отступы) |
Фактический результат | Что не так + измеренные значения |
Вложения | Скриншот факт vs макет (side-by-side) |
Пример:
Заголовок: Кнопка "Купить" имеет неправильный цвет и размер на карточках товаров
Окружение: Safari 17.2, macOS Sonoma, prod
ОР: Согласно макету Figma [ссылка]:
- Цвет: #10b981
- Высота: 48px
- Шрифт: 16px, medium
ФР:
- Цвет: #10c982 (не соответствует)
- Высота: 44px
- Шрифт: 14px
Вложения: comparison.png (макет слева, факт справа)API баги
| Поле | Что писать |
|---|---|
Заголовок | [Код ответа] на [метод] [endpoint] [при каких данных] |
Шаги | cURL команда или Postman collection |
Ожидаемый результат | Код ответа + структура JSON по документации |
Фактический результат | Код ответа + реальный JSON + headers |
Вложения | HAR-файл, скриншот из Postman/DevTools |
Пример:
Заголовок: 500 Internal Server Error на POST /api/orders при пустом поле delivery_address
Окружение: Staging API v2, PostgreSQL 15.3
Шаги (cURL):
curl -X POST https://api-staging.example.com/orders \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"product_id": 123, "quantity": 2, "delivery_address": ""}'
ОР: 400 Bad Request с сообщением "delivery_address is required"
ФР: 500 Internal Server Error
Response:
{
"error": "Database constraint violation: delivery_address cannot be null"
}
Вложения: request-response.harPerformance баги
| Поле | Что писать |
|---|---|
Заголовок | [Действие] выполняется медленно [где] [при каких данных] |
Ожидаемый результат | Норматив из NFR (например, < 3 сек) |
Фактический результат | Реальное время + метрики |
Вложения | Скриншот DevTools → Performance/Network, график |
Пример:
Заголовок: Загрузка страницы /catalog занимает 15 сек при 1000+ товарах
Окружение: Chrome 120, Windows 11, prod
ОР: Согласно NFR: загрузка страницы < 3 сек
ФР:
- При 500 товарах: 6 сек
- При 1000 товарах: 15 сек
- При 1500 товарах: 23 сек
Метрики (Chrome DevTools):
- DOMContentLoaded: 12.3s
- Load: 15.1s
- Largest Contentful Paint: 13.8s
Вложения: performance-flamegraph.png, network-waterfall.pngSecurity баги
Важно: Security-баги отправлять приватно (не в публичный трекер), по защищённым каналам.
| Поле | Что писать |
|---|---|
Заголовок | [Тип уязвимости] в [модуле] позволяет [что] |
Severity | Обычно Critical/Blocker |
Шаги | Proof of Concept (PoC) — как эксплуатировать |
Impact | Что может сделать атакующий |
Вложения | Видео эксплойта (если безопасно), payload |
Пример:
Заголовок: XSS-уязвимость в форме комментариев позволяет выполнить произвольный JS
Окружение: prod v2.5
Severity: Critical
Priority: P1
Шаги (PoC):
1. Открыть /product/123
2. В поле "Комментарий" ввести:
<script>alert(document.cookie)</script>
3. Нажать "Отправить"
ОР: Комментарий экранируется, отображается как текст
ФР: Скрипт выполняется, показывается alert с cookie
Impact: Атакующий может украсть сессии пользователей, выполнить действия от их имени
Recommendation: Экранировать HTML в комментариях на сервере
Вложения: xss-exploit.mp4 (НЕ публиковать)Локализация/i18n баги
| Поле | Что писать |
|---|---|
Заголовок | [Текст] не переведён / переведён неправильно [где] [на языке] |
Окружение | Обязательно указать язык интерфейса |
Ожидаемый результат | Правильный перевод (можно предложить свой) |
Вложения | Скриншот с выделенным текстом |
Пример:
Заголовок: Сообщение об ошибке валидации не переведено в форме логина на немецком
Окружение: Chrome 120, язык интерфейса: Deutsch (DE)
ОР: "E-Mail-Adresse ist ungültig"
ФР: "Email is invalid" (на английском)
Вложения: error-message-de.png
10. ТОП-10 ошибок в баг-репортах
| Место | Ошибка | Частота | Как избежать |
|---|---|---|---|
1 | Неинформативный заголовок | 70% | Использовать формулу: Что + Где + При каких условиях |
2 | Нет шагов воспроизведения | 65% | Всегда писать пронумерованные шаги |
3 | Нет ожидаемого/фактического результата | 60% | Обязательные поля в шаблоне |
4 | Нет информации об окружении | 55% | Указывать ОС, браузер, версию |
5 | Нет скриншотов для UI-багов | 50% | Всегда прикладывать скриншот с аннотациями |
6 | Размытые формулировки | 48% | Конкретика: не «нажать кнопку», а «нажать кнопку "Отправить"» |
7 | Несколько багов в одном репорте | 40% | 1 баг = 1 репорт (для отдельного трекинга) |
8 | Нет логов для технических багов | 38% | Всегда проверять консоль (F12) |
9 | Эмоции вместо фактов | 30% | Профессиональный тон, факты, метрики |
10 | Баг не воспроизводится | 25% | Проверить на другом устройстве/браузере перед отправкой |
Детали по каждой ошибке
Ошибка 1: Неинформативный заголовок
| Плохо | Почему плохо | Хорошо |
|---|---|---|
| Ошибка | Какая? Где? | 404 ошибка при переходе на /profile после логина |
| Не работает | Что именно? | Кнопка "Сохранить" в настройках профиля не отправляет форму |
| Баг в корзине | Что за баг? | Количество товара в корзине сбрасывается до 1 после обновления страницы |
Ошибка 2: Нет шагов воспроизведения
| Плохо | Хорошо |
|---|---|
| «Я нажал на кнопку и появилась ошибка» | 1. Открыть /cart 2. Нажать кнопку "Оплатить" 3. В модальном окне нажать "Подтвердить" → Появляется ошибка 500 |
| «Не могу зарегистрироваться» | 1. Открыть /register 2. Ввести email: test@test.com 3. Ввести пароль: Test123! 4. Нажать "Зарегистрироваться" → Ошибка "Email already exists" (хотя email новый) |
Ошибка 7: Несколько багов в одном репорте
| Плохо (всё в одном) | Хорошо (отдельные репорты) |
|---|---|
| «На странице профиля: 1. Кнопка не работает 2. Текст обрезается 3. Ошибка в консоли» | BUG-101: Кнопка "Сохранить" на /profile не работает BUG-102: Имя пользователя обрезается после 20 символов на /profile BUG-103: Console error "undefined" при открытии /profile |
Почему раздельно:
Разные разработчики могут фиксить
Разные приоритеты
Один баг может быть исправлен раньше других
Удобнее трекать статус
Ошибка 9: Эмоции вместо фактов
| Плохо | Хорошо |
|---|---|
| «СРОЧНО!!! ВСЁ СЛОМАЛОСЬ!!!» | Priority: Critical, Severity: Blocker |
| «Ужасный баг, надо срочно чинить» | Конкретное описание проблемы и влияния |
| «Кто это вообще писал?!» | Профессиональный тон |
| «По-моему, тут должно быть по-другому» | «Согласно ТЗ п.3.2, должно быть X» |
Ошибка 10: Баг не воспроизводится
Чек-лист перед отправкой:
Воспроизвёл баг минимум 2 раза подряд
Проверил на другом браузере (если возможно)
Проверил в инкогнито (чтобы исключить расширения)
Проверил на другом аккаунте (чтобы исключить специфичные данные)
Если баг intermittent — указал частоту (3 из 5 попыток)
Если не могу воспроизвести снова — записал видео до того, как баг пропал
11. Инструменты для баг-трекинга
Популярные баг-трекеры
| Инструмент | Плюсы | Минусы | Для кого |
|---|---|---|---|
Jira | Стандарт индустрии, интеграции, Agile | Тяжёлый, сложный для новичков, дорогой | Enterprise, большие команды |
Linear | Быстрый, красивый, современный | Меньше интеграций, дорогой | Стартапы, продуктовые команды |
GitHub Issues | Бесплатный, простой, интеграция с кодом | Базовый функционал | Open-source, небольшие команды |
GitLab Issues | DevOps-фичи, CI/CD, self-hosted | Сложнее GitHub | DevOps-команды |
YouTrack | Гибкие workflows, бесплатный для малых команд | Меньше популярен | JetBrains-экосистема |
Asana | Простой, для таск-менеджмента | Не заточен под багтрекинг | Небольшие команды, не-технические |
ClickUp | Всё-в-одном, настраиваемый | Может быть overwhelming | Команды любого размера |
Bugzilla | Open-source, старый и надёжный | Устаревший UI | Legacy-проекты |
Сравнение возможностей
| Функция | Jira | Linear | GitHub | YouTrack |
|---|---|---|---|---|
Шаблоны баг-репортов | ✅ | ✅ | ✅ | ✅ |
Кастомные поля | ✅ | ✅ | Ограниченно | ✅ |
Attachments | ✅ | ✅ | ✅ | ✅ |
Workflows | ✅ Гибкие | ✅ Простые | ❌ | ✅ Гибкие |
Интеграция с Git | ✅ | ✅ | ✅ Нативная | ✅ |
API | ✅ | ✅ | ✅ | ✅ |
Цена (малая команда) | $$ | $$ | Free | Free |
Вспомогательные инструменты
Инструменты для записи багов
| Инструмент | Что делает | Интеграции |
|---|---|---|
Jam | Автоматически собирает логи, console, network, device info + видео | Jira, Linear, GitHub, Slack |
Bird Eats Bug | Запись видео + console + network с одной кнопки | Jira, GitHub, Trello |
Marker.io | Виджет на сайте: скриншот + аннотации → сразу в баг-трекер | Jira, GitHub, Trello, Asana |
Usersnap | Feedback widget + bug reporting | Jira, GitHub, Slack |
Browser extensions для тестировщиков
| Расширение | Назначение |
|---|---|
Bug Magnet | Автозаполнение тестовых данных (граничные значения, XSS-пейлоады) |
Pesticide | Показывает границы CSS-элементов (для UI-тестирования) |
WhatFont | Определяет шрифты на странице |
ColorZilla | Пипетка для определения цветов |
Check My Links | Проверяет битые ссылки на странице |
Lighthouse | Performance, Accessibility, SEO-аудит |
Шаблоны баг-репортов в Jira
Пример Issue Template
## Environment
- OS:
- Browser:
- Version:
- URL:
## Steps to Reproduce
1.
2.
3.
## Expected Result
## Actual Result
## Attachments
- [ ] Screenshot
- [ ] Video
- [ ] Console logs
- [ ] HAR file
## Additional Info
- Reproducibility: Always / Sometimes (X of Y tries)
- User role:
- Test case ID:Автоматизация баг-репортинга
| Сценарий | Инструмент/метод |
|---|---|
Авто-создание из CI/CD | При падении тестов → создать баг в Jira через API |
Авто-сбор логов | Sentry, LogRocket → автоматически создают issues при ошибках |
Интеграция с мониторингом | DataDog, New Relic → алерты превращаются в баги |
User-reported bugs | Feedback-виджет на сайте → автоматом в Jira |
12. Чек-лист идеального баг-репорта
Перед отправкой
| Пункт | Проверка |
|---|---|
Заголовок | ✅ Понятно: Что + Где + При каких условиях (60–100 символов) |
Воспроизводимость | ✅ Воспроизвёл баг минимум 2 раза ✅ Проверил в другом браузере (если возможно) |
Дубликаты | ✅ Проверил, нет ли уже такого бага в трекере |
Окружение | ✅ ОС + версия ✅ Браузер + версия ✅ Версия приложения ✅ URL/Environment |
Шаги | ✅ Пронумерованы ✅ Указаны предусловия ✅ Конкретные (точные названия, значения) ✅ Коллега смог бы воспроизвести |
ОР и ФР | ✅ Ожидаемый результат описан чётко ✅ Фактический результат с деталями ✅ Скопирован текст ошибки (если есть) |
Приоритеты | ✅ Severity установлен корректно ✅ Priority (если определяешь сам) |
Вложения | ✅ Скриншот (для UI-багов) ✅ Аннотации на скриншоте ✅ Видео (для сложных багов) ✅ Console logs ✅ HAR-файл (для API-багов) ✅ Понятные имена файлов |
Качество | ✅ Нет грамматических ошибок ✅ Профессиональный тон (без эмоций) ✅ Один баг = один репорт |
После отправки
| Действие | Зачем |
|---|---|
Отслеживать статус | Вовремя отвечать на вопросы разработчиков |
Дополнить при необходимости | Если разработчик просит больше информации |
Проверить фикс | Убедиться, что баг действительно исправлен |
Закрыть/переоткрыть | Обновить статус после проверки |
Критерии quality баг-репорта
| Критерий | Описание |
|---|---|
Понятность | Любой разработчик понимает проблему за 30 секунд |
Воспроизводимость | Разработчик может воспроизвести баг по шагам с первого раза |
Полнота | Вся нужная информация есть, не нужны уточнения |
Лаконичность | Нет лишней информации, всё по делу |
Actionable | Понятно, что нужно исправить и как проверить |
Финальная проверка: 30-секундный тест
Покажи свой баг-репорт коллеге. Если он за 30 секунд понял:
Что сломано
Где сломано
Как воспроизвести
→ Баг-репорт готов к отправке.
Итоги
Хороший баг-репорт — это не просто описание проблемы. Это инструмент эффективной коммуникации, который экономит время всей команды и ускоряет релизы. Ключевые выводы:
Заголовок — формула: Что + Где + При каких условиях
Шаги воспроизведения — детальные, нумерованные, воспроизводимые
ОР vs ФР — чёткое разделение, ссылки на документацию
Окружение — ОС, браузер, версия, URL обязательно
Severity vs Priority — техническое влияние vs бизнес-срочность
Вложения — скриншоты с аннотациями, видео, логи, HAR-файлы
Один баг = один репорт — для удобного трекинга
Воспроизводимость — проверить 2+ раза перед отправкой
Разработчик должен прочитать баг-репорт за 30 секунд и сразу понять проблему. Если нужны уточняющие вопросы — репорт написан недостаточно хорошо. Используй чек-лист, шаблоны, инструменты автоматизации — и твои баг-репорты будут читать, понимать и исправлять быстро.
А лучшие вакансии для QA (тестировщиков) ищите на hirehi.ru