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. RestControllers, Services, Handlers, Kafka 클래스 등에 대한 JUnits을 처리합니다.
  5. 따라서 거의 모든 시나리오에서 70% 이상의 코드 커버리지를 달성합니다.

자동화 기능

  1. SpringBoot 2.x 및 3.x Maven 기반 애플리케이션에서 작동합니다.
  2. 거의 설정 노력이 필요하지 않습니다.
  3. 애플리케이션의 로컬 경로를 사용하며 매우 기본적인 사용자 입력을 받습니다.
  4. Reflection 유틸리티를 활용하여 애플리케이션 구조에 대한 세부 정보를 추론합니다.
  5. 필요한 Mockbeans를 원활하게 식별합니다.
  6. “When-Then” Mockito 목업을 자동으로 생성합니다.
  7. Jacoco 코드 커버리지 보고서를 생성합니다.

법적 JUnit의 구조

  1. 필수 부분: 3
    1. 대상 테스트 메서드 호출
    2. 이 클래스 외부의 모든 상호 작용을 목 처리
    3. 실제 출력이 예상되는 assert/verify와 일치하는지 확인
  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