Всем привет! Меня зовут Ренат Дасаев, и я продолжаю рассказ о развитии 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
-
Принимать активное участие в разработке сервисов/скриптов автоматизации для тестирования
Спасибо за внимание! Если остались вопросы или идеи для продолжения — пишите в комментариях.
ссылка на оригинал статьи https://habr.com/ru/articles/935326/
Добавить комментарий