Главная
АИ #34 (164)
Статьи журнала АИ #34 (164)
Mountebank и Go: мощное сочетание для тестирования и изоляции сервисов

Mountebank и Go: мощное сочетание для тестирования и изоляции сервисов

Автор(-ы):

Пеганов Денис Дмитриевич

26 августа 2023

Рецензент

Шепель Алексей

Секция

Информационные технологии

Ключевые слова

Mountebank и Go
тестирование
изоляция сервисов
разработка программного обеспечения
эффективность
сокращение затрат
ускорение разработки
надежность тестов

Аннотация статьи

В данной статье подробно рассматривается использование 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 для реализации следующих исследовательских целей:

  1. Исследование Mountebank и Go как мощного сочетания инструментов, позволяющих сократить затраты, ускорить процесс разработки и повысить надежность тестов.
  2. Изучение возможностей Mountebank в контексте изоляции сервисов во время тестирования, которое позволяет создавать виртуальные сервисы, имитирующие поведение реальных компонентов системы.
  3. Подведение итогов уроков, полученных из опыта работы с 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 – это standalone-инструмент (приложение, функционирующее независимо), который может быть запущен на отдельном сервере или в локальной среде разработки без дополнительных ассоциаций с другими системами. WireMock – также является standalone-инструментом, не требующим внешних зависимостей, и может быть развернут на отдельном сервере или запущен локально.
  • Динамические ответы: Mountebank предоставляет обширные возможности для создания динамических ответов от виртуальных сервисов. Он позволяет определять правила маршрутизации и контролировать поведение сервисов во время тестирования, включая динамическую генерацию ответов, использование переменных и имитацию внешних сервисов. WireMock также предоставляет возможности для создания динамических ответов, включая правила маршрутизации и генерацию данных на основе шаблонов. Он поддерживает использование переменных и предоставляет гибкие функции для настройки поведения сервисов.
  • Совместимость с Go: Mountebank полностью совместим с Go и может быть использован для изоляции и тестирования сервисов, написанных на этом языке. Он обеспечивает удобный интерфейс для создания и управления виртуальными сервисами, что упрощает интеграцию с проектами на Go. WireMock также совместим с Go и может быть использован для тестирования сервисов, написанных на этом языке. Он предлагает богатый функционал для создания виртуальных сервисов и тестирования взаимодействия с ними.

В итоге, Mountebank и WireMock предоставляют схожие возможности в изоляции и тестировании сервисов. Однако Mountebank имеет преимущество благодаря более активному и обширному сообществу пользователей. Наличие форумов, групп обсуждения и репозиториев на GitHub, посвященных Mountebank, облегчает поиск помощи и поддержки от опытных пользователей и разработчиков.

Кроме того, более приятный и интуитивно понятный web-интерфейс Mountebank делает его использование более комфортным и удобным. Простой и понятный интерфейс позволяет легко настраивать виртуальные сервисы, определять правила маршрутизации и контролировать их поведение. Это значительно сокращает время, затраченное на конфигурацию и управление сервисами, что делает процесс тестирования более эффективным.

Компоненты Mountebank

Mountebank предоставляет два ключевых компонента: Stub и Imposter, которые играют важную роль в эмуляции виртуальных сервисов для тестирования. Вот подробное описание каждого компонента с примерами на Go:

  • Stub – заглушка, которая представляет собой настройки для виртуального сервиса, определяющие его поведение и ожидаемые ответы на запросы. Заглушка позволяет эмулировать конкретное взаимодействие с реальным сервисом или эмулировать различные сценарии для тестирования разных состояний системы.

Пример на 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,
              },
           },
        },
     },
  },
}

  • Imposter – компонент, представляющий собой конфигурацию для виртуального сервиса, содержащую одну или несколько заглушек (stub). Он определяет настройки прослушивания порта, протоколы, эндпоинты (адреса) и правила маршрутизации для различных заглушек. Импостер позволяет создавать и управлять группой заглушек, образуя виртуальный сервис.

Пример на 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

  1. Использование переменных и шаблонов. Mountebank предлагает возможность использования переменных и шаблонов для генерации динамических данных в запросах и ответах. Это полезно для создания различных сценариев тестирования и эмуляции разных состояний сервисов. Рекомендуется использовать эти функции, чтобы упростить создание и поддержку разнообразных тестовых сценариев.
  2. Резервирование портов и управление конфликтами. При запуске виртуальных сервисов Mountebank занимает порты, поэтому важно убедиться, что используемые порты не конфликтуют с другими сервисами или процессами. Рекомендуется организовывать резервирование портов, чтобы избежать возможных конфликтов и обеспечить корректную работу нескольких виртуальных сервисов.
  3. Документация и комментарии. Чтобы облегчить понимание и поддержку кода, написанного на Go, стоит документировать и комментировать написанный код, связанный с использованием Mountebank. Описывать цели, особенности и сценарии тестирования, а также объяснять, какие виртуальные сервисы создаются и какие запросы и ответы ожидаются. Хорошая документация помогает команде понять код и облегчает поддержку в будущем.
    Следуя этим рекомендациям, можно более эффективно использовать Mountebank в процессе разработки и тестирования. Организация тестовых сценариев, использование переменных и шаблонов, управление портами, интеграция с CI/CD и хорошая документация помогут повысить качество вашего кода и надежность микросервисов, написанных на Go.

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

Достигнутые цели статьи:

  1. Представлены результаты работы: стоимость AWS-аккаунта команды снизилась, скорость и надежность автотестов кратно увеличилась. Это помогло улучшить проверку взаимодействия между сервисами, и обнаруживать и решать проблемы раньше.
  2. Продемонстрирована возможность эмулирования взаимодействия с реальными сервисами, используя Mountebank и Go.
  3. Приведены рекомендации на основе опыта работы с Mountebank и Go, и предложены способы, как другие команды могут внедрить эти технологии для улучшения своих процессов тестирования и изоляции сервисов. Этот инструмент рекомендуется для всех команд, стремящихся к экономии ресурсов, улучшению процесса тестирования и повышению надежности сервисов.

Список литературы

  1. Mountebank [Internet]. [cited 2023 Jul 31]. Available from: http://www.mbtest.org/
  2. Go Programming Language [Internet]. [cited 2023 Jul 31]. Available from: https://go.dev/doc/
  3. Getting Started with Mountebank [Internet]. Mountebank. [cited 2023 Jul 31]. Available from: http://www.mbtest.org/docs/gettingStarted
  4. Byars B. Testing Microservices with Mountebank. 1st ed. Manning; 2017.
  5. Seven Best Programming Languages for Microservices [Internet]. Camunda. [cited 2023 Jul 31]. Available from: https://camunda.com/blog/2022/09/seven-best-programming-languages-for-microservices
  6. Why Golang with Microservices [Internet]. Surf. [cited 2023 Jul 31]. Available from: https://surf.dev/why-golang-with-microservices
  7. Amazon Web Services [Internet]. Amazon CloudWatch. [cited 2023 Jul 31]. Available from: https://aws.amazon.com/cloudwatch

Поделиться

406

Пеганов Д. Д. Mountebank и Go: мощное сочетание для тестирования и изоляции сервисов // Актуальные исследования. 2023. №34 (164). С. 6-14. URL: https://apni.ru/article/6922-mountebank-i-go-moshchnoe-sochetanie-dlya-tes

Похожие статьи

Актуальные исследования

#27 (209)

Прием материалов

29 июня - 5 июля

осталось 6 дней

Размещение PDF-версии журнала

10 июля

Размещение электронной версии статьи

сразу после оплаты

Рассылка печатных экземпляров

22 июля