Автор(-ы):
Пеганов Денис Дмитриевич
26 августа 2023
Рецензент
Шепель Алексей
Секция
Информационные технологии
Ключевые слова
Аннотация статьи
В данной статье подробно рассматривается использование Mountebank и Go в качестве средств для тестирования и изоляции сервисов, с основной целью исследования оценки эффективности использования этих инструментов в сфере разработки программного обеспечения, в частности, сокращения затрат, ускорения разработки и повышения надежности тестов. Методология исследования основывается на обзоре существующей литературы, анализе собственного практического опыта автора в использовании этих инструментов, а также на проведении сравнительного анализа их применения и эффективности. В рамках данного исследования демонстрируется, что использование Mountebank и Go приводит к значительным улучшениям в эффективности тестирования и снижению расходов на использование облачных ресурсов AWS. В частности, замена CloudWatch на Mountebank приводит к заметному снижению расходов на содержание и обслуживание AWS-аккаунта команды разработки. В заключении автор подтверждает, что Mountebank и Go предоставляют значительные экономические и операционные преимущества для тестирования микросервисов. Эти инструменты, по мнению автора, становятся незаменимыми в современном мире разработки программного обеспечения, помогая командам эффективно справляться с вызовами, повышать качество своей работы и минимизировать расходы. Исследование является важным шагом в понимании преимуществ и возможностей использования Mountebank и Go, и может послужить отправной точкой для дальнейшего изучения и применения этих инструментов.
Текст статьи
Введение
При разработке программного обеспечения одной из ключевых задач является тестирование. Однако, при работе с распределенными системами и микросервисной архитектурой возникает сложность в изоляции и тестировании отдельных сервисов. Это становится особенно актуальным в современном программном обеспечении, где различные сервисы взаимодействуют друг с другом и зависят от результатов работы других компонентов.
При тестировании одного сервиса может возникнуть проблема, когда невозможно точно воспроизвести окружение или получить ожидаемый ответ из-за недоступности или нестабильности других сервисов. Это затрудняет проведение надежных и консистентных тестов и может привести к ошибкам или непредвиденному поведению в процессе разработки.
Для решения этой проблемы и обеспечения эффективного тестирования существует множество способов, однако не все они стабильные и некоторые из них дорогостоящие в использовании. Кроме того, использование других служб изоляции сервисов зачастую требует дополнительных шагов в CI/CD пайплайне. Пайплайн нужен для автоматизации процесса разработки и предоставления готового ПО конечным пользователям для его установки и использования. Это концепция, описывающая автоматизированный поток работы, где задачи выполняются последовательно и каждый шаг передаёт результаты на следующий. Это подтверждает необходимость поиска более эффективного и удобного инструмента для решения проблемы изоляции и тестирования микросервисов.
Именно здесь в игру вступает Mountebank. Mountebank – это инструмент для изоляции сервисов во время тестирования, который позволяет создавать виртуальные сервисы, имитирующие поведение реальных компонентов системы. Схема использования Mountebank в таком контексте представлена на рисунке 1. Он позволяет смоделировать различные сценарии и ответы от сервисов, а также управлять маршрутизацией запросов и поведением сервисов во время тестирования.
Рис. 1. Схема использования Mountebank для изоляции внешних сервисов
Использование Mountebank при тестировании позволяет достичь высокого уровня изоляции сервисов и контролировать их взаимодействие. Это упрощает проведение тестов, ускоряет процесс разработки и позволяет обнаружить и исправить проблемы ранее в жизненном цикле разработки программного обеспечения.
Mountebank – это простой автономный Node.js сервер, который не требует запуска каждый раз перед началом теста. Он независим от среды тестирования и его использование сводится к изменению конечных точек (адресов) тестируемых сервисов. Таким образом, Mountebank становится мощным и удобным инструментом для решения проблемы, связанной с изоляцией микросервисов и обеспечения надежности и эффективности процесса тестирования.
В рамках работы над этой статьей было использовано сочетание Mountebank и Go для реализации следующих исследовательских целей:
Обзор литературы
В последние годы увеличилось количество исследований и публикаций, посвященных вопросам тестирования и изоляции микросервисов. Большое внимание уделяется поиску эффективных подходов и инструментов для работы с этими сложными и динамичными системами.
Одной из ключевых тем в этом контексте является использование сервисов-заглушек. Большинство исследований фокусируются на применении WireMock для создания моков и заглушек в процессе тестирования микросервисов.
По теме использования Mountebank в этом контексте заметна дефицитность литературы. Однако стоит отметить книгу "Testing Microservices with Mountebank" авторства Brandon Byars [4], которая подробно описывает использование Mountebank для создания виртуальных сервисов. Тем не менее, данная работа не затрагивает использование Mountebank совместно с Go в контексте тестирования и изоляции микросервисов.
В то же время Go является одним из популярных языков программирования для разработки и тестирования микросервисов, но его использование вместе с Mountebank остается малоизученной областью.
Эта статья направлена на заполнение этого пробела, представляя подробное исследование использования Mountebank и Go для тестирования и изоляции микросервисов.
Почему Go
Эта статья посвящена Mountebank с использованием языка программирования Go по нескольким причинам. Во-первых, Go стал одним из наиболее популярных языков программирования для разработки микросервисов [5]. Использование одного языка программирования для разработки и тестирования ПО важно для обеспечения согласованности, эффективности и удобства в написании и поддержке тестовых сценариев, основываясь на уже известном и используемом языке программирования при создании тестируемого функционала.
Во-вторых, Go, со своей простотой, эффективностью и мощными возможностями, предоставляет разработчикам исключительные инструменты для создания микросервисных архитектур. С его строгой типизацией и эффективной работой с сетью, Go предлагает современные решения для разработки и обслуживания распределенных систем [6].
И, наконец, интеграция Mountebank с Go с помощью клиентской библиотеки позволяет удобно создавать и настраивать виртуальные сервисы, отправлять запросы и проверять ожидаемые ответы. Это помогает автоматизировать процесс тестирования и интегрировать его в рабочий процесс разработки на Go, что в конечном итоге способствует повышению качества и надежности микросервисов.
Сравнение Mountebank с другими инструментами
Важно произвести сравнение Mountebank с другими подобными популярными сервисами, такими как WireMock и Mockito, чтобы определить, какой инструмент лучше подходит для изоляции сервисов во время тестирования по трём ключевым критериям: автономность, динамические ответы и совместимость с Go.
Первый критерий, "автономность", позволяет оценить, насколько каждый инструмент является независимым и способен функционировать в отдельной среде. Автономный инструмент обеспечивает легкость в использовании и интеграции в различные проекты.
Второй критерий, "динамические ответы", фокусируется на возможности создания гибких ответов от виртуальных сервисов. Это дает возможность гибко настраивать поведение сервисов во время тестирования, включая генерацию разнообразных ответов.
Наконец, совместимость с Go является важным критерием для разработчиков, работающих с этим языком программирования. Удобная интеграция с Go и возможность использования инструмента для изоляции и тестирования сервисов, написанных на Go, существенно упрощает разработку и поддержку проектов.
Результаты сравнения представлены в таблице 1.
Таблица 1
Сравнение программ для изоляции сервисов во время тестирования
|
Автономность |
Динамические ответы |
Совместимость с Go |
---|---|---|---|
Mountebank |
✔ |
✔ |
✔ |
Wiremock |
✔ |
✔ |
✔ |
Mockito |
✖ |
✖ |
✖ |
Исходя из таблицы выше, произведено сравнение двух инструментов: Mountebank и WireMock.
В итоге, Mountebank и WireMock предоставляют схожие возможности в изоляции и тестировании сервисов. Однако Mountebank имеет преимущество благодаря более активному и обширному сообществу пользователей. Наличие форумов, групп обсуждения и репозиториев на GitHub, посвященных Mountebank, облегчает поиск помощи и поддержки от опытных пользователей и разработчиков.
Кроме того, более приятный и интуитивно понятный web-интерфейс Mountebank делает его использование более комфортным и удобным. Простой и понятный интерфейс позволяет легко настраивать виртуальные сервисы, определять правила маршрутизации и контролировать их поведение. Это значительно сокращает время, затраченное на конфигурацию и управление сервисами, что делает процесс тестирования более эффективным.
Компоненты Mountebank
Mountebank предоставляет два ключевых компонента: Stub и Imposter, которые играют важную роль в эмуляции виртуальных сервисов для тестирования. Вот подробное описание каждого компонента с примерами на Go:
Пример на Go:
var SampleStub = mbgo.Stub{
Predicates: []mbgo.Predicate{
{
Operator: "equals",
Request: &mbgo.HTTPRequest{
Method: "POST",
Path: "/books",
},
},
},
Responses: []mbgo.Response{
{
Type: "is",
Value: mbgo.HTTPResponse{
StatusCode: 200,
Body: APIResponse{
Response: APIResponseBody{
Success: true,
},
},
},
},
},
}
Пример на Go:
var Imposter = mbgo.Imposter{
Port: Port,
Proto: "http",
Name: "imposter",
RecordRequests: true,
AllowCORS: true,
DefaultResponse: mbgo.HTTPResponse{
StatusCode: 200,
},
Stubs: []mbgo.Stub{},
}
Комбинации Stub и Imposter в Mountebank позволяют создавать гибкие и мощные виртуальные сервисы для тестирования. Они предоставляют возможность определения различных запросов, ожидания определенных ответов и эмуляции разных сценариев для проверки функциональности и взаимодействия микросервисов на Go. Проще говоря, Imposter определяет поведение вашего имитирующего сервиса и содержит одну или несколько stub. Stub, в свою очередь, определяет конечные точки (адреса) ваших фиктивных сервисов и указывает, как обрабатывать каждый запрос.
Установка Mountebank
Mountebank – это простое приложение Node.js. Чтобы установить его, нужно выполнить команду npm install -g mountebank в терминале. Также можно проверить установку, запустив mb --version. Это должно отобразить версию Mountebank, которая была установлена.
Вот и все. После выполнения вышеупомянутых действий терминал знает команду mb, которая запускает Mountebank.
Веб-интерфейс Mountebank
После успешного запуска Mountebank можно получить доступ к его веб-интерфейсу. Встроенный веб-сервер Mountebank предоставляет интерфейс управления, который можно открыть в веб-браузере. Пример домашней страницы Mountebank представлен на Рисунке 2. Обычно адрес доступа к локальному веб-интерфейсу - http://localhost:2525. В веб-интерфейсе можно создавать, настраивать и управлять виртуальными сервисами Mountebank.
В результате установки и запуска Mountebank получается работающий экземпляр инструмента и доступ к его веб-интерфейсу для настройки и управления виртуальными сервисами. Это позволяет эффективно эмулировать и тестировать микросервисы, а также контролировать их поведение во время тестирования.
Рис. 2. Домашняя страница запущенного Mountebank
Рекомендации по использованию Mountebank
Заключение и результаты использования Mountebank
В своей команде по разработке ПО я успешно имплементировал Mountebank и результаты были впечатляющими: стоимость AWS-аккаунта моей команды снизилась, прекратив активное использование CloudWatch [7], и одновременно увеличилась скорость и надежность автотестов.
Ранее, для тестирования микросервисов, в моей команде активно использовался CloudWatch, что в конечном итоге приводило к значительным затратам. Примерно половина стоимости услуг AWS была результатом использования этого сервиса по просмотру логов. Однако, после внедрения Mountebank, получилось сэкономить средства, перестав использовать CloudWatch для тестовой среды. Mountebank предоставил возможность эмулировать взаимодействие с реальными сервисами, что в сочетании с его легкостью в использовании существенно снизило расходы AWS-аккаунта.
Более подробная информации представлена на графиках ниже, где стоит обратить внимание, что в июле я начал работать над применением Mountebank в тестах, и уже в августе стоимость начала существенно сокращаться. В сентябре стоимость ресурсов AWS упала примерно в 2 раза.
График, демонстрирующий динамику снижения стоимости AWS-аккаунта в процессе внедрения Mountebank, представлен на рисунке 3.
Рис. 3. График стоимости AWS-аккаунта
График динамики цены сервиса CloudWatch во время внедрения Mountebank – рисунок 4.
Рис. 4. График стоимости сервиса CloudWatch
Более того, с применением Mountebank тесты начали выполняться гораздо быстрее и стали более надежными. Mountebank позволяет создавать и управлять виртуальными сервисами, эмулируя их поведение в различных сценариях тестирования. Время выполнения тестов удалось снизить практически в 2 раза. Это помогает проверять взаимодействие между сервисами, а также обнаруживать и решать проблемы раньше. Соответствующий график приведён на рисунке 5.
Рис. 5. График времени выполнения автотестов
Благодаря Mountebank значительно улучшился процесс тестирования, что привело к повышению качества кода и уверенности в работе микросервисов. С помощью Mountebank количество “ненадёжных” (имеющих отрицательный результат из-за изменений во внешних системах) тестов снизилось в ~4 раза. Отношение общего количества тестов к таким тестам представлено на рисунке 6.
Рис. 6. Отношение общего количества тестов к «ненадёжным»
В итоге, благодаря использованию Mountebank, моя команда сэкономила средства, улучшилась производительность автотестов и повысилась надежность микросервисов в целом. Этот инструмент стал незаменимой частью нашего тестирования и разработки, и я рекомендую его всем, кто стремится к экономии ресурсов, улучшению процесса тестирования и повышению надежности сервисов.
Достигнутые цели статьи:
Список литературы
Поделиться
Пеганов Д. Д. Mountebank и Go: мощное сочетание для тестирования и изоляции сервисов // Актуальные исследования. 2023. №34 (164). С. 6-14. URL: https://apni.ru/article/6922-mountebank-i-go-moshchnoe-sochetanie-dlya-tes