Всем привет! Меня зовут Ренат Дасаев, и я продолжаю рассказ о развитии 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. Изменения в составе команды за два года

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

Рисунок №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. Что мы получили в итоге?

Линтер и автоформатер

До этого использовали связку 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 может занять значительное время. Если тест - аналитику нужно начать работу с системой, которая еще отсутствует на стенде, мы действуем по следующему сценарию:

  1. Создаем задачу в Jira для DevOps

  2. Параллельно разворачиваеммок — систему, настраиваем маппинг ответов

    • Проверяем сценарии на 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:

  • Python 3.11

  • Flask (веб‑фреймворк)

  • Blueprint (организация API‑маршрутов)

  • Gunicorn (WSGI‑сервер)

  • MongoDB (для хранения шаблонов)

  • PostgreSQL (для хранения данных пользователей)

  • Alembic (система миграций для PostgreSQL)

  • Memcached (система кеширования)

  • Биржевой модуль на Python для взаимодействия с торговой системой

Схема работы

Рисунок №2. Схема процесса тестирования Fondtest
Рисунок №2. Схема процесса тестирования Fondtest

Результаты
Разработка FondTest завершена. Решение используется ОД ФР уже несколько месяцев.

Преимущества для маклеров

  • Прогон всех тестов по заранее заданным режимам занимает до 10 минут (экономия ~100 минут в день на 10 инструментах)

  • Удобство: достаточно нажать кнопку и переключиться на другие задачи

  • Надежность: сервис устойчив к нагрузкам и показывает эффективность

Рисунок №3. Список инструментов, готовых к описанию “на завтра”
Рисунок №3. Список инструментов, готовых к описанию “на завтра”
Рисунок №4. Список шаблонов
Рисунок №4. Список шаблонов
Рисунок №5. Форма шаблона
Рисунок №5. Форма шаблона
Рисунок №6. Список тестовых кейсов
Рисунок №6. Список тестовых кейсов
Рисунок №7. Запуск автотестов из сервиса
Рисунок №7. Запуск автотестов из сервиса
Рисунок №8. Отчет о тестировании
Рисунок №8. Отчет о тестировании

Помимо сервиса FondTest наша команда помогает автоматизировать не только тестирование сложных бизнес-процессов, но и подготовительные работы в настройке стенда для дальнейшего тестирования — это то, что отнимает у пользователей очень много ресурсов. И чем дальше, тем бОльший объем таких работ будет на нашем проекте. 

Итоги

За два года мы выросли с внепроектной инициативы до полноценного проекта с командой из 18 человек. Немного цифр:

Параметр

Сентябрь 2023

Июль 2025

Прирост

Число покрытых E2E-тестами БП

42

207

+391%

Число артефактов в jira по результатам E2E-автотестов

278

722

+160%

Руководство позитивно оценивает наше направление и результаты.

Что хотим улучшить:

  • Привлечь искусственный интеллект (ИИ) для разбора ночных прогонов

  • Использовать ИИ в проверке merge request’ов

  • Расширить покрытие тестов в PROD

  • Принимать активное участие в разработке сервисов/скриптов автоматизации для тестирования

Спасибо за внимание! Если остались вопросы или идеи для продолжения - пишите в комментариях.

Комментарии (0)