BankNext的龐大生產環境擁有超過300個活躍的微服務。多個團隊同時在這些SVC上工作,增加了破壞功能的風險。手動為現有和新代碼添加JUnits及代碼覆蓋率既費力又緩慢。
手動JUnits的挑戰
- 手動編寫適當且有用的JUnits是一項耗時的活動。
- 缺乏標準化,因為每個JUnit採取不同的方法。
- 由於時間不足,創建的JUnits可能不足或不正確。
- 由於代碼變更,手動同步現有的JUnits是不切實際的。
- 手動為舊代碼編寫JUnits是一場噩夢。
- 由於截止日期,JUnits被分配到最低優先級;因此常常被跳過。
- 代碼質量受到極大影響,技術債務累積。
解決方案:JUnit-Mockito自動化
- GitHub
- 自動化工具接受類名並創建合法且可工作的JUnits。
- 這些生成的JUnits包含必要的Mockito模擬。
- 處理RestControllers、Services、Handlers、Kafka類等的JUnits。
- 因此,它在幾乎所有情況下都能實現超過70%的代碼覆蓋率。
自動化功能
- 適用於SpringBoot 2.x和3.x基於Maven的應用程序。
- 幾乎不需要設置工作。
- 取用應用程式的本地路徑及非常基本的用戶輸入。
- 利用反射工具推斷應用結構細節。
- 無縫識別所需的Mockbeans。
- 自動生成“當-然後”Mockito模擬。
- 生成Jacoco代碼覆蓋率報告。
法律JUnit的結構
- 必備部分:3
- 調用目標測試方法
- 模擬此類外部任何交互
- 檢查實際輸出是否符合預期的斷言/驗證
- 識別並宣告所有外部類別為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