Исследование случая BankNext: Автоматизация с JUnit и Mockito

BankNext’с массивной производственной средой включает более 300 работающих микросервисов. Несколько команд, работающих одновременно над этими SVC, повышает риск нарушения функциональности. Добавление JUnits и ручная проверка покрытия кода в существующем и новом коде является трудоемким и чрезвычайно медленным процессом.

Проблемы с ручным созданием JUnits

  1. Времязатратная деятельность по написанию подходящих полезных JUnits вручную.
  2. Отсутствие стандартизации, так как каждый использует разные подходы.
  3. Создание неполных/неправильных JUnits из-за нехватки времени.
  4. Ручное обновление существующих JUnits из-за изменяющегося кода непрактично.
  5. Написание JUnits вручную для устаревшего кода — кошмар.
  6. JUnits имеют наименьший приоритет из-за сроков; поэтому их часто пропускают.
  7. Качество кода страдает чрезмерно, и накапливается технический долг.

Решение: Автоматизация JUnit-Mockito

  1. GitHub 
  2. Автоматизация принимает имя класса и создает работающие JUnits, соответствующие законодательству.
  3. Эти сгенерированные JUnits содержат необходимые моки Mockito.
  4. Обрабатывает JUnits для RestControllers, Services, Handlers, классов Kafka и т.д.
  5. Таким образом, она обеспечивает более 70% покрытия кода практически во всех сценариях.

Возможности автоматизации

  1. Работает как для приложений SpringBoot 2.x, так и для 3.x на основе Maven.
  2. Почти нулевое усилие на настройку.
  3. Извлекает локальный путь вашего приложения & очень простые пользовательские входы.
  4. Использует средства Reflection для выведения деталей структуры приложения.
  5. Без проблем определяет необходимые Mockbeans.
  6. Автоматически генерирует “Когда-Тогда” моки Mockito.
  7. Генерирует отчеты о покрытии кода Jacoco.

Структура законного JUnit

  1. Обязательные части: 3
    1. Вызвать целевой метод теста
    2. Замокать любые взаимодействия, которые находятся вне этого класса
    3. Проверить, соответствует ли фактический результат ожидаемому утверждению/проверке
  2. Определить и объявить все внешние классы как MockBeans
  3. Заглушить ожидаемые ответы от этих взаимодействий MockBean
  4. Ниже приведены основные правила для базового законного рабочего JUnit
Shell

 

Junit-Mockito  Ground Rules

1- target mtd to be tested createCustomer is a void returnType   
2- external mtd invoked .delete     is a void returnType
3- when-then   :  doNothing whenInvoke .delete
4- assertion    :  verify .delete called 1 times  

1- target mtd to be tested createCustomer is a void returnType   
2- external mtd invoked .save          is a Customer returnType
3- when-then   :  when  save then return new Customer
4- assertion    :  verify .save called 1 times

1- target mtd to be tested createCustomer is a Customer returnType   
2- external mtd invoked .save          is a Customer returnType
3- when-then   :  when  save then return new Customer
4- assertion    :  assert result instanceof Customer / Customer is not null

1- target mtd to be tested createCustomer is a Customer returnType   
2- external mtd invoked .findAll          is a List returnType
3- when-then   :  when findAll then return new ArrayList
4- assertion    :  assert result instanceof List / List.size >0

Демонстрация автоматизации

Просмотреть демо здесь.

Shell

 

cd C:\Vijay\Java              [your local machine path]
git clone https://github.com/vijayredkar/junit-mockito-automation.git

# Моя конечная структура директорий
# C:\Vijay\Java\AutomationJunitMockito\appsetup
# C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\junit-automation 

cd C:\Vijay\Java\AutomationJunitMockito\appsetup
setup.bat

------- Шаги демо ------
https://vijayredkar.medium.com/banknext-case-study-junit-mockito-automation-ac9f6b72cfcc
https://github.com/vijayredkar/junit-mockito-automation

C:\Vijay\Java\AutomationJunitMockito\appsetup

demo scenario -1
com.banknext.customer.mgt.service.CustomerServiceImplType1   
com.banknext.customer.mgt.controller.CustomerMgtControllerType1 

demo scenario -2
com.banknext.customer.mgt.service.CustomerServiceImplType2   
com.banknext.customer.mgt.controller.CustomerMgtControllerType2                 

demo scenario -3
com.banknext.customer.mgt.event.publisher.CustomerTxnPublisherType1             
com.banknext.customer.mgt.event.consumer.CustomerTxnConsumerType1               

demo scenario -4
https://github.com/bezkoder/spring-boot-h2-database-crud/tree/master
cd C:\Vijay\Java\projects\junit-mockito-mgt\test-projects
#git clone https://github.com/bezkoder/spring-boot-h2-database-crud.git
cd C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\spring-boot-h2-database-crud
mvn clean install

cd C:\Vijay\Java\AutomationJunitMockito\appsetup
run setup.bat

cd C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\spring-boot-h2-database-crud
mvn clean install
import in Eclipse
add POM dependencies
check current Jacoco code coverage
 

continue automation run 
check/adjust generated Junits
check current Jacoco code coverage
cd C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\spring-boot-h2-database-crud

check new Jacoco code coverage

run all tests 
cd C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\spring-boot-h2-database-crud
mvn clean install
check again all Jacoco code coverage

C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\spring-boot-h2-database-crud\src\main\java\com\bezkoder\spring\jpa\h2
com.bezkoder.spring.jpa.h2.controller.TutorialController
com.bezkoder.spring.jpa.h2.model.Tutorial
TutorialController

До и после запуска автоматизации

Заключение

  1. BankNext экономит огромное количество времени и усилий благодаря автоматическому созданию JUnit.
  2. Это прямо переводится в экономию расходов на проект.
  3. Покрытие кода значительно увеличивается.
  4. Команда может полностью сосредоточиться на реальных разработках.
  5. JUnit добавляются/поддерживаются постоянно с почти нулевым ручным трудом.
  6. Технический долг значительно уменьшается.
  7. Значительно повышает уверенность в приложениях, развернутых в производстве.

Source:
https://dzone.com/articles/banknext-case-study-junit-mockito-automation-1