Wiremock что это
Перейти к содержимому

Wiremock что это

  • автор:

Использование сценариев WireMock

В этом кратком руководстве показано, как мы можем протестировать HTTP-API с отслеживанием состояния с помощью WireMock .

Чтобы начать работу с библиотекой, сначала ознакомьтесь с нашим руководством Introduction to WireMock .

2. Зависимости Maven​

Чтобы иметь возможность воспользоваться библиотекой WireMock , нам нужно включить в POM следующую зависимость:

 dependency>   groupId>com.github.tomakehurstgroupId>   artifactId>wiremockartifactId>   version>2.21.0version>   scope>testscope>   dependency> 

3. Пример API, который мы хотим смоделировать​

Концепция сценариев в Wiremock заключается в том, чтобы помочь смоделировать различные состояния REST API . Это позволяет нам создавать тесты, в которых используемый API ведет себя по-разному в зависимости от своего состояния.

Чтобы проиллюстрировать это, мы рассмотрим практический пример: сервис «Java Tip», который дает нам разные советы о Java всякий раз, когда мы запрашиваем его конечную точку /java-tip .

Если мы попросим чаевые, мы вернем их в text/plain :

"use composition rather than inheritance" 

Если бы мы позвонили туда еще раз, то получили бы другой совет.

4. Создание состояний сценария​

Нам нужно, чтобы WireMock создавал заглушки для конечной точки «/java-tip» . Каждая заглушка будет возвращать определенный текст, который соответствует одному из 3 состояний фиктивного API:

 public class WireMockScenarioExampleIntegrationTest    private static final String THIRD_STATE = "third";   private static final String SECOND_STATE = "second";   private static final String TIP_01 = "finally block is not called when System.exit()"   + " is called in the try block";   private static final String TIP_02 = "keep your code clean";   private static final String TIP_03 = "use composition rather than inheritance";   private static final String TEXT_PLAIN = "text/plain";    static int port = 9999;    @Rule   public WireMockRule wireMockRule = new WireMockRule(port);    @Test   public void changeStateOnEachCallTest() throws IOException    createWireMockStub(Scenario.STARTED, SECOND_STATE, TIP_01);   createWireMockStub(SECOND_STATE, THIRD_STATE, TIP_02);   createWireMockStub(THIRD_STATE, Scenario.STARTED, TIP_03);    >    private void createWireMockStub(String currentState, String nextState, String responseBody)    stubFor(get(urlEqualTo("/java-tip"))   .inScenario("java tips")   .whenScenarioStateIs(currentState)   .willSetStateTo(nextState)   .willReturn(aResponse()   .withStatus(200)   .withHeader("Content-Type", TEXT_PLAIN)   .withBody(responseBody)));   >    > 

В приведенном выше классе мы используем класс правил WireMock JUnit WireMockRule . Это настраивает сервер WireMock при запуске теста JUnit.

Затем мы используем метод WireMock stubFor для создания заглушек, которые мы будем использовать позже.

Ключевые методы, используемые при создании заглушек:

  • whenScenarioStateIs : определяет, в каком состоянии должен находиться сценарий, чтобы WireMock мог использовать эту заглушку.
  • willSetStateTo : дает значение, которое WireMock устанавливает для состояния после того, как эта заглушка была использована.

Начальное состояние любого сценария — Scenario.STARTED . Итак, мы создаем заглушку, которая используется, когда состояние Scenario.STARTED. Это переводит состояние в SECOND_STATE.

Мы также добавляем заглушки для перехода из SECOND_STATE в THIRD_STATE и, наконец, из THIRD_STATE обратно в Scenario.STARTED. Итак, если мы продолжим вызывать конечную точку /java-tip , состояние изменится следующим образом:

Сценарий.STARTED -> SECOND_STATE -> THIRD_STATE -> Scenario.STARTED

5. Использование сценария​

Чтобы использовать сценарий WireMock, мы просто делаем повторные вызовы конечной точки /java-tip . Итак, нам нужно изменить наш тестовый класс следующим образом:

 @Test   public void changeStateOnEachCallTest() throws IOException    createWireMockStub(Scenario.STARTED, SECOND_STATE, TIP_01);   createWireMockStub(SECOND_STATE, THIRD_STATE, TIP_02);   createWireMockStub(THIRD_STATE, Scenario.STARTED, TIP_03);    assertEquals(TIP_01, nextTip());   assertEquals(TIP_02, nextTip());   assertEquals(TIP_03, nextTip());   assertEquals(TIP_01, nextTip());   >    private String nextTip() throws ClientProtocolException, IOException    CloseableHttpClient httpClient = HttpClients.createDefault();   HttpGet request = new HttpGet(String.format("http://localhost:%s/java-tip", port));   HttpResponse httpResponse = httpClient.execute(request);   return firstLineOfResponse(httpResponse);   >    private static String firstLineOfResponse(HttpResponse httpResponse) throws IOException    try (BufferedReader reader = new BufferedReader(   new InputStreamReader(httpResponse.getEntity().getContent())))    return reader.readLine();   >   > 

Метод nextTip() вызывает конечную точку /java-tip и затем возвращает ответ в виде строки . Поэтому мы используем это в каждом вызове assertEquals() , чтобы убедиться, что вызовы действительно заставляют сценарий циклически перемещаться между различными состояниями.

6. Заключение​

В этой статье мы увидели, как использовать сценарии WireMock, чтобы имитировать API, который меняет свой ответ в зависимости от состояния, в котором он находится.

Как всегда, весь код, используемый в этом руководстве, доступен на GitHub .

Saved searches

Use saved searches to filter your results more quickly

Cancel Create saved search

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

wiremock_app — это андроид приложение для передачи SMS сообщений с определенного получателя на сервер wiremock.

azamat163/wiremock_app

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Switch branches/tags
Branches Tags
Could not load branches
Nothing to show
Could not load tags
Nothing to show

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Cancel Create

  • Local
  • Codespaces

HTTPS GitHub CLI
Use Git or checkout with SVN using the web URL.
Work fast with our official CLI. Learn more about the CLI.

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

Latest commit message
Commit time

README.md

wiremock_app

wiremock_app — это андроид приложение для передачи SMS сообщений с определенного получателя на сервер wiremock.

Настройка wiremock — сервера

  • Скачать wiremock — сервер по ссылке
  • Для запуска wiremock сервера выполнить следующую команду:
java -jar wiremock-standalone-2.1.7.jar 

Если хотите запустить с конкретным портом, то нужно выполнить:

java -jar wiremock-standalone-2.1.7.jar --port 9999 
  • Для проверки успешного запуска сервера нужно выполнить команду:
http://localhost:9999/__admin 

Оффициальный сайт wiremock: ссылка

Описание основных полей в приложении wiremock_app:

  • host port — это ip — адрес, на котором запущен wiremock — сервер, например 192.168.0.1.
  • server port — это порт, под которым запустили wiremock сервер, например 9999
  • PATH — это путь куда будет приходить данные, например можно задать /test , то соответственно url будет следующим:
http://localhost:9999/test 
  • receiver — это отправитель, по которому будет считываться SMS сообщение, например github

Спасибо, что дочитали до конца ��

About

wiremock_app — это андроид приложение для передачи SMS сообщений с определенного получателя на сервер wiremock.

Интегрируйте Wiremock в Java-приложение Spring Boot для проверки внешних зависимостей

WireMock – фиктивный сервер для API на основе HTTP. Некоторые могут считать это инструментом виртуализации сервисов или фиктивным сервером. Это позволяет отключить API или другую внешнюю зависимость, от которой вы зависите, для ускорения локальной разработки. Он поддерживает тестирование крайних случаев и режимов сбоев, которые настоящий API не будет надежно создавать. Это также полезно для выявления внешних зависимостей в модульных и интеграционных тестах. Отличная интеграция с jUnit.

Добавить зависимость от Wiremock

Сначала вы захотите добавить зависимость Wiremock. Вы можете скачать обычную зависимость или полную версию JAR, которая содержит все ее зависимости. Мы будем использовать стандартную зависимость здесь. Добавьте следующую зависимость в ваш build.gradle

WireMock – швейцарский нож в арсенале тестировщика. Часть 1

Привет! Меня зовут Анатолий Калмыков, и я отвечаю за качество создаваемых решений в компании Ростелеком ИТ.

Статья получилась длинной, поэтому в данной части узнаем, что такое WireMock, в каких случаях его необходимо использовать, как его разворачивать и настраивать, как правильно сопоставлять запросы с заглушками и как использовать журналирование.

WireMock – это одновременно и утилита и библиотека на java для создания HTTP заглушек над веб-сервисами. Он создает HTTP-сервер, к которому мы могли бы подключиться, как к реальному веб-сервису. Сегодня речь пойдет исключительно о WireMock в амплуа утилиты, standalone http сервер, который можно настроить как душе угодно, не зная языков программирования.

Кейсы, которые наталкивают на использование HTTP заглушек

  • Веб-сервисы могут быть не всегда доступны из-за технических обновлений, подвержены перегрузкам или ошибкам сетевых протоколов;
  • Если поставщик сервиса находится далеко, сетевая среда нестабильная и при вызове сервиса происходит задержка, то время прохождения тестов может значительно увеличиваться;
  • Тесты покрывают не все возможные варианты ответов сервиса. Не всегда есть возможность получить некоторые ответы от реального веб-сервиса и промоделировать все рабочие ситуации — следовательно, максимально полно протестировать взаимодействие;
  • Не всегда можно воспроизвести нестандартные ситуации с реальным веб-сервисом, например эмуляция различных ошибок в HTTP протоколе, эмуляция задержки на уровне сетевого соединения;
  • Доступ к рабочим веб-сервисам ограничен. Встречается ситуация, когда рабочие сервисы недоступны из тестового контура, в котором программисты ведут разработку. Это делается как по причине безопасности, так и для того, чтобы не подвергать лишней нагрузке рабочее окружение;
  • Из-за ошибок разработки могут быть подвергнуты риску реальные данные. Например, есть веб-сервисы, которые позволяют добавлять или изменять данные в удаленной системе. Ошибка при вызове такого сервиса может привести к потере данных;
  • Тестовые данные, которые используются в тест-кейсах не всегда имеют постоянность на том или ином сервисе, и если нет возможности достать данные из какой-нибудь базы данных, то приходится постоянно поддерживать данные тесты в актуальном состоянии;
  • В рамках нагрузочного тестирования не всегда получается провести полноценную нагрузку на смежных веб-сервисах, за которые ваша команда не отвечает. Если проводить такую нагрузку на реальных неподконтрольных вам веб-сервисах, то это может привести к поломке данных сервисов, что может негативно отразиться на результатах нагрузочного тестирования, а также нанести ущерб команде, которая развивает данные сервисы.

Разворачиваем WireMock

Чтобы начать пользоваться всеми прелестями данного инструмента, его нужно для начала развернуть. Где разворачивать уже принципиально ваши предпочтения, я лишь могу дать рекомендации. Для начала рекомендую его поднять на локальной машине, не важно, что у вас за ось, Linux, Windows или Maс, главное, чтобы у вас стояла Java 8 версии и выше либо docker. Развернуть на локальной машине нужно исключительно для того, чтобы попрактиковаться с API WireMock. Попрактиковавшись, его необходимо будет развернуть на каком-нибудь сервере, который находится внутри вашей корпоративной сети. Зачем это нужно? Дело в том, что у многих проекты приватные. Они не имеют доступ извне. И, скорее всего, развернув WireMock на своем локальном ПК, у веб-сервиса, который будет повернут на ваш WireMock, не будет сетевого доступа. Следовательно, у вас ничего не получится. Поэтому в перспективе WireMock необходимо развернуть на сервере, который находится внутри вашей корпоративной сети.

Для того, чтобы поднять WireMock необходимо сначала скачать standalone jar WireMock из официального репозитория, далее открываем консоль в репозитории, где находятся исполняемые файлы и выполняем следующую команду:

java -jar wiremock.jar

В данном случае WireMock поднимется на порту 8080. Если хотите, можно также поднять его в Docker контейнере, выполнив следующую команду:

docker run -it --rm -p 8080:8080 --name wiremock wiremock/wiremock:2.33.2

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

У WireMock масса параметров запуска, мы затронем самые основные:

Параметр

Описание

Параметр для переопределения номера порта, по умолчанию 8080

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

Параметр для ограничения записей в журналах запросов, работает если не указан параметр —no-request-journal, нужен для того чтобы не обслуживать WireMock в течении долгого времени, на мой взгляд ограничения в 1000 хватает за глаза, но при желании можно изменить, но если его не указать журналирование не будет ограничено, что приведет к жору места на диске и росту потребления ОЗУ

Количество потоков, для обработки входящих запросов, по умолчанию 10, есть смысл увеличивать если будете использовать в нагрузочном тестировании

Включить асинхронную обработку запросов в Jetty. Этот параметр дает очень большой профит при использовании WireMock для нагрузочного тестирования с задержками

Количество фоновых потоков ответа, по умолчанию 10, работает только если указан параметр —async-response-enabled. Повышать нужно только если на нагрузочном не хватает производительности заглушек

Параметр для активации шаблонов Handlebars, это один из самых основных параметров, который нужно использовать в первую очередь

Параметр для добавления расширений в WireMock, у WireMock есть несколько официальных расширений, одно из самых востребованных это добавление функциональности callback и webhooks

Параметры нужно передавать при старте WireMock дальше их изменить можно только при перезапуске.

Пример оптимального набора параметров для нагрузочного тестирования:

java -jar wiremock.jar \ --global-response-templating \ --container-threads 120 \ --no-request-journal \ --async-response-enabled true \ --async-response-threads 80

У wiremock есть расширение Webhooks and Callbacks, настоятельно рекомендую его использовать, так как оно дает возможность создания заглушек для асинхронных инфопотоков. Более подробно данное расширение разберем в следующей части.

Для работы расширения требуется уже Java 11 версии и выше, а также требуется скачать само расширение с официального репозитория. Данное расширение нужно положить в папку, где лежит основной jar файл WireMock, далее открываем консоль в репозитории, где находятся исполняемые файлы и выполняем следующую команду:

java -cp wiremock.jar:wiremock-webhooks.jar \ com.github.tomakehurst.wiremock.standalone.WireMockServerRunner \ --extensions org.wiremock.webhooks.Webhooks \ --global-response-templating \ --max-request-journal-entries 1000

Для запуска в Docker, необходимо файл с расширением положить в папку extensions, и при запуске указать путь до нее:

docker run -it --rm -p 8080:8080 --name wiremock \ -v $PWD/extensions:/var/wiremock/extensions wiremock/wiremock:2.33.1 \ --extensions org.wiremock.webhooks.Webhooks \ --global-response-templating \ --max-request-journal-entries 1000

Создание заглушки

После того как вы подняли WireMock, по пути http://>:>/__admin будет доступно API для настройки WireMock, можно сделать первую заглушку, отправим запрос на WireMock:

POST http://>:>/__admin/mappings < "name": "Простая заглушка - Привет мир!", "request": < "method": "GET", "url": "/some/thing" >, "response": < "status": 200, "body": "Hello world!", "headers": < "Content-Type": "text/plain" >> >

В ответ придут параметры сконфигурированной заглушки и её идентификатор, с помощью которого в дальнейшем можно применять CRUD операции над созданной заглушкой. Данный запрос сделает заглушку, которая вернет в ответе текст Hello world если отправим GET запрос по пути http://>:>/some/thing .

Тело запроса состоит из трех корневых параметров:

  • name – название заглушки, советую использовать его всегда и называть заглушки такими именами, что бы вы потом не запутались в массе созданных заглушек;
  • request – объект сопоставления запросов к заглушкам, подробнее его разберем далее;
  • response – объект, в котором настраиваются параметры ответа, подробнее его разберем далее.

После создания заглушки, можно получить её параметры следующим запросом:

GET http://>:>/__admin/mappings/>

Изменить заглушку можно следующим запросом:

PUT http://>:>/__admin/mappings/> < "name": "Простая заглушка - Привет мир!", "request": < "method": "GET", "url": "/some/thing" >, "response": < "status": 200, "body": "Hello!", "headers": < "Content-Type": "text/plain" >> >

Удалить заглушку можно следующим запросом:

DELETE http://>:>/__admin/mappings/>

Сопоставление запросов к заглушкам

В данном разделе описаны всевозможные способы сопоставления HTTP запроса к заглушке, сущность HTTP запроса состоит из следующих частей:

  • Метод
  • URL
    • Протокол
    • Хост
    • Порт
    • Параметры пути
    • Параметры запроса
    • Авторизация
    • Cookies
    • Прочие заголовки

    В WireMock можно сделать сопоставление по всем частям HTTP запроса, причем можно комбинировать между сопоставлениями по различным частям, а также использовать условия OR и AND ко всем сопоставлениям.

    Мы уже сталкивались с объектом request, который содержит сопоставления, теперь настало время рассмотреть все его параметры более детально в данном разделе.

    Сопоставление по url

    url – строгое сопоставление по параметрам пути и параметрам запроса, нужно понимать что если вы сделали сопоставление на определенные параметры запроса и к примеру добавится какой то новый параметр или вовсе изменится порядок определения параметров запроса, то строгое сопоставление не сработает.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *