Всем привет! Меня зовут Ренат Дасаев, и я продолжаю рассказ о развитии E2E‑тестирования в Московской Бирже. За два года после публикации первой статьи многое изменилось: мы переупаковали процессы, расширили команду и существенно обновили технический стек. Хотите узнать, как нам удалось масштабироваться и какие инструменты сегодня ускоряют работу? Тогда — эта статья для вас!
Изменения в команде
Наше направление изначально существовало вне проекта, что серьезно ограничивало бюджет и возможности. В 2024 году мы запустили полноценный проект, показав высокий ROI автоматизации. После сбора потребностей мы пересмотрели сотни бизнес‑процессов (БП) и выделили 215 приоритетных. План проекта рассчитан на 2,5 года, в команде — 18 человек. Найм занял десять месяцев, и сейчас коллектив работает на полную мощность.
Вот как изменилась команда количественно и качественно (табл. 1).
№ |
Роль |
Обязанности |
Число сотрудников |
Что изменилось за последние 2 года? |
1 |
Разработчик автотестов |
Разработка E2E - тестов по согласованным тестовым сценариям. Поддержка E2E - тестов. Участие в оптимизации тестового фреймворка. |
9 |
Команда выросла с 2 до 9 человек. |
2 |
Разработчик инструментов тестирования |
Разработка инструментов/сервисов/фреймворков/утилит для тестирования. |
2 |
Такой роли не было. Подобные запросы решались разработчиками автотестов, доступными на тот момент. |
3 |
Тест - аналитик |
Анализ функциональных и технических заданий,полученных от бизнеса. Разработка и согласование E2E - сценариев с бизнесом. Прохождение разработанных сценариев на тестовых контурах для подтверждения их проходимости и готовности стенда к автоматизации тестирования. |
2 |
Такой роли не было. Руководитель направления и начальник отдела тестирования сами занимались аналитикой и согласованием тестовых сценариев с бизнесом. |
4 |
DevOps - инженер |
Управление и администрирование тестовым полигоном. Развертывание новых сервисов на тестовом контуре. Техническая поддержка всей команды E2E.
|
2 |
Такой роли не было. Руководитель направления и старший разработчик сами занимались деплоем и поддержкой тестового полигона. |
5 |
Руководитель направления |
Планирование технических задач на направлении. Делегирование задач сотрудникам. Обеспечение выполнения поставленных задач и контроль. Оптимизация рабочих процессов. Разработка автотестов и их поддержка на одном из направлении внутри E2E. Участие в финальном релизном тестировании в промышленном контуре. |
1 |
Меньше стал заниматься DevOps - активностями и разработкой автотестов, фокус на менеджмент. |
6 |
E2E-лидер |
Анализ потребностей бизнес - заказчика. Административный контроль за показателями в команде. Трансляция метрик выполненной работы вышестоящему руководству. Оптимизация рабочих процессов. |
1 |
Без изменений. |
7 |
Менеджер проекта |
Управление бюджетом проекта. Открытие новых этапов проекта. |
1 |
Такой роли не было. |
8 |
Управляющий комитет |
Утверждение бюджета и списка задач в проекте. |
1 |
Такой роли не было. |
Таблица №1. Изменения в составе команды за два года
Связь между ролями в нашем проекте в виде схемы:

Оптимизация внутри команды
Число разработчиков автотестов выросло в 4,5 раза, поэтому мы разделили их на три доменные группы:
Кросс‑рыночные операции — процессы, работающие на нескольких рынках
Отчетные системы — генерация и отправка отчетов
Листинг — постановка инструментов на торги и сопутствующие процессы
В каждой группе назначен ответственный, который:
Отслеживает прогресс задач
Решает внутренние технические вопросы
Участвует в планировании
Изменения в процессах
1. Дежурство
Каждый день один разработчик автотестов из каждой подгруппы и DevOps‑инженер проверяют инциденты и падения ночного регресса. Статусы публикуются в общем треде корпоративного мессенджера — это ускоряет реакцию на проблемы.
2. Ежедневные митинги
Голосовые стендапы заменены текстовыми в мессенджере: до 09:30 каждый участник отправляет:
Отчет о выполнении задач за вчера
План на день
Текущие блокеры
Плюсы:
История задач всегда под рукой
Руководителям проще анализировать статус
Подготовка отчета занимает менее 5 минут
Унификация: вся информация за день собирается в одном треде
3. Участие в финальном релизном тестировании
С прошлого года мы участвуем в финальном релизном тестировании на PROD‑контуре. Перед запуском E2E — тестов:
Согласовываем список тестов и тестовых сущностей (участники торгов, организации, инструменты)
Определяем тайминги и порядок обновления сервисов
Выполняем откат тестовых сущностей
По итогам прогона готовим подробный отчет о тестировании и заводим артефакты в Jira — с ошибками и предложениями.
Технические изменения
За прошедшие 2 года изменения произошли не только в процессах, но и в техническом плане.
1. Тестовый полигон
На полигоне появились:
Торгово — клиринговая система срочного рынка (ТКС СР)
Личные кабинеты участника и эмитента (ЛКУ и ЛКЭ)
-
Компоненты Единой регистрации клиентов (ЕРК) и рынка депозитно‑кредитных операций (ДКО):
торговые базы
базы ЭДО
ИТАС (IT Automated Service — система обслуживания потребителей технических услуг)
Zabbix — мониторинг QA — ресурсов с уведомлениями в мессенджер
Apache Guacamole — песочница для разработчиков автотестов
Nginx — кластер — SSL для тестовых сервисов
pg_ctlcluster — управление кластерами PostgreSQL
Активно переводим тестовые ресурсы на Red OS в рамках импортозамещения.
2. Инструменты
Интерпретатор Python
Мы перешли с Python 3.8 на 3.11. Что мы получили в итоге?
-
Безопасность
Жизненный цикл Python 3.8 закончился 7 октября 2024. Python 3.11 планируется поддерживать до октября 2027.
Улучшенная поддержка match/case (структурное сопоставление)
-
Быстродействие
Судя по бенчмаркам улучшение в быстродействии может достигать до 20%. У нас длинные E2E-тесты, где много различных ожиданий, поэтому тут и не ждали чудес. Главное, что медленнее не стало.
Линтер и автоформатер
До этого использовали связку flake8 + isort + yapf.
К недостаткам можно отнести:
Обновляется один компонент, скорее всего требуется обновить всю связку.
Каждый компонент настраивается отдельно со своим конфигом.
Этих недостатков лишен ruff.
Если какого‑то функционала в нём нет, его можно расширить через плагины.
Единый конфиг ruff.toml или pyproject.toml.
При небольших изменениях разница заметна лишь при внимательном сравнении. Для больших MR»ов скорость обработки важна меньше, так как мы избегаем их создания. В конвейере GitLabCI шаг линтера и форматера составляет доли процента времени работы CI/CD‑сервера.
Ruff изначально выводит отчет в формате JSON (по состоянию на январь 2025). Разработали скрипт, генерирующий HTML — отчет, который прикрепляется к pipeline
Инструмент активно развивается: регулярные релизы, широкое комьюнити.
Healthcheck сервисов перед запуском автотестов
Каждый наш E2E-автотест промаркирован списком микросервисов, задействованных в его выполнении. На основании этого списка перед запуском теста проверялось, что все pod’ы с соответствующими микросервисами в кластере Kubernetes находятся в статусе Running. Если проверка проходила успешно — тест запускался. В противном случае он помечался как skipped с указанием причины.
Однако на практике такой проверки часто было недостаточно. Проблемы возникали в следующих кейсах:
Отсутствие livenessProbe. Не все pod’ы имеют livenessProbe, поэтому при сбоях контейнер не перезапускается, хотя сервис недоступен. При этом pod визуально продолжает числиться в статусе Running.
Долгая инициализация контейнера. Контейнер может долго проходить все пробы, в результате чего Kubernetes принимает решение перезапустить pod. Это может повторяться циклически, пока инженер вручную не разберется с проблемой.
Сервис поднят в Kubernetes, но недоступен через ingress.
Чтобы повысить точность проверки готовности микросервисов перед запуском автотестов, мы решили доработать наш механизм пробирования.
Цель — перед запуском любого автотеста выполнять HTTP-запросы ко всем микросервисам, задействованным в этом тесте, и на основе ответа убедиться, что сервис действительно готов принимать и обрабатывать входящие запросы.
При этом мы стремились, чтобы эти запросы были:
Стандартизированными (меняется только имя сервиса)
Минимально нагружающими сеть
Легко обрабатываемыми самим сервисом
Осуществлялись через ingress
В большинстве микросервисов уже существовал метод /health (его название могло варьироваться в зависимости от внутренних практик), возвращающий статус «UP» при готовности и «DOWN» в противном случае.
Были выполнены следующие шаги:
Проверили наличие health‑эндпоинтов у всех микросервисов, задействованных в E2E‑тестах
Для отсутствующих — создали задачи в Jira на доработку
Обновили модели и адаптеры более чем в 250 модулях
Обновили генератор модулей: теперь в новых микросервисах метод /health создается автоматически
Результаты внедрения:
Анализ ночных прогонов упростился: если сервис не готов, тест пропускается, а не падает с ошибкой
Получение полного отчета о тестировании происходит быстрее
В течение первого месяца эксплуатации были зарегистрированы артефакты в Jira по недоступным сервисам — и оперативно устранены
Эмуляция почтового сервера во время автотестирования
Для снижения нагрузки на основной почтовый сервер мы развернули мок-версию SMTP-сервера MailHog внутри тестового кластера Kubernetes. Теперь все приложения, запущенные в тестовом окружении, отправляют почтовые уведомления через MailHog.
Инструмент обладает удобным веб-интерфейсом для просмотра содержимого почтового ящика и предоставляет API для работы с письмами (получение списка, удаление, получение содержимого по ID).
Как обычно, был разработан Python-модуль для работы с API MailHog - это позволяет удобно использовать его в автотестах, проверяя нужные атрибуты писем: заголовок, тело и прочее.
Ограничения инструмента
MailHog не поддерживает SMTP-авторизацию и TLS/SSL - шифрование. Однако в нашем случае это не является проблемой, поскольку сервер развернут внутри тестового кластера и доступен только изнутри.
Мокирование сервисов
Зачем нужны моки в E2E-тестах?
В тестовом контуре не всегда возможно оперативно развернуть новую систему или ее компоненты: настройка CI/CD может занять значительное время. Если тест - аналитику нужно начать работу с системой, которая еще отсутствует на стенде, мы действуем по следующему сценарию:
Создаем задачу в Jira для DevOps
-
Параллельно разворачиваеммок — систему, настраиваем маппинг ответов
Проверяем сценарии на UAT — полигоне, где работают реальные интеграции
Переносим настройки на тестовый полигон и готовим окружение к автоматизации
Почему был выбран Wiremock?
Open Source и бесплатен
Поддерживает управление через UI и REST API
Легко запускается: достаточно передать аргументы в jar-файл
Что было реализовано:
Helm‑чарт для деплоя WireMock в Kubernetes
-
Библиотека для работы с API WireMock, позволяющая:
Получать/удалять запросы
Создавать/обновлять/удалять маппинги
Получать список всех маппингов
Полностью очищать мок‑сервер от данных
Разработка веб-приложения для тестирования новых инструментов фондового рынка
В предыдущей статье были описаны веб-сервисы, разработанные для автотестирования. Эти наработки и технические решения легли в основу проекта для Операционного департамента фондового рынка (ОД ФР).
Задача
Автоматизировать тестирование новых инструментов фондового рынка (ценные бумаги - акции, облигации), готовящихся к торгам на следующий день.
Текущий процесс (до автоматизации)
Подготовка тестового контура (за нее отвечает команда сопровождения ФР)
Ручное тестирование, выполняемое маклерами ОД ФР:
Анализ параметров бумаг в таблице
Подача заявок и заключение сделок через торговый терминал
Проверка позитивных и негативных сценариев
В случае выявления ошибок — корректировка описания и повторное тестирование
Решение
Команда E2E-автотестирования разработала веб-сервис FondTest, автоматизирующий второй этап — тестирование инструментов.
Преимущества решения
Сокращение времени тестирования с ~20 минутдо 7 — 10 минут на бумагу
Снижение операционного риска, связанного с ручным вводом
Алгоритм работы FondTest:
Копия базы выкладывается на тестовый сервер
Торговая система запускается в режиме «следующий торговый день»
Маклер проходит аутентификацию в сервисе FondTest
Выбирает необходимые инструменты для тестирования (см. Рисунок 3. «Список инструментов, готовых к описанию „на завтра“»).
-
При необходимости редактирует шаблон по режиму, если изменились данные (см. Рисунок 4. «Список шаблонов» и Рисунок 5. «Форма шаблона»), а также может:
создавать новый шаблон с помощью формы‑генератора
изменять/удалять шаблоны
импортировать/экспортировать шаблоны
Запускает автотесты по выбранному списку инструментов (см. Рисунок 6. «Список тест‑кейсов» и Рисунок 7. «Запуск автотестов из сервиса»)
Получает результаты прямо в интерфейсе сервиса (см. Рисунок 8. «Отчет о тестировании»)
Принимает решение об утверждении описания для боевой базы
Технологическая реализация
Frontend:
Bootstrap UI (фреймворк с готовыми компонентами на JavaScript и CSS)
Backend:
Flask (веб‑фреймворк)
Blueprint (организация API‑маршрутов)
Gunicorn (WSGI‑сервер)
MongoDB (для хранения шаблонов)
PostgreSQL (для хранения данных пользователей)
Alembic (система миграций для PostgreSQL)
Memcached (система кеширования)
Биржевой модуль на Python для взаимодействия с торговой системой
Схема работы

Результаты
Разработка FondTest завершена. Решение используется ОД ФР уже несколько месяцев.
Преимущества для маклеров
Прогон всех тестов по заранее заданным режимам занимает до 10 минут (экономия ~100 минут в день на 10 инструментах)
Удобство: достаточно нажать кнопку и переключиться на другие задачи
Надежность: сервис устойчив к нагрузкам и показывает эффективность






Помимо сервиса FondTest наша команда помогает автоматизировать не только тестирование сложных бизнес-процессов, но и подготовительные работы в настройке стенда для дальнейшего тестирования — это то, что отнимает у пользователей очень много ресурсов. И чем дальше, тем бОльший объем таких работ будет на нашем проекте.
Итоги
За два года мы выросли с внепроектной инициативы до полноценного проекта с командой из 18 человек. Немного цифр:
Параметр |
Сентябрь 2023 |
Июль 2025 |
Прирост |
Число покрытых E2E-тестами БП |
42 |
207 |
+391% |
Число артефактов в jira по результатам E2E-автотестов |
278 |
722 |
+160% |
Руководство позитивно оценивает наше направление и результаты.
Что хотим улучшить:
Привлечь искусственный интеллект (ИИ) для разбора ночных прогонов
Использовать ИИ в проверке merge request’ов
Расширить покрытие тестов в PROD
Принимать активное участие в разработке сервисов/скриптов автоматизации для тестирования
Спасибо за внимание! Если остались вопросы или идеи для продолжения - пишите в комментариях.