Баг-репорт, который читают: как правильно описать ошибку, чтобы разработчик сразу всё понял

Баг-репорт, который читают: как правильно описать ошибку, чтобы разработчик сразу всё понял

«Не работает кнопка» — такой баг-репорт отправляет разработчика на 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. Ошибка

Предусловия: Пользователь не авторизован

1. Открыть https://example.com/register
2. Ввести в поле Email: test@example.com
3. Ввести в поле Пароль: Test123!
4. Нажать кнопку «Зарегистрироваться»

ОР: Появляется сообщение «Регистрация успешна», редирект на /dashboard
ФР: Ошибка валидации «Email уже существует» (хотя email новый)

Пример 2: API-запрос

ПлохоХорошо
Отправить запрос на сервер, получить ошибку

Предусловия: Пользователь авторизован, токен валиден

1. Отправить POST-запрос на https://api.example.com/orders
2. Headers: Authorization: Bearer <token>
3. Body: {"product_id": 123, "quantity": 1}

ОР: 200 OK, {"order_id": 456, "status": "created"}
ФР: 500 Internal Server Error, {"error": "Database connection failed"}

Уровень детализации

СитуацияУровень детализацииПример

Новый функционал

МаксимальныйУказать каждый клик, каждое поле, каждое значение

Известная часть системы

СреднийМожно объединить: «Авторизоваться как admin (admin/admin123)»

Очевидные действия

МинимальныйНе писать «навести курсор на кнопку», «кликнуть левой кнопкой мыши»

Баг в специфическом кейсе

Максимальный в ключевых местахДетально описать момент, где происходит баг

Частые ошибки в шагах воспроизведения

ОшибкаПочему плохоКак исправить
Размытые формулировки«Нажать на что-то», «ввести данные» — непонятно чтоКонкретные названия и значения
Пропущенные шагиРазработчик не может воспроизвестиЗаписывай шаги во время тестирования
Лишние шагиЗагромождают репорт, отвлекаютУбрать всё, что не влияет на баг
«Сделать несколько раз»Сколько именно?«Нажать 3 раза», «повторить до появления ошибки (обычно 5–7 попыток)»
Без предусловийНеясна роль, данные, состояниеДобавить блок Preconditions
Шаги в прошедшем времени«Я нажал, я ввёл» — неудобно читатьИмператив: «Нажать», «Ввести», «Открыть»

Чек-лист хороших шагов

  • Шаги пронумерованы

  • Указаны предусловия (роль, данные)

  • Каждый шаг — одно конкретное действие

  • Указаны точные названия элементов (кнопок, полей)

  • Указаны точные значения (что вводить, что выбирать)

  • Коллега смог воспроизвести по этим шагам

  • Нет лишних шагов (только необходимые)

  • Шаги написаны в императиве (не «я нажал», а «нажать»)

 

5. Ожидаемое vs фактическое поведение

Почему это важно

ПричинаОписание

Понимание проблемы

Разработчик видит разницу между должным и есть

Валидация бага

Иногда «баг» — это ожидание, не совпадающее со спецификацией

Приоритизация

Чем больше разрыв ОР и ФР, тем серьёзнее баг

Тестирование фикса

ОР — критерий приёмки исправления

Как писать ожидаемый результат

ПринципОписаниеПример

Ссылка на источник

Откуда взято ожидание«Согласно ТЗ п.3.2», «По макету Figma», «Как в требованиях USER-123»

Конкретика

Точное описаниеНе «всё работает», а «появляется уведомление "Товар добавлен в корзину"»

Измеримость

Если можно — числа«Загрузка занимает до 2 сек», «Отображается 10 товаров на странице»

Полнота

Всё, что должно произойти«Открывается страница X, показывается сообщение Y, кнопка Z становится неактивной»

Как писать фактический результат

ПринципОписаниеПример

Точность

Что именно произошло«Показывается пустая страница», «Кнопка не реагирует на клик»

Текст ошибки

Скопировать текст как есть

Error: Failed to fetch data from API (status 500)

Воспроизводимость

Всегда или иногда«Происходит в 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/devProduction, 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://version
Firefox: about:support
Safari: Safari → About Safari

ОС и версия

Windows: Win+R → winver
macOS: 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 / PriorityCritical (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 HARAPI-баги, загрузки, таймауты

Application logs

Логи сервера (если доступ есть)Backend-баги, 500-ошибки

System logs

Event Viewer (Win), Console.app (Mac)Краши приложений, нативные баги

Mobile logs

Xcode Console (iOS), Logcat (Android)Мобильные приложения

Как оформлять логи

ФорматКогда использоватьПример

Инлайн (в тексте)

Короткие ошибки (1–3 строки)

TypeError: Cannot read property 'id' of undefined

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.png

UI/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.har

Performance баги

ПолеЧто писать

Заголовок

[Действие] выполняется медленно [где] [при каких данных]

Ожидаемый результат

Норматив из 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.png

Security баги

Важно: 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Сложнее GitHubDevOps-команды

YouTrack

Гибкие workflows, бесплатный для малых командМеньше популяренJetBrains-экосистема

Asana

Простой, для таск-менеджментаНе заточен под багтрекингНебольшие команды, не-технические

ClickUp

Всё-в-одном, настраиваемыйМожет быть overwhelmingКоманды любого размера

Bugzilla

Open-source, старый и надёжныйУстаревший UILegacy-проекты

Сравнение возможностей

ФункцияJiraLinearGitHubYouTrack

Шаблоны баг-репортов

Кастомные поля

Ограниченно

Attachments

Workflows

✅ Гибкие✅ Простые✅ Гибкие

Интеграция с Git

✅ Нативная

API

Цена (малая команда)

$$$$FreeFree

Вспомогательные инструменты

Инструменты для записи багов

ИнструментЧто делаетИнтеграции

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 reportingJira, 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