Блог

Голосовое управление запуском тестов

Голосовое управление тестами: от Telegram‑бота до TMS ТестОпс через MCP и GitHub Actions

Мы связываем голосовые команды в Telegram с запуском автотестов в GitHub Actions и сбором результатов в TMS ТестОпс. Логика такая: говорим чат-боту что-то вроде: «Запусти регресс на staging в Chrome!», бот распознаёт речь, через MCP‑сервер (и/или API) инициирует workflow_dispatch в нужном репозитории, а результаты и статус выполнения «приземляются» в запусках ТестОпс. Эта связка и схема параметров подтверждены руководствами по интеграции GitHub ↔ ТестОпс и MCP ↔ GitHub.
Архитектура решения:
Практическая реализация: локальный Whisper + обработчик голосовых сообщений, валидатор параметров запуска, GitHub Actions с обязательными inputs для запусков из ТестОпс и мониторинг/отмена прогонов через готовые MCP‑инструменты list_workflow_runs и cancel_workflow_run.
Вот, что для этого потребуется:
1. Учётные записи в GitHub и в облачной TMS ТестОпс (нужен ID проекта; его видно в URL и в интерфейсе).
2. Токены:

• GitHub PAT (fine‑grained) с правами как минимум Actions: Read & Write (для запуска/ отмены workflow).
•API‑токен ТестОпс (для allurectl и интеграции GitHub↔ТестОпс).
В документации подробно описано, как настроить токен ТестОпс.
3. Репозиторий с тестами, формирующими артефакты Allure (папка allure-results), чтобы ТестОпс собирал результаты.
4. MCP‑сервер GitHub (готовый, запускается одной командой npx … stdio), и удобный клиент для отладки (напр., Cursor IDE).
5. Telegram‑бот (BotFather‑токен) + локальный Whisper* для распознавания речи; готовый код‑скелет конвертации голосовых .ogg/.oga → .wav есть в исследовании.
*Whisper — это модель глубокого обучения, оптимизированная для работы на локальных устройствах, включая CPU и GPU. Она требует достаточных вычислительных ресурсов, но ее открытый исходный код позволяет разработчикам настраивать и оптимизировать модель под конкретные задачи. Тестировщики отмечают высокую точность распознавания (WER — Word Error Rate — на уровне лучших облачных решений) и возможность дообучения для специфических сценариев.

Подготовка GitHub Actions под запуск из ТестОпс

Шаг 1. Создаём рабочий процесс с обязательными inputs

Чтобы ТестОпс мог инициировать запуск через workflow_dispatch, в YAML должны быть служебные параметры ALLURE_JOB_RUN_ID и ALLURE_USERNAME. Если их нет, запуск из ТестОпс упадёт с HTTP 422.
Минимальный пример:
name: tests

on:
  push:
  workflow_dispatch:
    inputs:
      ALLURE_JOB_RUN_ID:
        description: "Service param for TMS ТестОпс"
        required: false
      ALLURE_USERNAME:
        description: "Service param for TMS ТестОпс"
        required: false
      GITHUB_TESTS_BROWSER:
        description: "Browser"
        required: true
        default: chrome
      TEST_SUITE:
        description: "Suite"
        required: true
        default: smoke
      GITHUB_TESTS_ENDPOINT:
        description: "Target stand"
        required: true
        default: https://staging.example.com

env:
  ALLURE_RESULTS: allure-results
  ALLURE_JOB_RUN_ID: ${{ github.event.inputs.ALLURE_JOB_RUN_ID }}
  ALLURE_USERNAME: ${{ github.event.inputs.ALLURE_USERNAME }}
  GITHUB_TESTS_BROWSER: ${{ github.event.inputs.GITHUB_TESTS_BROWSER }}
  TEST_SUITE: ${{ github.event.inputs.TEST_SUITE }}
  GITHUB_TESTS_ENDPOINT: ${{ github.event.inputs.GITHUB_TESTS_ENDPOINT }}

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: allure-framework/setup-allurectl@v1
        with:
          allure-endpoint: ${{ secrets.ALLURE_ENDPOINT }}
          allure-token: ${{ secrets.ALLURE_TOKEN }}
          allure-project-id: ${{ secrets.ALLURE_PROJECT_ID }}
      - name: Run tests with streaming to TMS
        run: |
          echo "Browser: $GITHUB_TESTS_BROWSER; Suite: $TEST_SUITE; URL: $GITHUB_TESTS_ENDPOINT"
          allurectl watch -- ./gradlew test
Обращаем внимание на блок setup-allurectl и переменные окружения. Именно так GitHub отправляет результаты в запуски ТестОпс.

Шаг 2. Добавляем секреты в репозитории

Settings → Secrets and variables → Actions: ALLURE_ENDPOINT, ALLURE_TOKEN, ALLURE_PROJECT_ID. Токен ТестОпс создаётся в профиле пользователя.

Настройка параметров окружений в ТестОпс

Создаём конфигурацию, чтобы запускать по кнопке.
  • Администрирование → Окружение: создайте глобальные переменные (например, Browser, Product Version и т.п.).
  • Настройки проекта → Окружение: сопоставьте ключи (точно как в YAML‑inputs GITHUB_TESTS_BROWSER, TEST_SUITE, GITHUB_TESTS_ENDPOINT) с этими глобальными переменными.
  • Проект → Джобы → ⋯ → Настроить → Параметры: добавьте параметры с дефолтными значениями — они подставятся в форму запуска в интерфейсе.
В ТестОпс одна джоба = один workflow GitHub; один запуск джобы = один запуск workflow. Статусы синхронизируются в обе стороны.

Запуск MCP‑сервера GitHub и проверка инструментов

  • Запускаем сервер и ждём ответа от сервера;
npx -y @modelcontextprotocol/server-github stdio
# если всё работает корректно, получаем ответ "Server listening on stdio"
  • Для отладки удобно открыть Cursor IDE, добавить конфигурационный файл ~/.cursor/mcp.json с типом stdio и PAT в параметры окружения. После перезапуска видны инструменты list_workflow_runs, cancel_workflow_run и другие (через MCP: List Tools).
  • Проверяем работоспособность MCP-связки. Для этого запрашиваем через ассистента список запусков PR или workflow-runs. Если нужно, отменяем зависшие процессы.
В готовом сервере GitHub инструменты для мониторинга/отмены присутствуют из коробки; запуск (dispatch) часто делают обычным REST‑вызовом GitHub API. Если в вашей сборке сервера есть инструмент для dispatch, используйте его; иначе вызывайте REST так, как показано в обработчике ниже — логика цепочки при этом не меняется.

Распознавание речи в Telegram и запуск теста

Голосовые сообщения Telegram приходят в .ogg/.oga. Конвертируем в .wav для Whisper и транскрибируем. Добавляем это в bot.py, рядом с кодом, который обрабатывает входящие голосовые сообщения.
def convert_telegram_voice_to_wav(oga_path: str) -> str:
    import os
    import ffmpeg

    wav_path = oga_path.replace('.oga', '.wav')
    
    (ffmpeg
        .input(oga_path)
        .output(
            wav_path,
            acodec='pcm_s16le',
            ar=16000,
            ac=1,
            loglevel='error'
        )
        .overwrite_output()
        .run(capture_stdout=True, capture_stderr=True)
    )
    
    if not os.path.exists(wav_path) or os.path.getsize(wav_path) == 0:
        raise Exception("Conversion failed - output file empty or missing")
    
    return wav_path

Разбор команды и запуск

Далее бот выделяет из текста 3 ключа: браузер, набор тестов, стенд. Из них собираем inputs и запускаем workflow_dispatch. (Если в вашей сборке MCP есть «dispatch‑инструмент» — используем его; если нет — вызываем REST.)
После запуска бот присылает ссылку на ран GitHub и, при наличии, ссылку на связанный запуск в ТестОпс (переменная ALLURE_JOB_RUN_ID).

Уведомления о прогоне: два пути

1. Через вебхуки ТестОпс. Вебхуки позволяют уведомлять сторонние системы (включая мессенджеры — Telegram/Slack) о старте/завершении запусков, создании дефектов и т. д. Настраиваются в проекте ТестОпс: указываете endpoint и JSON‑шаблон, подставляете переменные ({{launchName}}, {{failedCount}} и пр.).
В нашем блоге опубликованы подробные гайды по настройке вебхуков для Telegram и Slack.
2. Из GitHub Actions. Можно отправлять нотификации после джобы через curl на ваш webhook с добавлением в сообщение браузера, набора и итога статуса.

Частые ошибки и как их чинить

Симптом
Как исправить
HTTP 422 при запуске из ТестОпс
В YAML нет ALLURE_JOB_RUN_ID/ALLURE_USERNAME или в джобе ТестОпс добавлены параметры, которых нет среди workflow_dispatch.inputs. Добавьте/согласуйте ключи.
MCP «Tool not found» / нет списка инструментов
Проверьте ~/.cursor/mcp.json, перезапустите IDE; при необходимости обновите сервер: npm i -g @modelcontextprotocol/server-github@latest.
Недостаточно прав у PAT
Для управления Actions нужен Actions: Read & Write.
Error: connect ECONNREFUSED
MCP запущен не в stdio‑режиме. Проверьте аргументы запуска.
Пропали результаты в ТестОпс
Проверьте путь ALLURE_RESULTS, порядок шагов (setup-allurectl перед запуском тестов) и сетевую доступность.
Телеграм‑голос не конвертируется
Используйте конвертацию в PCM 16kHz Mono; в исследовании есть корректная функция на ffmpeg.

Проверка сквозного сценария

1. Меняем тест так, чтобы он падал, пушим изменения — видим красный ран в Actions и связанный запуск в ТестОпс.
2. Из ТестОпс создаём Issue в GitHub прямо с карточки провалившегося теста.
3. Через MCP в IDE получаем список текущих запусков и при необходимости отменяем зависшие.
4. Так, CI работает, отчёты уходят в ТестОпс, а инструменты MCP позволяют управлять прогоном, не покидая IDE.
В ТестОпс тест‑кейсы формируются автоматически из кода после прогонов CI, что серьёзно экономит время на документацию.

Пример валидатора параметров в GitHub Actions

Помогает ловить некорректные значения до старта тестов.
jobs:
  validate-inputs:
    runs-on: ubuntu-latest
    outputs:
      browser: ${{ steps.v.outputs.browser }}
      suite: ${{ steps.v.outputs.suite }}
      endpoint: ${{ steps.v.outputs.endpoint }}
    steps:
      - id: v
        run: |
          case "${{ env.GITHUB_TESTS_BROWSER }}" in
            chrome|firefox|edge|safari) 
              echo "browser=${{ env.GITHUB_TESTS_BROWSER }}" >> $GITHUB_OUTPUT ;;
            *) 
              echo "Bad browser"; 
              exit 1 ;;
          esac
          
          case "${{ env.TEST_SUITE }}" in
            smoke|regression|api|ui|full) 
              echo "suite=${{ env.TEST_SUITE }}" >> $GITHUB_OUTPUT ;;
            *) 
              echo "Bad suite"; 
              exit 1 ;;
          esac
          
          echo "endpoint=${{ env.GITHUB_TESTS_ENDPOINT }}" >> $GITHUB_OUTPUT

Пример уведомления из ТестОпс через вебхук

В настройках вебхука укажите endpoint бота и шаблон:
{
    "text": "Запуск {{launchName}} в проекте {{projectName}}: failed={{failedCount}}, broken={{brokenCount}}, passed={{passedCount}}. Ссылка: {{launchUrl}}"
}

Чек‑лист настройки (можно использовать как контрольную карту)

  • Создан PAT GitHub (Actions RW), создан API‑токен ТестОпс.
  • В репозитории есть YAML с workflow_dispatch и обязательными ALLURE_* inputs.
  • Подключён setup-allurectl и указаны секреты ALLURE_ENDPOINT/TOKEN/PROJECT_ID.
  • В ТестОпс созданы глобальные переменные окружения, сопоставлены ключи проекта и параметры джобы.
  • MCP‑сервер GitHub запущен, инструменты видны в IDE.
  • Telegram‑бот подключён, Whisper работает, распознаём голосовую команду и собираем inputs.
  • Уведомления настроены: вебхуки ТестОпс → мессенджер или пост‑шаг в GitHub Actions.

Коротко о главном

Мы интегрировали голосовые команды с CI и ТестОпс. Бот распознаёт намерения, MCP/REST активируют и контролируют workflow_dispatch, а allurectl передаёт результаты в ТестОпс. Команда получает уведомления. Все процессы и настройки основаны на актуальных руководствах и проверенных практиках из экосистемы ТестОпс.