BankNext案例研究:JUnit Mockito自动化测试

BankNext拥有超过300个实时微服务的大规模生产环境。多个团队同时在这些服务上工作,增加了破坏功能的风险。手动为现有和新代码添加JUnit和代码覆盖是一项艰巨且极其缓慢的任务。

手动JUnit的挑战

  1. 编写恰当且有用的JUnit手动操作耗时。
  2. 缺乏标准化,因为每种方法都不同。
  3. 由于时间不足,创建的JUnit可能不充分或不正确。
  4. 由于代码变更,手动同步现有JUnit不切实际。
  5. 为遗留代码手动编写JUnit是一场噩梦。
  6. 由于截止日期,JUnit被分配为最低优先级;因此经常被忽略。
  7. 代码质量严重受损,技术债务累积。

解决方案:JUnit-Mockito自动化

  1. GitHub 
  2. 自动化工具根据类名创建合法且可工作的JUnit。
  3. 这些生成的JUnit包含必要的Mockito模拟。
  4. 处理RestControllers、Services、Handlers、Kafka类等的JUnit。
  5. 因此,它几乎在所有场景中实现了超过70%的代码覆盖率。

自动化功能

  1. 适用于SpringBoot 2.x和3.x基于Maven的应用程序。
  2. 几乎无需设置工作。
  3. 采用本地应用路径及非常基础的用户输入。
  4. 利用反射工具推断应用结构细节。
  5. 无缝识别所需的Mockbeans。
  6. 自动生成“When-Then”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克隆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