Removed the word 'открытоисходный' from the introduction.
Ox — Нагрузочное тестирование 1С
📋 Содержание
- Введение
- Возможности и ограничения
- Установка
- Архитектура
- Быстрый старт
- Создание тестовых сценариев
- Видео
- Отладка и диагностика
Введение
Ox — это инструмент для нагрузочного тестирования веб-клиента 1С. Он позволяет эмулировать действия пользователей в веб клиенте и создавать нагрузку на тестируемую базу.
Проект создан на базе Playwright и предоставляет простой и удобный способ записи и воспроизведения пользовательских сценариев с поддержкой множественных параллельных исполнителей.
Почему Ox?
В экосистеме открытого ПО отсутствует достойная альтернатива Тест-центра для нагрузочного тестирования. Хотя Ox не претендует на полную замену Тест-центра (который предоставляет больше функций и возможностей), он компенсирует это простотой использования:
Возможности и ограничения
Что поддерживает Ox
- Приближеные сценарии к реальности — сценарий эмулирует действия пользователя в 100% виде
- Запись сценариев через UI — как встроенный менеджер тестирования в 1С
- Скриншоты и видео при ошибках — автоматическая диагностика сбоев
- Распределённое выполнение — запуск множества worker'ов на разных машинах
- Параллельные потоки — настраиваемое количество одновременных тестов на worker'е
- Панель управления — веб-интерфейс для оркестрации и мониторинга
- Выявление проблем — логи worker'ов содержат подробную диагностику ошибок
Ограничения
- Только веб-клиент — не поддерживает толстый, тонкий клиенты 1С
- Упрощённый функционал — по сравнению с Тест-центром
- Зависит от Playwright — используются возможности и ограничения браузерной автоматизации
Установка
Вариант 1: Из готовых бинарников
Скачайте последний релиз из GitHub Releases
Вариант 2: Сборка из исходников
Требования:
- Go 1.21+
go build observer/cmd/observer/main.go
go build worker/cmd/worker/main.go
Требования для 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— порт для прослушивания
Можно запустить несколько экземпляров на разных портах:
worker.exe -p 55555
worker.exe -p 55556
worker.exe -p 55557
Шаг 2: Настроить Observer
Отредактируйте конфиг observer/config.yaml:
app_port: 8091
workers:
- addr: "127.0.0.1:55555"
- addr: "127.0.0.1:55556"
- addr: "127.0.0.1:55557"
Шаг 3: Запустить Observer
observer.exe -c config.yaml
Observer запустит веб-сервер на http://localhost:8091
Шаг 4: Проверить статус Worker'ов
Откройте в браузере http://localhost:8091 и проверьте, что все worker'ы в статусе READY:
Устранение проблем с подключением
Если worker'ы в статусе OFFLINE:
-
Проверьте сетевую доступность:
telnet <worker_host> <worker_port> # или nc -zv <worker_host> <worker_port> -
Проверьте, что worker'ы запущены и слушают нужные порты:
lsof -i :<port> # macOS/Linux netstat -ano | findstr :<port> # Windows -
Проверьте firewall правила на машинах с worker'ами
-
Убедитесь, что в конфиге Observer правильно указаны IP-адреса и порты
Создание тестовых сценариев
Запись сценария с помощью Codegen
Используйте встроенный UI редактор Playwright:
npx playwright codegen http://localhost/bsp/ru_RU/
Откроется два окна:
- Браузер — для выполнения действий
- Inspector — для просмотра генерируемого кода
Выполняйте действия в браузере, они автоматически записываются как код.
Видео пример:
https://github.com/user-attachments/assets/a47ae493-ccd2-46e6-b2b6-e3e931cc7c02
Пример сгенерированного сценария
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 name = randomString();
await page.getByRole('textbox', { name: 'Наименование:' })
.pressSequentially(name);
await page.locator('[id="form5_Заголовок"] > .inputs').click();
await page.locator('[id="form5_Заголовок"] > .inputs')
.pressSequentially(randomString());
// Сохранение
await page.locator('[id="form5_ФормаЗаписатьИЗакрыть"]').click();
// Удаление созданного элемента
await page.locator('[id="grid_form4_Список"]')
.getByText(name, { 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);
}
другие примеры можно посмотреть в каталоге example scripts
пример проверки скрипта
https://github.com/user-attachments/assets/4812d2cf-7e5f-4105-807b-cae369f48c13
Рекомендации при редактировании сценариев
- Используйте
.pressSequentially()вместо.fill()— для элементов с автодополнением и валидацией - Добавляйте явные ожидания —
await page.waitForLoadState('networkidle') - Используйте подробные селекторы — избегайте селекторов, зависящих от порядка элементов
- Генерируйте уникальные данные — используйте функции для создания случайных значений
- Обрабатывайте ошибки — добавляйте проверки важных состояний
Полная документация: Playwright Documentation
Проверка и отладка сценариев
Локальное тестирование в UI режиме
После записи сценария проверьте его работу:
cd playwright
npx playwright test ./tests/bsp.spec.js --project=chromium --ui
Откроется интерактивное окно, где можно:
- Запустить сценарий целиком или отдельные шаги
- Увидеть скриншот каждого шага
- Отследить выполнение с замедлением
Просмотр отчётов
После выполнения тестов на worker'е, результаты находятся в:
<worker_dir>/playwright/reports/<job_id>
Отчёт содержит:
- 📸 Скриншоты каждого шага
- 🎥 Видео выполнения (особенно полезно при ошибках)
- 📋 Список всех действий и их результатов
- ⏱️ Время выполнения каждого шага
Распространённые проблемы
| Проблема | Решение |
|---|---|
| Элемент не найден | Проверьте селектор в DevTools браузера, используйте более специфичные селекторы |
| Timeout при ожидании | Увеличьте timeout: await page.locator(...).click({ timeout: 30000 }) |
| Случайные падения | Добавьте явные ожидания загрузки: await page.waitForLoadState('networkidle') |
| Элемент скрыт за другим | Используйте scroll: await page.locator(...).scrollIntoViewIfNeeded() |
| Данные не совпадают при повторном запуске | Используйте генерацию уникальных данных для каждого прогона |
Управление тестами из Observer'а
В веб-интерфейсе Observer'а вы можете:
- Выбрать worker — на котором запустится тест
- Установить параллелизм — количество одновременных потоков
- Загрузить сценарий — выбрать подготовленный скрипт Playwright
- Запустить тест — начать выполнение
- Мониторить статус — просматривать результаты в реальном времени
Интерпретация статусов
- READY — worker подключен и готов к работе
- RUNNING — выполняется тест
- ERROR — тест завершился с ошибкой (см. логи)
- OFFLINE — worker недоступен (проверьте сетевое соединение)
Видео работы
https://github.com/user-attachments/assets/6b5f548f-06bd-4ad5-a199-10ccb4ecf539
Диагностика проблем
Логи Worker'а
Логи находятся в каталоге worker'а в формате date time.log
Видео и скриншоты при сбое
Находятся в:
<worker_dir>/playwright/reports/<job_id>
job_id - уникальный идентификатор, можно посмотреть в логах воркера.
Видео особенно полезно для понимания того, что произошло перед ошибкой.
Лицензия
Проект распространяется под лицензией MIT license
Поддержка
Для сообщений об ошибках и вопросов используйте GitHub Issues

