В настоящее время в Spring Team мы готовим наши библиотеки к предстоящему финальному выпуску поезда Brixton. Это должно произойти в ближайшее время 🙂 До тех пор я трачу много времени после работы, свободное время на Accurest и Stub Runner .
Сегодняшний пост будет посвящен новым вещам, которые вы сможете получить в предстоящем выпуске Accurest 1.1.0 . Также вы можете воспользоваться большинством этих функций в версии 1.1.0.M3 .
Я просто быстро расскажу о функциях, но учтите, что вы можете прочитать о них подробнее в нашей документации .
Изменение имени
AccuREST запускался как библиотека, используемая для блокировки HTTP-вызовов. В следующем выпуске 1.1.0 вы также сможете отключить функцию обмена сообщениями. Вот почему имя меняется на Accurest. Это фантастическое имя, не так ли? 😉
Также, поскольку брендинг важен, теперь вместо вызова io.codearte.accurest.dsl.GroovyDsl вы можете вызвать io.codearte.accurest.dsl.Accurest 🙂
Поддержка обмена сообщениями
Это заняло у меня довольно много времени, но оно того стоило 🙂 Несколько бессонных ночей, и теперь вы можете получить прибыль от определения контрактов на обмен сообщениями. В HTTP у нас была сторона client / stub сторона server / test . Для обмена сообщениями мы добавили методы, которые помогут различить различия:
-
publisherсторона, для которой будут созданы тесты -
consumerсторона, для которой конечные точки обмена сообщениями будут заглушены
контракт
Есть 3 варианта использования с точки зрения производителя сообщения.
- что-то происходит в моем приложении, и я создаю выходное сообщение
- кто-то отправляет сообщение в пункт назначения (очередь / тема), я прослушиваю это сообщение и создам выходное сообщение в другом месте
- кто-то отправляет сообщение в пункт назначения (очередь / тема), я слушаю это сообщение и использую его без отправки сообщения
Здесь вы можете увидеть примеры контрактов для этих трех ситуаций (вы можете узнать больше об этом в документации ):
Выход срабатывает по методу
Выходное сообщение может быть запущено путем вызова метода (например, был запущен планировщик и отправлено сообщение)
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
def dsl = Accurest.make { // Human readable description description 'Some description' // Label by means of which the output message can be triggered label 'some_label' // input to the contract input { // the contract will be triggered by a method triggeredBy('bookReturnedTriggered()') } // output message of the contract outputMessage { // destination to which the output message will be sent sentTo('output') // the body of the output message body('''{ "bookName" : "foo" }''') // the headers of the output message headers { header('BOOK-NAME', 'foo') } }} |
Выход срабатывает по сообщению
Выходное сообщение может быть запущено при получении сообщения.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
def dsl = GroovyDsl.make { description 'Some Description' label 'some_label' // input is a message input { // the message was received from this destination messageFrom('input') // has the following body messageBody([ bookName: 'foo' ]) // and the following headers messageHeaders { header('sample', 'header') } } outputMessage { sentTo('output') body([ bookName: 'foo' ]) headers { header('BOOK-NAME', 'foo') } }} |
Нет выхода, только вход
Там может быть только вход без какого-либо вывода
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
def dsl = GroovyDsl.make { description 'Some Description' label 'some_label' // input is a message input { // the message was received from this destination messageFrom('input') // has the following body messageBody([ bookName: 'foo' ]) // and the following headers messageHeaders { header('sample', 'header') } }} |
Сторона производителя
Здесь вы можете увидеть пример сгенерированного JUnit теста для производителя для сценария ввода / вывода:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
// given: AccurestMessage inputMessage = accurestMessaging.create( "{\\"bookName\\":\\"foo\\"}", headers() .header("sample", "header"));// when: accurestMessaging.send(inputMessage, "input");// then: AccurestMessage response = accurestMessaging.receiveMessage("output"); assertThat(response).isNotNull(); assertThat(response.getHeader("BOOK-NAME")).isEqualTo("foo");// and: DocumentContext parsedJson = JsonPath.parse(accurestObjectMapper.writeValueAsString(response.getPayload())); assertThatJson(parsedJson).field("bookName").isEqualTo("foo"); |
Мы отправляем сообщение в пункт назначения с именем input . Затем мы проверяем, есть ли сообщение в месте назначения output . Если это так, мы проверяем, имеет ли это сообщение правильные заголовки и тело.
Потребительская сторона
Достаточно указать зависимость от соответствующего модуля Stub Runner (для получения дополнительной информации обратитесь к следующему разделу) и указать, какие заглушки следует загружать. Да это все! Stub Runner загрузит заглушки и подготовит заглушки .
Иногда вам нужно как-то вызвать сообщение в ваших тестах. Вот почему мы предоставили интерфейс StubTrigger который вы можете ввести! Если вы уже знакомы с Stub Runner Spring, вы можете использовать бин StubFinder чтобы найти URL своей зависимости. Теперь StubFinder также расширяет интерфейс StubTrigger поэтому вам не нужно вводить какие-либо дополнительные bean-компоненты в ваши тесты.
Есть несколько способов, которыми вы можете вызвать сообщение:
Триггер по метке
|
1
|
stubFinder.trigger('return_book_1') |
Запуск по группам и идентификаторам артефактов
|
1
|
stubFinder.trigger('io.codearte.accurest.stubs:camelService', 'return_book_1') |
Запуск по идентификатору артефакта
|
1
|
stubFinder.trigger('camelService', 'return_book_1') |
Запустить все сообщения
|
1
|
stubFinder.trigger() |
Интеграции
Мы предоставляем следующие встроенные функции:
- Весенняя интеграция
- Весенний облачный поток
- Apache Camel
Также мы предоставляем все строительные блоки для обеспечения индивидуальной интеграции.
Просто предоставляя правильную зависимость
|
1
2
3
4
5
6
|
// for Apache CameltestCompile "io.codearte.accurest:accurest-messaging-camel:${accurestVersion}"// for Spring IntegrationtestCompile "io.codearte.accurest:accurest-messaging-integration:${accurestVersion}"// for Spring Cloud StreamtestCompile "io.codearte.accurest:accurest-messaging-stream:${accurestVersion}" |
Ваши сгенерированные тесты должны просто работать.
Ботинок бегуна окурка
Я добавил новый модуль Stub Runner, который работает на Spring Boot. Предполагая, что вы используете Spring Cloud Stream, вы можете создать проект, который имеет 2 зависимости:
|
1
2
|
compile "io.codearte.accurest:stub-runner-boot:${accurestVersion}"compile "io.codearte.accurest:stub-runner-messaging-stream:${accurestVersion}" |
Теперь, если вы передадите правильную конфигурацию Stub Runner Spring, например:
|
1
|
stubrunner.stubs.ids: io.codearte.accurest.stubs:streamService |
У вас будет запущенное приложение, которое предоставляет конечные точки HTTP
- инициировать сообщения
- проверьте URL-адреса зарегистрированных заглушек WireMock
Accurest Maven Плагин
Мариуш Смикула проделал фантастическую работу, добавив плагин Accurest Maven . Теперь вы можете добавить Accurest в ваш проект, который работает с Maven. Но это еще не все, поскольку плагин Maven позволяет запускать заглушки Accurest с помощью команды accurest:run !
Читайте документы, чтобы узнать больше!
Изменения заглушки
обмен сообщениями
В качестве функции обмена сообщениями я добавил несколько модулей обмена сообщениями. Вы можете прочитать больше о модулях сообщений Stub Runner здесь
Исправлены порты и версии заглушек
Еще одна особенность, которая отсутствовала и является действительно ценной, заключается в том, что теперь вы можете явно сказать, что хотите, чтобы конкретная зависимость запускалась на данном порту. Эта функция доступна с версии 1.0.7 но идентификатор заглушки был изменен в 1.1.0.M4 так что будьте 1.1.0.M4 😉
Идентификаторы изменились, потому что теперь вы можете указать желаемую версию заглушки, которую хотите загрузить.
Через свойства
Теперь вы можете указать идентификатор заглушки:
|
1
|
groupId:artifactId:version:classifier:port |
где версия, классификатор и порт не являются обязательными.
- Если вы не предоставите порт, то будет выбран случайный
- Если вы не предоставите классификатор, то будет выбран класс по умолчанию.
- Если вы не предоставите версию, то + будет пройден, и будет загружена самая последняя версия.
Где порт означает порт сервера WireMock.
Так что, если вы предоставите свою зависимость следующим образом:
|
1
|
stubrunner.stubs.ids: io.codearte.accurest.stubs:streamService:0.0.1-SNAPSHOT:stubs:9090,io.codearte.accurest.stubs:anotherService:+:9095 |
Это сделает Stub Runner:
- загрузите заглушку с groupId:
io.codearte.accurest.stubs, artifactId:streamService, версия:0.0.1-SNAPSHOT, классификатор:stubsи зарегистрируйте ее на порту 9090 - загрузите заглушку с groupId:
io.codearte.accurest.stubs, artifactId:anotherService, последняя версия, классификатор по умолчанию (stubs) и зарегистрируйте его на порту 9095
Через свободный API
При использовании AccurestRule вы можете добавить заглушку для загрузки, а затем передать порт для последней загруженной заглушки.
|
1
2
3
4
5
|
@ClassRule public static AccurestRule rule = new AccurestRule() .repoRoot(repoRoot()) .downloadStub("io.codearte.accurest.stubs", "loanIssuance") .withPort(12345) .downloadStub("io.codearte.accurest.stubs:fraudDetectionServer:12346"); |
Вы можете видеть, что для этого примера допустим следующий тест:
|
1
2
|
then(rule.findStubUrl("fraudDetectionServer")).isEqualTo(URI.create("http://localhost:12346").toURL()); |
Технические изменения
Помимо функций мы провели технический рефакторинг.
Виноград -> Эфир
Я перенес механизм, используемый для загрузки зависимостей из Groovy Grape в Aether. У нас было много проблем с Grape, и Aether работает очень хорошо. Это обратное несовместимое изменение, поэтому, если у вас есть какая-то настраиваемая конфигурация Grape, вам придется перенести ее на Aether.
Зависимости исправлены
У нас были некоторые проблемы с явными и транзитивными зависимостями, которые были исправлены. Банки Accurest должны быть меньше.
Резюме
- Много работы было сделано вокруг Accurest и CDC
- Довольно скоро мы выпустим версию 1.1.0
- Вы можете использовать заглушки ваших зависимостей, которые общаются через обмен сообщениями
- Вы можете использовать фиксированные порты и версии для ваших зависимостей
- Если вам нравится проект, начинайте его на Github 🙂 Это даст нам дополнительный заряд энергии, чтобы тратить на кодирование вместо сна;)
связи
- Accurest Github Repository
- Аккуратная документация
- Документация о заглушках
- Документация по обмену сообщениями в Stub Runner
- Accurest Gitter
- Accurest Maven Плагин
| Ссылка: | Accurest и Stub Runner 1.1.0.M3 от нашего партнера по JCG Марцина Грэйсчака в блоге для кодирования блогов наркоманов . |