Статьи

Тестирование асинхронных операций весной с помощью Спока и Байтмана

Это вторая статья, в которой описывается, как тестировать асинхронные операции с платформой Byteman в приложении с использованием среды Spring. В статье обсуждается, как реализовать инфраструктуру Spock, а в первой статье «Тестирование асинхронных операций весной с помощью JUnit и Byteman» основное внимание уделяется реализации тестов с помощью JUnit4.

Нет необходимости читать предыдущую статью, потому что все основы будут повторяться. Тем не менее, я рекомендую вам прочитать эту статью, если вы заинтересованы в тестировании асинхронных операций с JUnit.

Если вы уже прочитали предыдущую статью и все еще помните концепцию тестового примера, вы можете быстро перейти к разделу «Тестирование кода».

Итак, начнем!

В этой статье мы обсудим, как тестировать операции в приложении, которое использует контекст Spring (с включенными асинхронными операциями). Нам не нужно менять производственный код, чтобы достичь этого.

Испытания будут проводиться в Споке. Если вы не знакомы со Споком, я бы посоветовал вам прочитать его документацию .

Вот несколько других полезных ссылок, которые могут дать вам краткое представление о Споке:

Для тестов мы будем использовать функции из библиотеки Byteman. 

Нам также нужно присоединить библиотеку «Bmunit-extension», которая содержит правила JUnit и некоторые вспомогательные методы, используемые во время наших тестов. Хотя BMUnitMethodRuleправило было реализовано для JUnit4, его можно использовать и в Spock. 

Byteman — это инструмент, который внедряет код Java в методы вашего приложения или в методы времени выполнения Java без необходимости перекомпиляции, перепаковки или даже повторного развертывания приложения.

Вам также может понравиться: Использование Byteman для выяснения причин изменения часового пояса на сервере приложений Java.

BMUnit — это пакет, который упрощает использование Byteman в качестве инструмента тестирования, интегрируя его в две самые популярные среды тестирования Java, JUnit и TestNG.

Расширение Bmunit — это небольшой проект на GitHub, содержащий правило JUnit4, позволяющее интегрировать его с платформой Byteman и тестами JUnit и Spock. Он также содержит несколько вспомогательных методов.

В этой статье мы собираемся использовать код из демонстрационного приложения, которое является частью проекта «Bmunit-extension». 

Исходный код можно найти по адресу https://github.com/starnowski/bmunit-extension/tree/feature/article_examples .

Прецедент

Тестовый пример предполагает, что мы зарегистрировали нового пользователя в нашем приложении (все транзакции были совершены) и отправили ему электронное письмо. Письмо отправляется асинхронно. Теперь приложение содержит несколько тестов, которые показывают, как этот случай может быть проверен. Не предполагается, что код, реализованный в демонстрационном приложении для Bmunit-расширения, является единственным или даже лучшим подходом. 

Основная цель этого проекта — показать, как такой случай можно протестировать без изменения производственного кода при использовании Byteman.

В нашем примере нам нужно проверить процесс регистрации пользователя нового приложения. Предположим, что приложение позволяет регистрировать пользователя через REST API. Итак, клиент отправляет запрос с данными пользователя. Затем контроллер обрабатывает запрос. 

Когда транзакция базы данных произошла, но до того, как ответ был установлен, контроллер вызывает Asynchronous Executor, чтобы отправить электронное письмо пользователю со ссылкой для регистрации (для подтверждения его адреса электронной почты).

Весь процесс представлен на диаграмме последовательности ниже.

Пользователь зарегистрироваться рабочий процесс

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

Давайте предположим, что для приложения, которое не имеет проблемы с доступными потоками.

Реализация для нашего REST Controller:


Джава