Что за формат используется в сценариях
Текст шага сценария в ТестОпс хранится не как Markdown и не как HTML, а как структурированный JSON-документ — в формате редактора TipTap (модель документа ProseMirror).
Документ — это дерево: блоки (абзацы, блок кода) → внутри них кусочки текста → на текст навешаны метки форматирования (жирный, цвет, ссылка и т. д.). В API тела шага этот JSON лежит в поле bodyJson.
Важно. JSON руками не вводят — это формат хранения, который редактор генерирует сам. Markdown-расширение TipTap у нас включено только для вставки/копипаста. По API всегда передаётся JSON, описанный ниже.
Как форматировать прямо в интерфейсе
В поле шага форматирование применяется тремя способами:
1. Выделить текст → всплывающая панель
Основной способ. Выделите фрагмент текста — появится плавающая панель с кнопками: жирный, курсив, подчёркнутый, зачёркнутый, ссылка, inline-код, цвет текста и цвет фона. Нажали кнопку — выделенное отформатировалось.
2. Горячие клавиши
Наведите курсор на кнопку панели — в подсказке показано сочетание клавиш для этого форматирования.
3. Разметка с клавиатуры (для набора без мыши)
Важно: это не полный Markdown. В редакторе сценария включён ограниченный фиксированный набор сокращений (ниже). Заголовки (#), списки (-, 1.), цитаты (>), таблицы, картинки и ссылки через [текст](url) с клавиатуры не работают.
Что превращается в форматирование прямо при наборе:
| Набираете | Получаете | Примечание |
|---|---|---|
| **текст** или __текст__ | жирный | — |
| *текст* или _текст_ | курсив | — |
| ~~текст~~ | — | |
| `текст` (обратные кавычки) | inline-код | оборачивает уже набранный текст |
| `` (две обратные кавычки) | вход в режим кода — дальше печатается кодом | выход — одиночная ` |
| ==текст== | выделение цветом фона | внутри нельзя символы = и ~ |
| {{имя}} | подстановка параметра тест-кейса | — |
Только мышкой/панелью (с клавиатуры набрать нельзя)
- Подчёркнутый — в Markdown такого синтаксиса нет, только кнопка панели или горячая клавиша.
- Цвет текста — только через панель (у заливки фона сокращение == есть, у цвета самого текста — нет).
- Ссылка — синтаксис [текст](url) не поддерживается. Ссылку ставят кнопкой панели либо вставкой URL из буфера (голый URL автоматически становится ссылкой).
- Блок кода (code_block) — кнопки в ручном редакторе сценария нет вовсе.
Перенос строки: Enter и Shift+Enter
Enter внутри шага — это не перенос строки, а переход к новому шагу сценария.
Чтобы сделать перенос строки / новый абзац внутри одного шага, используйте Shift+Enter.
При вставке текста из буфера (Ctrl/Cmd+V)
Дополнительно к набору, при вставке срабатывают те же маркеры: **текст**, *текст* / _текст_, ~~текст~~, `текст`, ==текст==, а вставленный URL превращается в ссылку.
Произвольные символы вроде 'текст' или вставленный руками JSON разметкой не являются и останутся обычным текстом.
Полная спецификация формата (для интеграций и API)
Документ всегда начинается с корневого узла:
{ "type": "doc", "content": [ ... ] }
Тип каждого узла задаётся полем type. Неизвестный type на любом уровне тихо игнорируется — документ при этом не ломается.
Блоки (содержимое doc.content)
| Блок | type | Поля |
|---|---|---|
| Абзац | paragraph | content — список инлайн-узлов |
| Блок кода | code_block | content + attrs.language (язык подсветки) |
Инлайн-узлы (содержимое paragraph.content)
| Элемент | type | Поля |
|---|---|---|
| Текст | text | text + marks (метки форматирования) |
| Перенос строки | lineBreak | — |
| Параметр | parameter | attrs.name, attrs.value |
Метки форматирования (массив marks у текста)
| Форматирование | type метки | Доп. поля |
|---|---|---|
| Жирный | bold | — |
| Курсив | italic | — |
| Подчёркнутый | underline | — |
| Зачёркнутый | strike | — |
| Inline-код | code | — |
| Ссылка | link | attrs.href, attrs.target, attrs.rel |
| Цвет текста | text_color | attrs.kind |
| Цвет фона | text_fill | attrs.kind |
Доступные цвета (kind для текста и фона)
default, gray, green, red, violet, orange, yellow, pink, teal.
Пример
Шаг: «Войти как {role} и нажать Сохранить», ниже — команда:
{
"type": "doc",
"content": [
{
"type": "paragraph",
"content": [
{ "type": "text", "text": "Войти как " },
{ "type": "parameter", "attrs": { "name": "role", "value": "admin" } },
{ "type": "text", "text": " и нажать " },
{
"type": "text",
"text": "Сохранить",
"marks": [
{ "type": "bold" },
{ "type": "text_color", "attrs": { "kind": "green" } }
]
}
]
},
{
"type": "code_block",
"attrs": { "language": "bash" },
"content": [
{ "type": "text", "text": "curl -X POST /api/save" }
]
}
]
}
Нюансы
- Набор форматирования одинаковый для ручного сценария тест-кейса (редактируется) и для сценария результата прогона (только просмотр). Списков и таблиц в шагах нет.
- Блок кода (code_block) — валидный тип блока: он отображается, если пришёл в данных (например, из загруженных автотестовых результатов), но создать его кнопкой в ручном редакторе нельзя.
- Поле body у шага (плоский текст без форматирования) — устаревшее представление. Актуальное форматирование живёт в bodyJson.
- Формат расширяемый: незнакомый type узла или метки игнорируется, а не отвергает весь документ.