【原创】单测代码生成工具Evosuite试用
工具简介
Evosuite是国外大学机构主导开发的一款开源的Java单测代码生成工具,在数次SBST Unit Testing Tool Competition中评测获得最高分。官网地址:http://www.evosuite.org/。
Evosuite的主要特性(翻译自官网):
1.对于指定类,生成Junit4类型的单测代码。
2.根据不同覆盖指标调整生成的用例,例如 行覆盖,分支覆盖,输出覆盖等。
3.单测用例最小化,只有对覆盖率有贡献的单测用例才会被保留。
4.生成的单测用例中包含Junit断言。
5.测试运行在sandbox中。
6.虚拟文件系统。
7.虚拟网络。
工具安装方法
工具支持4种方式,包括:1.命令行,2.Eclipst plugin,3.Idea plugin,4.Maven plugin。因为我们工程都是maven工程,因此使用Maven plugin方式介绍。(其他详细用法可参考官网)
1.首先确保项目中有Junit,推荐Junit4.12以上
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
2.在pom.xml中添加下面三段(前两段必须,第三段可选)。 第一段里 evosuite-standalone-runtime.jar是跑单测代码时需要用到的Evosuie运行时环境。第二段 maven plugin用来生成单测代码。第三段是evosuite统计单测覆盖率的plugin。
<dependency> <groupId>org.evosuite</groupId> <artifactId>evosuite-standalone-runtime</artifactId> <version>${evosuiteVersion}</version> <scope>test</scope> </dependency>
-------------------------------------------------------
<pluginManagement> <plugins> <plugin> <groupId>org.evosuite.plugins</groupId> <artifactId>evosuite-maven-plugin</artifactId> <version>1.0.6</version> <executions><execution> <goals> <goal> prepare </goal> </goals> <phase> process-test-classes </phase> </execution></executions> </plugin> </plugins> </pluginManagement>
-----------------------------------------------------
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.17</version> <configuration> <properties> <property> <name>listener</name> <value>org.evosuite.runtime.InitializingListener</value> </property> </properties> </configuration> </plugin>
工具使用方法
Evosuite maven plugin主要包括以下用法:1.generate用来生成单测代码,生成后的单测代码在.evosuite目录下;2.export用来把.evosuite中的单测代码移到指定文件夹下,
默认目标路径是src/test/java,指定路径时使用-DtargetFolder参数;3.info用来显示生成的单测代码信息;4.clean用来清除.evosuite目录下的单测代码;
示例1:mvn evosuite:help -Ddetail=true -Dgoal=generate 显示generate的详细用法,支持的参数。
示例2:mvn evosuite:generate -Dcuts=com.ucenter.users.service.impl.ApiServiceImpl 只针对对ApiServiceImpl生成单测用例。注意:Evosuite基于字节码来生成单测代码,因此源代码必须先编译后,才能使用evosuite.
示例3:mvn -DmemoryInMB=2000 -Dcores=2 evosuite:generate evosuite:export test,终极用法,编译-》会针对所有类生成单测用例并导出到src/test/java下-》运行单测,-DmemoryInMB=2000表示试用2000MB的内存,-Dcores=2表示用2个cpu来并行加快生成速度。
注意:当工程代码量大时,生成花费的时间可能很长。
工具效果评估
使用业务工程中server层一个service类ApiServiceImpl进行试用,会生成两份文件,ApiServiceImpl_ESTest.java包含单测用例,ApiServiceImpl_ESTest_scaffolding.java 用例基类,用来在测试前初始化Evosuite的沙盒环境。
1.可以看到Evosuite会自动对servce依赖的其他对象进行mock。
2.针对被测方法的参数,根据参数类型会使用各种边界值进行测试。使用evoSuite生成的单测代码覆盖率可以达到:方法覆盖100%,行覆盖51%。
3.工具存在的不足之处是,Mock对象的方法调用只能返回空值null值等, 没有对方法进行特定的stub,因此正常的逻辑无法走到。EvoSuite生成的单测用例更适用于测试边界情况和异常情况。作为测试边界和异常情况时,使用Evosuite是可以省不少力的。