BankNext案例研究:JUnit Mockito自動化

BankNext的龐大生產環境擁有超過300個活躍的微服務。多個團隊同時在這些SVC上工作,增加了破壞功能的風險。手動為現有和新代碼添加JUnits及代碼覆蓋率既費力又緩慢。

手動JUnits的挑戰

  1. 手動編寫適當且有用的JUnits是一項耗時的活動。
  2. 缺乏標準化,因為每個JUnit採取不同的方法。
  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. 利用反射工具推斷應用結構細節。
  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