настройки стендов Cложность изоляции по данным в одной БД Рутинное разворачивание новых сборок Необходимость корректного cleanup после тестирования «Эффект домино» при фейлах массового прогона 11
в форме рабочих сервисов в Docker-образы COMPOSE Jenkins pipeline задача «набирает» необходимые сервисы для формирования окружения под тесты WRAP Системы под тестированием (docker-контейнеры) оборачиваются в лаконичный API в Global Pipeline Library – работа в тестах с ними в стиле ООП RUSH Тесты запускаются параллельно благодаря изоляции окружения от др. задач и объединения сервисов в изолированную сеть Docker 12
определяется в родительском образе «добрым дядей» Развернуть систему – так же просто как вычекнуть из гита Образы с готовыми схемами БД – plug’n’play с сервисом! Использовать образы на локальной машине полезно: разработчикам и аналитикам для отладки и проверки гипотез Контроль версий сервисов (по тегу) – тестирование совместимости и воспроизведение ошибок с прода, локализации версии с внесенным багом Изоляция сети и параллелизм 17
проверяемому функционалу – Легко локализовать – Эффект «домино» сводится к минимуму – Пример: тесты на деплой сервиса, тесты на условную маршрутизацию по XPath, и т.п. Один состав систем под тестированием для всех тестов в задаче – Легко исследовать окружение воспроизведения бага (параметр задачи keepAlive=true) 18
(OK, если код == 0) и консольный вывод Композиция результатов – тоже результат Result r0 = Result.createOkResult() // конъюнкция результатов Result total = r0.append(r1).append(r2) println(total.isOk()) // успех, если все 3 результата успешны Result.allAreFailed(r0, r1) // успех, если все неуспешны Result.allArePassed(r0, r1) // успех, если все успешны Result.onlyOneIsPassed(r0, r1) // успех, если только 1 успешен Result.countPassed(r0, r1) // вернет количество успешных 38
содержимое логов Логи нормализируются (UID заменяется на номер последовательности) TraceFetcher traceFetcher = TraceFetcher.getOne() // Запоминает время, когда начинаются полезные трейсы traceFetcher.setTraceStartingPoint() // Запуск тестов (система пишет трейсы) SoapUI.startTest("MulticastTestSuite", params, "nope MulticastGroup") // Валидация трейсов по содержимому Result total = Result.allArePassed( traceFetcher.fetchTrace(server.atlas) // проверка на содержание строки .containsString("Invoke operation 'MulticastOneWayOperation'"), traceFetcher.fetchTrace(client.atlas) // проверка на соотв-ие файлу .matchesFile("expect/TraceEthalon.txt")) println(total.isOk()) // успех, в случае если обе проверки прошли успешно 39
(автоматическая связь по ID из SoapUI кейса) Явная отправка результатов по кейсу: TestRail.addResultIf(12345, abonFound, "Абонент не найден!") TestRail.addResultIfEq(12346, server.getMib().getVariable("Version"), "1.0", "Версия не совпала с 1.0") TestRail.addResultIfValueInRange(12347, actualValue, 3.14, 0.5) TestRail.addResult(12348, resultObject) 42
@Library('bercut@experimental_branch') – Клон Jenkins Job с Jenkinsfile из другой experimental_branch – Безопасная разработка и отладка Тестирование систем на бранчах – Образы с бранча собираются со спец тэгом x.y---<branch> – Все тесты параметризованы версиями сервисов (бранч входит в этот параметр) – Разработчики самостоятельно запускают тесты на бранчах 44
– отладка Groovy Pipeline порождает много мелких файлов – заканчиваются inodes, нагрузка на IO, дисковое пространство мастера Jenkins Groovy не совсем Groovy 45
создаёт и внедряет бизнес-продукты, кастомизированные решения и тиражируемый софт для операторов связи по всему миру. Партнеры Клиенты — крупнейшие мировые операторы связи и сервис-провайдеры 1000+ инсталляций в разных странах 300+ млн абонентов пользуются услугами на базе решений Bercut Ключевые клиенты 46
– https://dltj.org/article/software-development-practice/ 2) Андрей Маркелов. Интеграционное тестирование зоопарка микросервисов с помощью TestContainers и JUnit 5 – 2018 – https://2018.heisenbug-moscow.ru/2018/msk/talks/4gjiduaauwiiayoaygmki6/ 3) William Morgan. Что такое service mesh и почему он мне нужен. Перевод. – 2017 – https://habr.com/ru/company/flant/blog/327536/ 47