Отчётность и наблюдаемость
Updated Jul 2026
Что сохранять
Артефакты для каждого теста
| Артефакт | Формат | Назначение |
|---|---|---|
| Выполненные команды | Текстовый лог | Воспроизводимость |
| Скриншоты (каждый шаг) | PNG | Визуальная хронология |
| Текст страницы (каждый шаг) | Текст | Состояние, читаемое агентом |
| Текущий URL (каждый шаг) | Текст | Отслеживание навигации |
| Время выполнения | JSON | Анализ производительности |
| Результат прошёл/не прошёл | JSON | CI-ворота |
| Детали ошибки | Текст | Отладка |
Артефакты для каждого набора
| Артефакт | Формат | Назначение |
|---|---|---|
| Сводный отчёт | JSON + текст | Быстрый обзор |
| Скриншоты при сбоях | Директория PNG | Обзор человеком |
| Лог рассуждений агента | Markdown | Понимание решений агента |
| Метрики производительности | JSON | Анализ трендов |
Логирование команд
Каждая команда vibe-check, выполненная агентом, должна логироваться:
[2026-02-09T14:23:01Z] vibe-check navigate https://app.example.com/login
→ exit 0, 1.2s
[2026-02-09T14:23:02Z] vibe-check type "input[name=email]" "user@test.com"
→ exit 0, 0.3s
[2026-02-09T14:23:03Z] vibe-check type "input[name=password]" "***"
→ exit 0, 0.2s
[2026-02-09T14:23:03Z] vibe-check click "button[type=submit]"
→ exit 0, 0.4s
[2026-02-09T14:23:04Z] vibe-check wait ".dashboard-title"
→ exit 0, 0.8s
[2026-02-09T14:23:05Z] vibe-check text ".dashboard-title"
→ exit 0, 0.1s
→ output: "Welcome, User"
Этот лог обеспечивает:
- Воспроизведение — запуск тех же самых команд для воспроизведения проблемы
- Анализ времени — определение медленных шагов
- Отладку — точное представление о том, что делал агент
Формат JSON-отчёта
{
"suite": "authentication",
"timestamp": "2026-02-09T14:23:00Z",
"environment": {
"base_url": "https://staging.example.com",
"browser": "Chrome for Testing 131",
"vibium_version": "0.1.7",
"mode": "oneshot",
"headless": true
},
"summary": {
"total": 8,
"passed": 7,
"failed": 1,
"skipped": 0,
"duration_ms": 18500
},
"tests": [
{
"name": "login_valid_credentials",
"status": "pass",
"duration_ms": 2300,
"steps": [
{
"command": "navigate https://staging.example.com/login",
"duration_ms": 1200,
"exit_code": 0,
"screenshot": "screenshots/login_valid_step1.png"
},
{
"command": "type \"input[name=email]\" \"test@example.com\"",
"duration_ms": 300,
"exit_code": 0
}
]
},
{
"name": "login_expired_account",
"status": "fail",
"duration_ms": 5100,
"error": {
"message": "Expected text 'Account expired' but got 'Welcome, User'",
"step": 5,
"command": "text \".error-message\"",
"screenshot": "failures/login_expired_account/screenshot.png",
"page_text": "failures/login_expired_account/page_text.txt",
"page_url": "https://staging.example.com/dashboard"
}
}
]
}
Консольный сводный вывод
Человекочитаемый вывод для логов CI:
Authentication Test Suite
=========================
Target: https://staging.example.com
Browser: Chrome 131 (headless, oneshot)
Started: 2026-02-09 14:23:00 UTC
PASS login_valid_credentials 2.3s
PASS login_invalid_password 1.8s
PASS login_empty_form 1.5s
PASS login_sql_injection 1.2s
FAIL login_expired_account 5.1s
Expected: "Account expired"
Got: "Welcome, User"
Screenshot: failures/login_expired_account/screenshot.png
PASS signup_new_user 3.2s
PASS signup_duplicate_email 2.1s
PASS logout 1.3s
=========================
Results: 7 passed, 1 failed (18.5s)
Анализ сбоев
Когда тест не проходит, агент (или фреймворк) должен сохранить:
1. Визуальное состояние (скриншот)
vibe-check screenshot -o "failures/${TEST_NAME}/screenshot.png"
2. Текстовое состояние (содержимое страницы)
vibe-check text > "failures/${TEST_NAME}/page_text.txt"
3. Местоположение (URL)
vibe-check url > "failures/${TEST_NAME}/current_url.txt"
4. Ошибки консоли (JavaScript)
vibe-check eval "JSON.stringify(window.__console_errors || [])" > "failures/${TEST_NAME}/console_errors.json"
5. Рассуждения агента (опционально)
Если запуск происходит через Claude Code, рассуждения агента о сбое сохраняются в истории разговора. Это можно извлечь в markdown-файл с объяснением того, что произошло.
Отслеживание производительности
Время каждой команды
# Wrapper function that times each command
timed_vibe() {
local start=$(date +%s%N)
vibe-check "$@"
local exit_code=$?
local end=$(date +%s%N)
local duration_ms=$(( (end - start) / 1000000 ))
echo "[timing] vibe-check $@ → ${duration_ms}ms (exit $exit_code)" >> timing.log
return $exit_code
}
Анализ трендов
Отслеживание длительности тестов во времени для обнаружения регрессий производительности:
{
"date": "2026-02-09",
"test": "checkout_flow",
"duration_ms": 4500,
"previous_avg_ms": 3200,
"regression": true,
"delta_pct": 40.6
}
Оповещение, если тест стабильно выполняется дольше, чем на 50% превышает его скользящее среднее.
Интеграция с CI-дашбордами
Вывод JUnit XML (для Jenkins/GitHub/GitLab)
<?xml version="1.0" encoding="UTF-8"?>
<testsuites>
<testsuite name="authentication" tests="8" failures="1" time="18.5">
<testcase name="login_valid_credentials" time="2.3"/>
<testcase name="login_expired_account" time="5.1">
<failure message="Expected 'Account expired' but got 'Welcome, User'">
Screenshot: failures/login_expired_account/screenshot.png
URL: https://staging.example.com/dashboard
</failure>
</testcase>
</testsuite>
</testsuites>
Тезис для собеседования
«Наша отчётность фиксирует три вещи для каждого теста: лог команд для воспроизводимости, скриншоты для визуальной отладки и структурированный JSON для программного анализа. При сбое мы также сохраняем текст страницы и URL, чтобы ИИ-агент мог повторно проанализировать, что пошло не так. Мы выводим JUnit XML для интеграции с CI-дашбордами и отслеживаем тренды по времени для обнаружения регрессий производительности. Ключевой вывод состоит в том, что ИИ-управляемые тесты нуждаются в более богатых артефактах при сбоях, чем традиционные тесты, потому что агенту может потребоваться порассуждать о сбое, чтобы определить, является ли это реальным багом или проблемой тестового окружения.»