BankNext의 거대한 생산 환경에는 300개를 초과하는 라이브 마이크로서비스가 있습니다. 이러한 SVC에서 동시에 작업하는 여러 스쿼드는 기능 중断의 위험을 높입니다. 기존 및 새로운 코드에 JUnits와 코드 커버리지를 수동으로 추가하는 것은 번거롭고 매우 느립니다.
수동 JUnits의 문제점
- 적절하고 유용한 JUnits를 수동으로 작성하는 데 시간이 많이 소요됩니다.
- 각각이 다른 접근 방식을 취하므로 표준화가 미흡합니다.
- 시간 부족으로 인해 부족하거나 잘못된 JUnits가 생성됩니다.
- 코드 변경으로 인한 기존 JUnits의 수동 동기화는 실용적이지 않습니다.
- 레거시 코드에 대한 JUnits을 수동으로 작성하는 것은 악몽입니다.
- 마감일로 인해 JUnits에 가장 낮은 우선순위가 할당되어 생략됩니다.
- 코드 품질이 크게 저하되고 기술적 부채가 축적됩니다.
해결책: JUnit-Mockito 자동화
- GitHub
- 자동화는 클래스 이름을 입력받아 합법적이고 작동하는 JUnits을 생성합니다.
- 이러한 생성된 JUnits에는 필요한 Mockito 목이 포함되어 있습니다.
- RestControllers, Services, Handlers, Kafka 클래스 등에 대한 JUnits을 처리합니다.
- 따라서 거의 모든 시나리오에서 70% 이상의 코드 커버리지를 달성합니다.
자동화 기능
- SpringBoot 2.x 및 3.x Maven 기반 애플리케이션에서 작동합니다.
- 거의 설정 노력이 필요하지 않습니다.
- 애플리케이션의 로컬 경로를 사용하며 매우 기본적인 사용자 입력을 받습니다.
- Reflection 유틸리티를 활용하여 애플리케이션 구조에 대한 세부 정보를 추론합니다.
- 필요한 Mockbeans를 원활하게 식별합니다.
- “When-Then” Mockito 목업을 자동으로 생성합니다.
- Jacoco 코드 커버리지 보고서를 생성합니다.
법적 JUnit의 구조
- 필수 부분: 3
- 대상 테스트 메서드 호출
- 이 클래스 외부의 모든 상호 작용을 목 처리
- 실제 출력이 예상되는 assert/verify와 일치하는지 확인
- 외부 클래스를 MockBeans로 식별하고 선언
- 이러한 MockBean 상호 작용으로부터 예상되는 응답을 스텁 처리
- 기본적인 합법적이고 작동하는 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
자동화 실행 전과 후
결론
- BankNext는 자동 JUnit 생성으로 엄청난 시간과 노력을 절약합니다.
- 이는 직접적으로 프로젝트 비용을 절감하는 데 이어집니다.
- 코드 커버리지가 획기적으로 증가합니다.
- 팀은 실제 개발 활동에 완전히 집중할 수 있습니다.
- JUnit은 거의 수동 노력 없이 일관되게 추가/유지됩니다.
- 기술적 부채가 크게 감소합니다.
- 프로덕션에 배포되는 애플리케이션에 대한 신뢰를 크게 높입니다.
Source:
https://dzone.com/articles/banknext-case-study-junit-mockito-automation-1