偶尔在群里看到卡斯提到 evosuite 这个工具,随手查了下,竟然可以自动生成单元测试,而且看官方视频还不是太复杂,赶紧尝鲜一下。
直接摘抄网上的:
EvoSuite是由Sheffield等大学联合开发的一种开源工具,用于自动生成测试用例集,生成的测试用例均符合Junit的标准,可直接在Junit中运行。
通过使用此自动测试工具能够在保证代码覆盖率的前提下极大地提高测试人员的开发效率。但是只能辅助测试,并不能完全取代人工,测试用例的正确与否还需人工判断。
核心功能:
跟大家推荐一个学习资料分享群:903217991,里面大牛已经为我们整理好了许多的学习资料,有自动化,接口,性能等等的学习资料!人生是一个逆水行舟的过程,不进则退,咱们一起加油吧!
官方提供了包括命令行工具、eclipse 插件、idea 插件、maven 插件 在内的数种运行方式。
其中 eclipse 插件的可以参照 自动化单元测试工具 EvoSuite 的简单使用
四种都大致看了下,其中 maven 插件的方式最为简单,所以选取它来尝鲜。
接下来的流程主要参考官方的 http://www.evosuite.org/documentation/tutorial-part-2/ ,时间关系简略了一些解释说明,有兴趣的同学欢迎阅读官方原文了解。
既然是尝鲜,当然不能直接用官方的项目啦,找了个自己以前找到的开源 java 项目:https://github.com/chenhengjie123/JavaSpringMvcBlog
下一步,按照官方指示,调整下 junit 版本
junit
junit
4.12
test
添加 evosuite 插件
org.evosuite.plugins
evosuite-maven-plugin
1.0.6
...
(可选)官方提到,因为maven中央仓库没有收录这个插件,所以要加上 evosuite 自己的仓库地址。不过经过搜索,中央仓库现在已经有了,所以这步应该可以忽略。如果大家下载不了,可以把下面的配置也加到 pom 里面添加 evosuite 的仓库
EvoSuite
EvoSuite Repository
http://www.evosuite.org/m2
为了执行用例,需要加入 evosuite 的运行依赖:
org.evosuite
evosuite-standalone-runtime
1.0.6
test
开始生成,只需要执行这个命令
mvn evosuite:generate
为了加快速度一步到位,我加了不少参数:
mvn compile -DmemoryInMB=2000 -Dcores=2 -Dcuts=alexp.blog.service.PostServiceImpl -DtargetFolder=src/test/java/evosuite evosuite:generate evosuite:export
简单说明下:
执行完毕后,在 src/test/evosuite 下会增加一个 alexp/blog/service 文件夹,里面存放生成的测试文件:
src/test/java/evosuite
└── alexp
└── blog
└── service
├── PostServiceImpl_ESTest.java
└── PostServiceImpl_ESTest_scaffolding.java
3 directories, 2 files
PostServiceImpl_ESTest.java:测试用例文件
PostServiceImpl_ESTest_scaffolding.java:用例基类,用于在开始测试前初始化 evosuite 的沙盒机制
实际生成的部分代码会有编译错误(mock 的类型和 model 对不上),先通过注释跳过会编译出错的行,然后直接在 idea 执行 PostServiceImpl_ESTest.java ,并统计覆盖率:
看起来覆盖率还挺高。当然,覆盖率并不代表全部,更重要的是测的内容。
摘抄一条生成的单测用例:
但可惜:
不过总的来说,作为异常场景的补充,确实能省很多力。
完整测试代码和被测代码,可以查看:
被测代码:
https://github.com/chenhengjie123/JavaSpringMvcBlog/blob/master/src/main/java/alexp/blog/service/PostServiceImpl.java
生成的测试代码:
https://github.com/chenhengjie123/JavaSpringMvcBlog/blob/master/src/test/java/evosuite/alexp/blog/service/PostServiceImpl_ESTest.java
作者自己写的测试代码(场景不全,但覆盖了正常场景):
https://github.com/chenhengjie123/JavaSpringMvcBlog/blob/master/src/test/java/alexp/blog/service/PostServiceTest.java
工具使用简单,生成的用例确实有效,推荐试用。
但比较适合用于生成一些异常场景的用例,省不少力(当然还得人工 review 下)。正常场景还是得靠人。