1c/Ox
1
0
mirror of https://github.com/LazarenkoA/Ox.git synced 2025-11-23 21:33:13 +02:00
Files
Ox/README.md
Артем 84b51ad85f better
2025-11-04 18:58:12 +03:00

16 KiB

🐂 Ox — Нагрузочное тестирование 1С

logo.png

Кроссплатформенный инструмент для нагрузочного тестирования веб-клиента 1С на базе Playwright

📋 Содержание

📖 Введение

Ox — это открытоисходный инструмент для нагрузочного тестирования веб-клиента 1С. Он позволяет эмулировать действия пользователей и создавать нагрузку на тестируемую систему без необходимости глубокого понимания архитектуры Test Center 1C.

Проект создан на базе Playwright и предоставляет простой и удобный способ записи и воспроизведения пользовательских сценариев с поддержкой множественных параллельных исполнителей.

Почему Ox?

В экосистеме открытого ПО отсутствует достойная альтернатива Test Center 1C для нагрузочного тестирования. Хотя Ox не претендует на полную замену Test Center (который предоставляет больше функций и возможностей), он компенсирует это простотой использования:

  • Интуитивная запись сценариев (как встроенный менеджер тестирования в 1С)
  • Не требует специальной квалификации от инженеров
  • Удобная панель управления и распределённое выполнение тестов
  • Автоматическая запись скриншотов и видео при сбоях

🎯 Возможности и ограничения

Что поддерживает Ox

  • Простая эксплуатация — минимальная настройка и кривая обучения
  • Запись сценариев через UI — как встроенный менеджер тестирования в 1С
  • Скриншоты и видео при ошибках — автоматическая диагностика сбоев
  • Распределённое выполнение — запуск множества worker'ов на разных машинах
  • Параллельные потоки — настраиваемое количество одновременных тестов на worker'е
  • Панель управления — веб-интерфейс для оркестрации и мониторинга
  • Выявление проблем — логи worker'ов содержат подробную диагностику ошибок

Ограничения

  • Только веб-клиент — не поддерживает толстый клиент 1С
  • Упрощённый функционал — по сравнению с Test Center 1C
  • Зависит от Playwright — используются возможности и ограничения браузерной автоматизации

💾 Установка

Вариант 1: Из готовых бинарников

Скачайте последний релиз из GitHub Releases

Вариант 2: Сборка из исходников

Требования:

  • Go 1.21+
  • Make или аналогичный инструмент
make build-backend

Требования для worker'ов:

  • Node.js 18+
  • Playwright установится автоматически при первом запуске worker'а

🏗️ Архитектура

Ox состоит из двух компонентов:

Worker

  • Описание: Рабочий процесс, запускаемый на ВМ, с которой идёт нагрузка
  • Функция: Выполнение Playwright сценариев в несколько потоков
  • Масштабирование: Можно запускать множество экземпляров worker'ов
  • Требования: Node.js, доступ к тестируемому веб-сервису 1С

Observer

  • Описание: Центральный оркестратор и панель управления
  • Функция: Управление worker'ами, распределение сценариев, сбор результатов
  • Экземпляры: Должен быть ровно один экземпляр
  • Требования: Сетевой доступ ко всем worker'ам по TCP

🚀 Быстрый старт

Шаг 1: Запустить Worker

На машине, с которой будет идти нагрузка:

worker.exe -p 55556

Доступные флаги:

  • -p, --port — порт для прослушивания (по умолчанию 55556)
  • -h, --host — адрес для прослушивания (по умолчанию 0.0.0.0)

Можно запустить несколько экземпляров на разных портах:

worker.exe -p 55556 &
worker.exe -p 55557 &
worker.exe -p 55558 &

Шаг 2: Настроить Observer

Отредактируйте конфиг observer/config.yaml:

workers:
  - host: 192.168.1.10
    port: 55556
  - host: 192.168.1.11
    port: 55556
  - host: 192.168.1.11
    port: 55557

observer:
  port: 8091
  listen: 0.0.0.0

Шаг 3: Запустить Observer

observer.exe -c config.yaml

Observer запустит веб-сервер на http://localhost:8091

Шаг 4: Проверить статус Worker'ов

Откройте в браузере http://localhost:8091 и проверьте, что все worker'ы в статусе READY:

browser_z2xVfQLybR.png

Устранение проблем с подключением

Если worker'ы в статусе OFFLINE:

  1. Проверьте сетевую доступность:

    telnet <worker_host> <worker_port>
    # или
    nc -zv <worker_host> <worker_port>
    
  2. Проверьте, что worker'ы запущены и слушают нужные порты:

    lsof -i :<port>  # macOS/Linux
    netstat -ano | findstr :<port>  # Windows
    
  3. Проверьте firewall правила на машинах с worker'ами

  4. Убедитесь, что в конфиге Observer правильно указаны IP-адреса и порты

📝 Создание тестовых сценариев

Запись сценария с помощью Codegen

Используйте встроенный UI редактор Playwright:

npx playwright codegen http://localhost/bsp/ru_RU/

Откроется два окна:

  • Браузер — для выполнения действий
  • Inspector — для просмотра генерируемого кода

Выполняйте действия в браузере, они автоматически записываются как код.

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

import { test, expect } from '@playwright/test';

test('create_survey_template', async ({ page }) => {
    // Переход на систему и авторизация
    await page.goto('http://localhost/bsp/ru_RU/');
    await page.locator('#userName').fill('Администратор');
    await page.locator('#userName').press('Tab');
    await page.locator('#userPassword').fill('123');
    await page.locator('#userPassword').press('Enter');
    
    // Ожидание загрузки интерфейса
    await page.waitForLoadState('networkidle');
    
    // Навигация по меню
    await page.getByText('Анкетирование').click();
    await page.getByText('Шаблоны анкет').click();
    
    // Создание нового шаблона
    await page.locator('[id="form4_ФормаСоздать"]').click();
    
    const templateName = randomString();
    await page.getByRole('textbox', { name: 'Наименование:' })
        .pressSequentially(templateName);
    
    await page.locator('[id="form5_Заголовок"] > .inputs')
        .pressSequentially(randomString());
    
    // Сохранение
    await page.locator('[id="form5_ФормаЗаписатьИЗакрыть"]').click();
    
    // Удаление созданного шаблона
    await page.locator('[id="grid_form4_Список"]')
        .getByText(templateName, { exact: true })
        .click({ button: 'right' });
    
    await page.locator('#popupItem4')
        .getByText('Пометить на удаление / Снять пометку')
        .click();
    
    await page.locator('#form6_Button0 a')
        .filter({ hasText: 'Да' })
        .click();
});

function randomString() {
    return Math.random().toString(36).substring(2, 10);
}

Рекомендации при редактировании сценариев

  1. Используйте .pressSequentially() вместо .fill() — для элементов с автодополнением и валидацией
  2. Добавляйте явные ожиданияawait page.waitForLoadState('networkidle')
  3. Используйте подробные селекторы — избегайте селекторов, зависящих от порядка элементов
  4. Генерируйте уникальные данные — используйте функции для создания случайных значений
  5. Обрабатывайте ошибки — добавляйте проверки важных состояний

Полная документация: Playwright Documentation

🧪 Проверка и отладка сценариев

Локальное тестирование в UI режиме

После записи сценария проверьте его работу:

cd playwright
npx playwright test ./tests/bsp.spec.js --project=chromium --ui

Откроется интерактивное окно, где можно:

  • Запустить сценарий целиком или отдельные шаги
  • Увидеть скриншот каждого шага
  • Отследить выполнение с замедлением

Отладка в режиме Inspector'а

PWDEBUG=1 npx playwright test ./tests/bsp.spec.js --project=chromium

Откроется Inspector для пошагового выполнения.

Просмотр отчётов

После выполнения тестов на worker'е, результаты находятся в:

<worker_dir>/playwright/playwright-report/index.html

Отчёт содержит:

  • 📸 Скриншоты каждого шага
  • 🎥 Видео выполнения (особенно полезно при ошибках)
  • 📋 Список всех действий и их результатов
  • ⏱️ Время выполнения каждого шага

Распространённые проблемы

Проблема Решение
Элемент не найден Проверьте селектор в DevTools браузера, используйте более специфичные селекторы
Timeout при ожидании Увеличьте timeout: await page.locator(...).click({ timeout: 30000 })
Случайные падения Добавьте явные ожидания загрузки: await page.waitForLoadState('networkidle')
Элемент скрыт за другим Используйте scroll: await page.locator(...).scrollIntoViewIfNeeded()
Данные не совпадают при повторном запуске Используйте генерацию уникальных данных для каждого прогона

📊 Управление тестами из Observer'а

В веб-интерфейсе Observer'а вы можете:

  1. Выбрать worker — на котором запустится тест
  2. Установить параллелизм — количество одновременных потоков
  3. Загрузить сценарий — выбрать подготовленный скрипт Playwright
  4. Запустить тест — начать выполнение
  5. Мониторить статус — просматривать результаты в реальном времени

Интерпретация статусов

  • READY — worker подключен и готов к работе
  • RUNNING — выполняется тест
  • ERROR — тест завершился с ошибкой (см. логи)
  • OFFLINE — worker недоступен (проверьте сетевое соединение)

📚 Документация

🐛 Диагностика проблем

Логи Worker'а

При ошибке в тесте:

tail -f <worker_dir>/logs/worker.log

Логи Observer'а

tail -f <observer_dir>/logs/observer.log

Видео и скриншоты при сбое

Находятся в:

<worker_dir>/playwright/playwright-report/index.html

Видео особенно полезно для понимания того, что произошло перед ошибкой.

🤝 Контрибьютинг

Приветствуются pull requests с:

  • Исправлениями ошибок
  • Новыми возможностями
  • Улучшениями документации
  • Примерами сценариев

📄 Лицензия

Проект распространяется под лицензией [укажите лицензию]

Часто задаваемые вопросы

Q: Можно ли использовать Ox для толстого клиента 1С? A: Нет, Ox поддерживает только веб-клиент.

Q: Сколько worker'ов можно запустить? A: Неограниченно, но рекомендуется учитывать ресурсы машин и лимиты браузеров.

Q: Как увеличить количество одновременных тестов? A: Используйте слайдер в Observer'е для настройки параллелизма на каждом worker'е.

Q: Нужна ли лицензия на Playwright? A: Нет, Playwright распространяется бесплатно и с открытыми исходниками.

📞 Поддержка

Для сообщений об ошибках и вопросов используйте GitHub Issues