- BrainTools - https://www.braintools.ru -
Всем привет! Меня зовут Ренат Дасаев, и я продолжаю рассказ о развитии E2E‑тестирования в Московской Бирже. За два года после публикации первой [1]статьи многое изменилось: мы переупаковали процессы, расширили команду и существенно обновили технический стек. Хотите узнать, как нам удалось масштабироваться и какие инструменты сегодня ускоряют работу? Тогда – эта статья для вас!
Наше направление изначально существовало вне проекта, что серьезно ограничивало бюджет и возможности. В 2024 году мы запустили полноценный проект, показав высокий ROI автоматизации. После сбора потребностей [2] мы пересмотрели сотни бизнес‑процессов (БП) и выделили 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 раза, поэтому мы разделили их на три доменные группы:
Кросс‑рыночные операции – процессы, работающие на нескольких рынках
Отчетные системы – генерация и отправка отчетов
Листинг – постановка инструментов на торги и сопутствующие процессы
В каждой группе назначен ответственный, который:
● Отслеживает прогресс задач
● Решает внутренние технические вопросы
● Участвует в планировании
Каждый день один разработчик автотестов из каждой подгруппы и DevOps‑инженер проверяют инциденты и падения ночного регресса. Статусы публикуются в общем треде корпоративного мессенджера – это ускоряет реакцию [3] на проблемы.
Голосовые стендапы заменены текстовыми в мессенджере: до 09:30 каждый участник отправляет:
● Отчет о выполнении задач за вчера
● План на день
● Текущие блокеры
Плюсы:
● История задач всегда под рукой
● Руководителям проще анализировать статус
● Подготовка отчета занимает менее 5 минут
● Унификация: вся информация за день собирается в одном треде
С прошлого года мы участвуем в финальном релизном тестировании на PROD‑контуре. Перед запуском E2E ‑ тестов:
Согласовываем список тестов и тестовых сущностей (участники торгов, организации, инструменты)
Определяем тайминги и порядок обновления сервисов
Выполняем откат тестовых сущностей
По итогам прогона готовим подробный отчет о тестировании и заводим артефакты в Jira – с ошибками и предложениями.
За прошедшие 2 года изменения произошли не только в процессах, но и в техническом плане.
На полигоне появились:
● Торгово ‑ клиринговая система срочного рынка (ТКС СР)
● Личные кабинеты участника и эмитента (ЛКУ и ЛКЭ)
● Компоненты Единой регистрации клиентов (ЕРК) и рынка депозитно-кредитных операций (ДКО):
o торговые базы
o базы ЭДО
● ИТАС (IT Automated Service – система обслуживания потребителей технических услуг)
● Zabbix [4] – мониторинг QA ‑ ресурсов с уведомлениями в мессенджер
● Apache Guacamole [5] – песочница для разработчиков автотестов
● Nginx [6] ‑ кластер – SSL для тестовых сервисов
● pg_ctlcluster – управление кластерами PostgreSQL [7]
Активно переводим тестовые ресурсы на Red OS [8] в рамках импортозамещения.
Мы перешли с Python 3.8 на 3.11. Что мы получили в итоге?
● Безопасность
o Жизненный цикл Python 3.8 закончился 7 октября 2024 [9]. Python 3.11 планируется поддерживать до октября 2027.
● Расширенная типизация (Type Hints) [10]
● Улучшения в collections [11]
● Улучшенная поддержка match/case [12] (структурное сопоставление)
● Быстродействие
o Судя по бенчмаркам [13] улучшение в быстродействии может достигать до 20%. У нас длинные E2E-тесты, где много различных ожиданий, поэтому тут и не ждали чудес. Главное, что медленнее не стало.
До этого использовали связку flake8 [14] + isort [15] + yapf [16].
К недостаткам можно отнести:
– Обновляется один компонент, скорее всего требуется обновить всю связку.
– Каждый компонент настраивается отдельно со своим конфигом.
Этих недостатков лишен ruff [17].
● Если какого-то функционала в нём нет, его можно расширить через плагины.
● Единый конфиг ruff.toml или pyproject.toml.
● При небольших изменениях разница заметна лишь при внимательном сравнении. Для больших MR’ов скорость обработки важна меньше, так как мы избегаем их создания. В конвейере GitLabCI [18] шаг линтера и форматера составляет доли процента времени работы CI/CD-сервера.
● Ruff изначально выводит отчет в формате JSON (по состоянию на январь 2025). Разработали скрипт, генерирующий HTML – отчет, который прикрепляется к pipeline
● Инструмент активно развивается: регулярные релизы, широкое комьюнити.
Каждый наш E2E-автотест промаркирован списком микросервисов, задействованных в его выполнении. На основании этого списка перед запуском теста проверялось, что все pod’ы с соответствующими микросервисами в кластере Kubernetes [19] находятся в статусе Running. Если проверка проходила успешно – тест запускался. В противном случае он помечался как skipped с указанием причины.
Однако на практике такой проверки часто было недостаточно. Проблемы возникали в следующих кейсах:
● Отсутствие livenessProbe. Не все pod’ы имеют livenessProbe, поэтому при сбоях контейнер не перезапускается, хотя сервис недоступен. При этом pod визуально продолжает числиться в статусе Running.
● Долгая инициализация контейнера. Контейнер может долго проходить все пробы, в результате чего Kubernetes принимает решение перезапустить pod. Это может повторяться циклически, пока инженер вручную не разберется с проблемой.
● Сервис поднят в Kubernetes, но недоступен через ingress.
Чтобы повысить точность проверки готовности микросервисов перед запуском автотестов, мы решили доработать наш механизм пробирования.
Цель – перед запуском любого автотеста выполнять HTTP-запросы ко всем микросервисам, задействованным в этом тесте, и на основе ответа убедиться, что сервис действительно готов принимать и обрабатывать входящие запросы.
При этом мы стремились, чтобы эти запросы были:
● Стандартизированными (меняется только имя сервиса)
● Минимально нагружающими сеть
● Легко обрабатываемыми самим сервисом
● Осуществлялись через ingress
В большинстве микросервисов уже существовал метод /health (его название могло варьироваться в зависимости от внутренних практик), возвращающий статус “UP” при готовности и “DOWN” в противном случае.
Были выполнены следующие шаги:
● Проверили наличие health-эндпоинтов у всех микросервисов, задействованных в E2E-тестах
● Для отсутствующих – создали задачи в Jira на доработку
● Обновили модели и адаптеры более чем в 250 модулях
● Обновили генератор модулей: теперь в новых микросервисах метод /health создается автоматически
Результаты внедрения:
● Анализ ночных прогонов упростился: если сервис не готов, тест пропускается, а не падает с ошибкой [20]
● Получение полного отчета о тестировании происходит быстрее
● В течение первого месяца эксплуатации были зарегистрированы артефакты в Jira по недоступным сервисам — и оперативно устранены
Для снижения нагрузки на основной почтовый сервер мы развернули мок-версию SMTP-сервера MailHog [21] внутри тестового кластера Kubernetes. Теперь все приложения, запущенные в тестовом окружении, отправляют почтовые уведомления через MailHog.
Инструмент обладает удобным веб-интерфейсом для просмотра содержимого почтового ящика и предоставляет API для работы с письмами (получение списка, удаление, получение содержимого по ID).
Как обычно, был разработан Python-модуль для работы с API MailHog – это позволяет удобно использовать его в автотестах, проверяя нужные атрибуты писем: заголовок, тело и прочее.
Ограничения инструмента
MailHog не поддерживает SMTP-авторизацию и TLS/SSL – шифрование. Однако в нашем случае это не является проблемой, поскольку сервер развернут внутри тестового кластера и доступен только изнутри.
Зачем нужны моки в E2E-тестах?
В тестовом контуре не всегда возможно оперативно развернуть новую систему или ее компоненты: настройка CI/CD может занять значительное время. Если тест – аналитику нужно начать работу с системой, которая еще отсутствует на стенде, мы действуем по следующему сценарию:
1. Создаем задачу в Jira для DevOps
2. Параллельно разворачиваем мок – систему, настраиваем маппинг ответов
Проверяем сценарии на UAT – полигоне, где работают реальные интеграции
Переносим настройки на тестовый полигон и готовим окружение к автоматизации
Почему был выбран Wiremock [22]?
● Open Source и бесплатен
● Поддерживает управление через UI и REST API
● Легко запускается: достаточно передать аргументы в jar-файл
Что было реализовано:
● Helm-чарт для деплоя WireMock в Kubernetes
● Библиотека для работы с API WireMock, позволяющая:
○ Получать/удалять запросы
○ Создавать/обновлять/удалять маппинги
○ Получать список всех маппингов
○ Полностью очищать мок-сервер от данных
В предыдущей статье были [1] описаны веб-сервисы, разработанные для автотестирования. Эти наработки и технические решения легли в основу проекта для Операционного департамента фондового рынка (ОД ФР).
Задача
Автоматизировать тестирование новых инструментов фондового рынка (ценные бумаги – акции, облигации), готовящихся к торгам на следующий день.
Подготовка тестового контура (за нее отвечает команда сопровождения ФР)
Ручное тестирование, выполняемое маклерами ОД ФР:
○ Анализ параметров бумаг в таблице
○ Подача заявок и заключение сделок через торговый терминал
○ Проверка позитивных и негативных сценариев
○ В случае выявления ошибок – корректировка описания и повторное тестирование
Команда E2E-автотестирования разработала веб-сервис FondTest, автоматизирующий второй этап – тестирование инструментов.
Преимущества решения
● Сокращение времени тестирования с ~20 минут до 7 – 10 минут на бумагу
● Снижение операционного риска, связанного с ручным вводом
Копия базы выкладывается на тестовый сервер
Торговая система запускается в режиме “следующий торговый день”
Маклер проходит аутентификацию в сервисе FondTest
Выбирает необходимые инструменты для тестирования (см. Рисунок 3. “Список инструментов, готовых к описанию ‘на завтра’”).
При необходимости редактирует шаблон по режиму, если изменились данные (см. Рисунок 4. “Список шаблонов” и Рисунок 5. “Форма шаблона”), а также может:
○ создавать новый шаблон с помощью формы-генератора
○ изменять/удалять шаблоны
○ импортировать/экспортировать шаблоны
Запускает автотесты по выбранному списку инструментов (см. Рисунок 6. “Список тест-кейсов” и Рисунок 7. “Запуск автотестов из сервиса”)
Получает результаты прямо в интерфейсе сервиса (см. Рисунок 8. “Отчет о тестировании”)
Принимает решение об утверждении описания для боевой базы
Frontend:
● Bootstrap UI [23] (фреймворк с готовыми компонентами на JavaScript и CSS)
Backend:
● Python 3.11 [24]
● Flask [25] (веб-фреймворк)
● Blueprint [26] (организация API-маршрутов)
● Gunicorn [27] (WSGI-сервер)
● MongoDB [28] (для хранения шаблонов)
● PostgreSQL [7] (для хранения данных пользователей)
● Alembic [29] (система миграций для PostgreSQL)
● Memcached [30] (система кеширования)
● Биржевой модуль на Python для взаимодействия с торговой системой
Схема работы
Результаты
Разработка FondTest завершена. Решение используется ОД ФР уже несколько месяцев.
Преимущества для маклеров
● Прогон всех тестов по заранее заданным режимам занимает до 10 минут (экономия ~100 минут в день на 10 инструментах)
● Удобство: достаточно нажать кнопку и переключиться на другие задачи
● Надежность: сервис устойчив к нагрузкам и показывает эффективность
Помимо сервиса FondTest наша команда помогает автоматизировать не только тестирование сложных бизнес-процессов, но и подготовительные работы в настройке стенда для дальнейшего тестирования – это то, что отнимает у пользователей очень много ресурсов. И чем дальше, тем бОльший объем таких работ будет на нашем проекте.
За два года мы выросли с внепроектной инициативы до полноценного проекта с командой из 18 человек. Немного цифр:
|
Параметр |
Сентябрь 2023 |
Июль 2025 |
Прирост |
|
Число покрытых E2E-тестами БП |
42 |
207 |
+391% |
|
Число артефактов в jira по результатам E2E-автотестов |
278 |
722 |
+160% |
Руководство позитивно оценивает наше направление и результаты.
Что хотим улучшить:
● Привлечь искусственный интеллект [31] (ИИ) для разбора ночных прогонов
● Использовать ИИ в проверке merge request’ов
● Расширить покрытие тестов в PROD
● Принимать активное участие в разработке сервисов/скриптов автоматизации для тестирования
Спасибо за внимание [32]! Если остались вопросы или идеи для продолжения – пишите в комментариях.
Автор: ren_qa
Источник [33]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/18187
URLs in this post:
[1] первой : https://habr.com/ru/companies/moex/articles/762078/
[2] потребностей: http://www.braintools.ru/article/9534
[3] реакцию: http://www.braintools.ru/article/1549
[4] Zabbix: https://www.zabbix.com
[5] Apache Guacamole: https://guacamole.apache.org
[6] Nginx: https://nginx.org/ru/
[7] PostgreSQL: https://www.postgresql.org/
[8] Red OS: https://redos.red-soft.ru
[9] 7 октября 2024: https://devguide.python.org/versions/
[10] Расширенная типизация (Type Hints): https://peps.python.org/pep-0604/
[11] Улучшения в collections: https://docs.python.org/3/library/collections.html
[12] Улучшенная поддержка match/case: https://peps.python.org/pep-0634/
[13] бенчмаркам: https://github.com/psf/black/blob/master/benchmarks/README.md
[14] flake8: https://flake8.pycqa.org/en/latest/index.html
[15] isort: https://github.com/pycqa/isort/
[16] yapf: https://github.com/google/yapf
[17] ruff: https://astral.sh/ruff
[18] GitLabCI: https://docs.gitlab.com/ci/
[19] Kubernetes: https://kubernetes.io/
[20] ошибкой: http://www.braintools.ru/article/4192
[21] MailHog: https://mailhog.qubitpi.org/
[22] Wiremock: https://wiremock.org/
[23] Bootstrap UI: https://getbootstrap.com/docs/5.0/getting-started/introduction/
[24] Python 3.11: https://www.python.org/downloads/release/python-3110/
[25] Flask: https://flask.palletsprojects.com/en/stable/
[26] Blueprint: https://flask.palletsprojects.com/en/stable/blueprints/
[27] Gunicorn: https://flask.palletsprojects.com/en/stable/deploying/gunicorn/
[28] MongoDB: https://www.mongodb.com/
[29] Alembic: https://alembic.sqlalchemy.org/en/latest/index.html
[30] Memcached: https://pymemcache.readthedocs.io/en/latest/getting_started.html
[31] интеллект: http://www.braintools.ru/article/7605
[32] внимание: http://www.braintools.ru/article/7595
[33] Источник: https://habr.com/ru/companies/moex/articles/935326/?utm_source=habrahabr&utm_medium=rss&utm_campaign=935326
Нажмите здесь для печати.