Modern QA2026Отчётность и наблюдаемость
Join

Course01 Agent Skills for Browser Automation

Cutting-edge · Chapter 01

Отчётность и наблюдаемость

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-дашбордами и отслеживаем тренды по времени для обнаружения регрессий производительности. Ключевой вывод состоит в том, что ИИ-управляемые тесты нуждаются в более богатых артефактах при сбоях, чем традиционные тесты, потому что агенту может потребоваться порассуждать о сбое, чтобы определить, является ли это реальным багом или проблемой тестового окружения.»