BankNext拥有超过300个实时微服务的大规模生产环境。多个团队同时在这些服务上工作,增加了破坏功能的风险。手动为现有和新代码添加JUnit和代码覆盖是一项艰巨且极其缓慢的任务。
手动JUnit的挑战
- 编写恰当且有用的JUnit手动操作耗时。
- 缺乏标准化,因为每种方法都不同。
- 由于时间不足,创建的JUnit可能不充分或不正确。
- 由于代码变更,手动同步现有JUnit不切实际。
- 为遗留代码手动编写JUnit是一场噩梦。
- 由于截止日期,JUnit被分配为最低优先级;因此经常被忽略。
- 代码质量严重受损,技术债务累积。
解决方案:JUnit-Mockito自动化
- GitHub
- 自动化工具根据类名创建合法且可工作的JUnit。
- 这些生成的JUnit包含必要的Mockito模拟。
- 处理RestControllers、Services、Handlers、Kafka类等的JUnit。
- 因此,它几乎在所有场景中实现了超过70%的代码覆盖率。
自动化功能
- 适用于SpringBoot 2.x和3.x基于Maven的应用程序。
- 几乎无需设置工作。
- 采用本地应用路径及非常基础的用户输入。
- 利用反射工具推断应用结构细节。
- 无缝识别所需的Mockbeans。
- 自动生成“When-Then”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克隆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