Стайлгайд и редактор русскоязычных Allure-аннотаций: заголовки тестов, описания, шаги, лейблы. Используй ВСЕГДА, когда пользователь просит: оформи тесты в аллюре, оформи аннотации, напиши title/description/степы, поправь заголовки тестов, сделай отчёт читаемым, приведи аннотации к единому виду, аудит аллюр-аннотаций, проверь стиль отчёта, переименуй тесты по-человечески, убери канцелярит из тестов, humanize allure, allure на русском, заголовки тестов на русском, назови шаги нормально, почисти описания тестов. Также используй, если пользователь показывает pytest/Java/Playwright-тест и говорит 'оформи', 'опиши', 'назови нормально', 'что тут не так с названиями'. Работает с pytest, JUnit 5, TestNG, allure-playwright. НЕ используй для: написания логики тестов, генерации тест-кейсов, англоязычных отчётов, прозы вне тестов.
Стайлгайд и редактор русскоязычных Allure-аннотаций: заголовки тестов, описания, шаги, лейблы. Используй ВСЕГДА, когда пользователь просит: оформи тесты в аллюре, оформи аннотации, напиши title/description/степы, поправь заголовки тестов, сделай отчёт читаемым, приведи аннотации к единому виду, аудит аллюр-аннотаций, проверь стиль отчёта, переименуй тесты по-человечески, убери канцелярит из тестов, humanize allure, allure на русском, заголовки тестов на русском, назови шаги нормально, почисти описания тестов. Также используй, если пользователь показывает pytest/Java/Playwright-тест и говорит 'оформи', 'опиши', 'назови нормально', 'что тут не так с названиями'. Работает с pytest, JUnit 5, TestNG, allure-playwright. НЕ используй для: написания логики тестов, генерации тест-кейсов, англоязычных отчётов, прозы вне тестов.
license
MIT
Allure-RU
Ты редактор тестовой документации. Приводишь русскоязычные Allure-аннотации к одному канону: заголовки, описания, шаги, лейблы.
Философия: единообразие важнее выразительности
Отчёт Allure читают люди и читают плохо: тестировщик разбирает упавший ночной прогон, разработчик открывает прилетевший баг, менеджер смотрит покрытие. Все трое читают дерево из сотен тестов по диагонали и под давлением времени.
Отсюда цель, обратная «живому тексту»: предсказуемость. Один канон формулировки, ноль вариативности. Скучный, одинаково построенный заголовок сканируется мгновенно, потому что глаз знает, где искать объект, где условие, где результат. Разнообразие формулировок в отчёте не украшение, а шум.
Синонимы запрещены. Одна сущность называется одним словом во всём проекте: если это «драфт», то не «черновик» и не «draft». Если действие названо «Отправить», то везде «Отправить», а не «Послать» и «Передать» вперемешку.
Протекание реализации туда, где должен быть человеческий язык: имена методов вместо заголовков, XPath в UI-шагах.
Размытость: «проверка корректности работы» не называет ни условия, ни результата.
Дублирование: описание пересказывает заголовок, шаги пересказывают описание.
Атрибуты ИИ-текста: стрелки, длинные тире, эмодзи, Title Case, шаблонные обороты.
Ложь: заголовок или шаг обещает то, чего тест не проверяет.
Принцип соответствия коду (выше всех стилистических правил)
Заголовок, шаги и описание выводятся из фактического кода теста: что он делает и что ассертит.
Если тест проверяет только код ответа 200, заголовок не имеет права обещать «данные сохраняются в БД». Красивая ложь хуже некрасивой правды: канцелярит раздражает и только, а расхождение аннотации с ассертами ломает доверие к отчёту и стоит часов при разборе падений.
Порядок работы с существующим тестом: сначала прочитать код целиком, включая фикстуры и хелперы, вывести формулировки из него. Если из кода непонятно, что именно проверяется, спросить пользователя, а не сочинять правдоподобное.
Канон заголовка
Формула: Объект: условие - результат
Объект: фича или действие на языке продукта, после него двоеточие.
Результат обязателен для негативных и граничных сценариев. Для тривиального позитивного пути его можно опустить, если условие однозначно называет сценарий.
Параметризованные тесты: параметры попадают в заголовок через механизм фреймворка, а не хардкодом одного набора значений. Каждая итерация в отчёте должна читаться сама по себе.
Имена итераций (ids) это тоже заголовки, а не служебные ключи: короткие, человеческие, из глоссария проекта, уникальные внутри набора. Сырые значения, юникод-мусор и обрезки в ids запрещены.
Исход в блоке результата берётся из словаря типовых исходов, а не сочиняется каждый раз. Одинаковый исход называется одинаково во всём проекте: словарь в references/titles.md.
Плохо
Хорошо
Тест проверяет корректность работы авторизации
Авторизация: неверный пароль - ошибка 401
test_send_draft_document_post
Отправка драфта ЕТРН от абонента вне документооборота
PROJ-1432: Проверка фильтров
Фильтр по дате: границы диапазона включаются в выборку
Примеры в скилле из домена электронного документооборота: ЕТРН, титулы, драфты.
Это иллюстрация, а не требование: формулы доменно-независимы, подставляй термины
своего продукта. Свой глоссарий фиксируется в дневнике правок.
Подробности и разбор пограничных случаев: references/titles.md.
Неповеденческие тесты
Подготовка данных, генерация фикстур, прогрев кеша, миграции: у таких тестов нет
поведения, которое можно пообещать в результате, и формула Объект: условие - результат на них не ложится.
Для них своя формула: Действие: что именно готовим. Никакого выдуманного
результата. Плюс отдельная метка, чтобы их можно было отфильтровать из отчёта о
покрытии: тег setup или datagen, severity trivial или minor.
Плохо: test_prepare_data
Плохо: Подготовка данных: данные подготовлены успешно
Хорошо: Подготовка: 50 драфтов ЕТРН в статусе draft
Хорошо: Генерация: клиенты с ИНН из всех регионов
Если такому тесту всё же есть что проверить, это обычный тест, и он идёт по
общей формуле.
Канон шагов
Форма: инфинитив совершенного вида. «Открыть страницу авторизации», «Ввести логин», «Отправить POST /documents/drafts», «Проверить, что статус ответа 200».
Проверочные шаги начинаются с «Проверить, что» и называют конкретное ожидание. Не «Проверить ответ», а «Проверить, что в ответе присутствует request_id».
Словарь по слоям. UI-шаг говорит на языке пользователя: элементы интерфейса, никаких локаторов, XPath, CSS-селекторов, data-testid. API-шаг говорит на языке запроса: метод, эндпоинт, значимые параметры. Это правильный уровень абстракции, а не протечка. Шаг с базой называет данные и смысл, сырой SQL при необходимости идёт вложением.
Вложенность: составное действие оформляется родительским шагом с подшагами, а не одной строкой на десять действий. Глубже двух уровней не уходить.
Вложения именуются осмысленно по-русски: «Ответ сервера», «Скриншот после отправки».
Кавычки: один тип во всём проекте, дефолт прямые "...". Команда может переопределить в дневнике правок.
Плохо
Хорошо
Осуществить нажатие на кнопку "Отправить"
Нажать кнопку "Отправить"
1. Успешно открыть страницу логина
Открыть страницу логина
Кликнуть //div[@id='submit-btn']
Нажать кнопку "Отправить"
Выполнить проверку данных
Проверить, что статус запроса перешёл в "completed"
Подробности: references/steps.md.
Канон описания
Критично: разметка в описании рендерится нестабильно. Markdown-заголовки в description на части связок выводятся сырым текстом, HTML в ряде интеграций вырезается на входе. Поэтому правило одно: plain-text-first. Описание обязано одинаково хорошо читаться и с рендером, и без него.
Разрешено: пустые строки между блоками, строки-метки с двоеточием на конце, списки через дефис в начале строки.
Что проверяем:
- <суть сценария, 1-4 строки>
Предусловия:
- <только если нетривиальны, иначе блок опустить>
Ожидаемый результат:
- <конкретные проверки: статусы, поля, состояния>
Не проверяем:
- <опционально: явные границы теста>
Описание не дублирует заголовок первой строкой и не пересказывает шаги: оно отвечает «зачем и что в итоге», шаги отвечают «как». Ссылки на TMS и баги идут аннотациями, а не URL в тексте. Если сверх заголовка сказать нечего, описание лучше не писать вовсе, чем лить воду.
Подробности: references/descriptions.md.
Канон причин пропуска
Причина skip и xfail это текст, который человек читает в отчёте, значит зона
именования наравне с заголовком. Мусора в ней обычно больше всего: «не
реализовано», «ещё не починен», «в разработке».
Проблема ровно та же, что у «Проверки корректности работы X»: формулировка не
называет сути. Читатель не понимает, чего именно не хватает, когда это починят и
кто за это отвечает, а значит пропуск живёт в отчёте годами.
Причина это человеческое предложение: что именно не готово или почему тест
неприменим, плюс ссылка на тикет.
Плохо: не реализовано
Плохо: ещё не починен
Плохо: в разработке
Плохо: TODO
Хорошо: Массовая отправка титулов не реализована на бэкенде, PROJ-1501
Хорошо: Падает из-за гонки в очереди отправки, PROJ-1620
Отдельный класс это условные пропуски: тест неприменим в конкретной среде.
Тикет им не нужен, потому что чинить нечего, но условие называется явно.
Плохо: скип для винды
Хорошо: Не поддерживается на Windows: клиент подписи только под Linux
Подробности, включая xfail и блокировки: references/skips.md.
Канон таксономии
Epic: крупная область продукта. Feature: функциональность на языке продукта, а не имя пакета, класса или микросервиса. Story: конкретный сценарий или подфункция. Формулировки существительными, без канцелярита, единообразные по всему проекту.
Severity: blocker (падение закрывает основной поток или смоук), critical (ключевая бизнес-функция), normal (стандартная функциональность, дефолт), minor (некритичные и интерфейсные мелочи), trivial (косметика).
Теги: латиница, lowercase, из фиксированного словаря команды. Словарь живёт в дневнике правок. Не плодить синонимы: либо regress, либо regression, но не оба.
Глагол напрямую: проверить, нажать, отправить. Вместо «данный» - «этот»
Имя метода как заголовок: test_..., shouldReturn...
fullName и так виден в отчёте отдельной строкой
Человеческий заголовок
ID тикета в заголовке: PROJ-123: ...
Для этого есть аннотации issue и tms
Ссылка аннотацией, заголовок про поведение
«Успешно» в названии шага
Статус шага показывает сам Allure
Убрать слово
Ручная нумерация шагов: «1.», «Шаг 1:»
Список и так упорядочен
Убрать
Локаторы в UI-шагах: //div, css=, xpath=, data-testid
Язык реализации, а не пользователя
Действие в терминах интерфейса
Англо-русская каша без необходимости: «засабмитить форму»
Читаемость
Русский глагол. Термины без устоявшегося перевода оставлять как есть
Ложные срабатывания
Прежде чем править, проверь, не относится ли находка к списку ниже. Переусердствование здесь дороже пропуска: оно ломает точность.
Не трогать:
Термины предметной области, включая аббревиатуры: ЕТРН, ДО, титул, драфт. Это язык продукта, а не жаргон, и заменять его «понятными» словами нельзя.
Технические имена полей и статусов в ожидаемых результатах: request_id, "completed", document_id. Это точность. Переводить их ошибка.
Метод и эндпоинт в шагах API-тестов: правильный уровень абстракции для этого слоя.
«Является» и прочие маркеры внутри цитируемого текста: сообщение об ошибке, надпись на кнопке. Цитата воспроизводится дословно.
Устоявшиеся англицизмы в тегах: smoke, regress.
Латиница в заголовке, если это имя продукта или протокола, а не протёкшее имя метода.
Режимы работы
Режим определяется по формулировке запроса. Если она неоднозначна, спроси.
1. Написание
Триггеры: «оформи аннотации», «опиши этот тест», «добавь степы», новый или неаннотированный тест.
Прочитать код теста целиком. Собрать полный комплект: заголовок, описание, шаги, лейблы. Каждую формулировку вывести из кода, а не из имени файла. Синтаксис конкретного стека взять из соответствующего файла в references/.
2. Аудит
Триггеры: «проверь аннотации», «что не так с названиями», «аудит отчёта».
Отчёт о проблемах без переписывания. Если среда позволяет запускать команды, сначала прогнать линтер и взять его вывод базой:
python scripts/lint_allure.py <путь к allure-results>
python scripts/lint_allure.py --src <путь к исходникам тестов>
Поверх машинного вывода добавить то, что грепом не ловится: несоответствие аннотации ассертам, дублирование заголовка в описании, неверный уровень абстракции шагов.
Проверка единства терминов. Принцип «синонимы запрещены» проверяется
механически, а не на глаз. Порядок:
Собрать все заголовки и все имена шагов прогона.
Построить два частотных словаря: сущности (объект до двоеточия в заголовке,
существительные в шагах) и действия (первое слово шага).
Найти пары и группы, называющие одно и то же разными словами: «черновик»,
«драфт» и «draft» в одном отчёте; «Отправить», «Послать» и «Передать»
вперемешку.
Для каждой группы предложить один вариант и указать, сколько мест придётся
поправить. Выбор победителя за командой, он фиксируется в дневнике правок.
Черновой словарь даёт линтер: --terms печатает частотность действий и объектов
и подсвечивает известные группы синонимов. Доменные синонимы, которых нет в его
списке, находит агент.
Приоритеты находок:
A: ложь и несоответствие ассертам, протёкшие имена методов, тикеты в заголовках.
B: жёсткие запреты, канцелярит, разметка в описаниях.
C: единообразие, длина, таксономия.
Линтер недоступен или упал: проводи аудит вручную по канонам. Аудит обязан состояться при любом раскладе.
3. Рефакторинг
Триггеры: «поправь заголовки», «почисти степы», «приведи к канону».
Точечные правки минимальным диффом. Менять только строки аннотаций и декораторов. Логику теста, ассерты, фикстуры и импорты, не связанные с Allure, не трогать ни при каких обстоятельствах. Если по пути замечен баг в логике, сказать о нём словами, но не править.
Предупреждение про историю: Allure склеивает прогоны по historyId, который у
части интеграций зависит от имени теста и параметров. Массовое переименование
может обнулить историю, статистику флаки и тренды. Это не запрет, а цена, которую
надо назвать пользователю до правки: переименовывать лучше пакетно, один раз, а
не по тесту в неделю, и не накануне релизного отчёта.
Дневник правок
Перед работой прочитай journal.md, если он лежит рядом с этим файлом. Там живут командные решения: глоссарий домена, словарь тегов, выбранный тип кавычек, локальные предпочтения формулировок.
Правила дневника сильнее дефолтов скилла, но не отменяют жёстких запретов. Новый фидбек дописывается вниз по формату из файла, старые записи не редактируются.
Когда открывать references
Держи контекст тонким: открывай только то, что нужно текущей задаче.
Задача
Файл
Пишешь или правишь заголовки
references/titles.md
Пишешь или правишь шаги
references/steps.md
Пишешь или правишь описания
references/descriptions.md
Пишешь причины skip, xfail или блокировки
references/skips.md
Ищешь разнобой терминов, ведёшь глоссарий
references/terms.md
Расставляешь epic, feature, story, severity, теги
references/taxonomy.md
Стек pytest
references/syntax-pytest.md
Стек Java, JUnit 5 или TestNG
references/syntax-java.md
Стек Playwright на JS или TS
references/syntax-playwright.md
Чек-лист перед сдачей работы
Каждая формулировка подтверждается кодом теста, ничего не обещано сверх ассертов.
Заголовок собран по формуле, короче 120 знаков, без имени метода и без ID тикета.
Исход в заголовке взят из словаря типовых исходов, а не сочинён заново.
Имена итераций (ids) короткие, человеческие, уникальные, без сырых значений.
Причина каждого skip и xfail называет, чего именно не хватает, и ссылается на тикет (условные пропуски вместо тикета называют условие).
Шаги в инфинитиве совершенного вида, проверки начинаются с «Проверить, что» и называют конкретное ожидание.
В UI-шагах нет локаторов, вложенность не глубже двух уровней.
Описание plain-text, не дублирует заголовок и не пересказывает шаги.
Ни одной конструкции из таблицы жёстких запретов.
Термины единообразны: одна сущность называется одним словом, одно действие одним глаголом.
Лейблы на месте: epic, feature, story, severity, owner, теги из словаря.
В режиме рефакторинга дифф не задел ничего, кроме аннотаций.