五 、打造代码自动生成最佳方案
既然市场上的插件都不是特别合适,就决定写一个适合自己项目的插件(暂时命名JCode5)。有兴趣的也可以自己试试。
1. 插件安装
idea插件市场下载,搜索JCode5。
2. 插件使用
插件有三个功能
· 生成json数据,通常用来生成测试数据,比如model。用来参数化测试。
· 增加测试方法,随着业务开发,类可能增加一下功能方法,这个时候相应的可以增加测试方法
定位到需要测试的类,快捷键或菜单定位到generater,如下,选择JCode5。
生成测试类
目前支持三个选项,后续会逐渐完善。
另外两个功能类似,直接尝试使用一下就行。
生成的结果---类+json数据
@ParameterizedTest
@ValueSource(strings = {"/com/cq/common/JCode5/testExtend.json"})
public void testExtendTest(String str) {
JSONObject arg= TestUtils.getTestArg(str);
Integer i = arg.getInteger("Integer");
// 识别泛型活着集合类
List<String> stringList = JSONObject.parseArray(arg.getString("List<String>"),String.class);
String stringArg = arg.getString("String");
String stringArg1 = arg.getString("String");
String stringArg0 = arg.getString("String");
// 识别四个方法,包括父类调用、其他方法调用
when(testService.testBase(any(Integer.class))).thenReturn(stringArg);
when(testService.testMuti(any(List.class),any(Integer.class))).thenReturn(stringList);
when(testService.getStr(any(Integer.class))).thenReturn(stringArg0);
when(testService.testOther(any(Student.class))).thenReturn(stringArg1);
jCode5.testExtend(i);
//todo verify the result
}
如上除了生成基本的代码,另外会生成测试数据,它会将该方法所需要的测试数据全都生成在一个json文件当中,完全实现
“数据和代码的分离”
如testExtend.json:
{
"Integer":1,
"String":"test",
"List<String>":[
"test"
]
}
补充判定语句
这一块前期考虑对于不同的方法有不同的校验,所以目前想的还是开发者自己去写验证代码。
注意事项
在自动生成完代码之后,虽然可以运行,但如我们前面提到的,为了写单元测试而写的单元测试是没什么价值的,我们的最终目的是为了写一个好的测试。代码自动生成,但它终究能力有限,所以还是需要我们自己再去验证,比如
·该插件生成的代码需要junit5和mockito的支持,使用时需要引入相关的依赖
· 增加assert校验逻辑,看是不是想要的结果,目前插件不会自动生成assertEquals等断言代码。
· 运用参数化测试能力,复制一份生成的json文件并修改输入数据,多组测试
3. 插件实现介绍
主要的实现思路,参考了dubbo的SPI的源码,也就是自动实现自适应SPI那部分,简单点说就是反射获取代码逻辑,然后生成测试代码。
4. 后期规划
mock数据可定制,目前的想法是:
·固定值比如目前的String: test、Integer和boolean: 0、1
· 测试者使用配置模版,比如txt文件包含keyValue对
· 使用Faker,对于name、email、phone这种特定倾向的数据进行特色自动生成
自动分支测试,这一块的想法目前主要针对if来做,需要一定的时间。
六、 写在最后
对于代码自动生成,还是有很多东西可以做的,但有些问题还尚待解决,希望能尽最大努力解放我们的双手,也能提高我们单元测试的质量。
已在我们项目中使用此模式增加135个测试用例(除去mock的单模块达到70%):速度比集成测试(pandora、spring等)提升一个等级。代码的覆盖率相对可观。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理