Статьи

Тестирование асинхронных операций весной с JUnit и Byteman

Узнайте больше о JUnit и Byteman!

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

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

Тесты будут запускаться в JUnit 4. Для тестов мы будем использовать функции из библиотеки Byteman. Нам также пришлось присоединить библиотеку «Bmunit-extension», которая содержит правило JUnit и некоторые вспомогательные методы, используемые во время наших тестов.

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 . Поэтому клиент Rest API отправляет запрос с данными пользователя. Контроллер Rest API обрабатывает запрос. После того, как база данных, транзакция фиксируется, но перед возвратом ответа Rest API, контроллер вызывает Asynchronous Executor, чтобы отправить электронное письмо пользователю со ссылкой для регистрации (для подтверждения адреса электронной почты).

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



 

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

Реализация содержит Rest Controller:


Джава