Java单测代码⽣成⼯具Evosuite
⼀、EvoSuite简介
EvoSuite 是由 Sheffield 等⼤学联合开发的⼀种开源⼯具,⽤于⾃动⽣成测试⽤例集,⽣成的测试⽤例均符合 Junit的标准,可直接在 Junit 中运⾏。
通过使⽤此⾃动测试⼯具能够在保证代码覆盖率的前提下极⼤地提⾼测试⼈员的开发效率。但是只能辅助测试,并不能完全取代⼈⼯,测试⽤例的正确与否还需⼈⼯判断。
1.1 核⼼功能:
1. 对于指定类,⽣成 Junit4 类型的单测代码。------Generation of JUnit 4 tests for the selected classes
2. 根据不同覆盖指标调整⽣成的⽤例,例如⾏覆盖,分⽀覆盖,输出覆盖等。------Optimization of different coverage criteria, like lines,
branches, outputs and mutation testing
3. 单测⽤例最⼩化,只有对覆盖率有贡献的单测⽤例才会被保留。------Tests are minimized: only the ones contributing to achieve
coverage are retained
4. ⽣成的单测⽤例中包含 Junit 断⾔。------Generation of JUnit asserts to capture the current behavior of the tested classes
5. 测试运⾏在 sandbox 中。------Tests run in a sandbox to prevent potentially dangerous operations
6. 虚拟⽂件系统。------Virtual file system
7. 虚拟⽹络。------Virtual networkjava源码阅读工具
⼆、使⽤
2.1 命令⾏⼯具
命令⾏进⼊到项⽬根⽬录/target/classes/ ⽬录下,输⼊命令:
java -jar evosuite-1.0.6.jar -class ClassName -projectCP targetPath/。
参数说明:
-class :执⾏的对象
-projectCP:设置测试⽣成的类路径
-help:要查看可⽤的命令⾏选项
-criterion :测试的标准参数有(line、branch、cbranch、mutation 、exception等)
-Dminimize=false //它会删除所有不满⾜覆盖率⽬标所需的语句
-Dassertion_strategy=all //使⽤⼤量断⾔⽣成长测试
更过参数请参考开发⽂档:/documentation/tutorial-part-1/
2.2 maven 插件
1. 调整 junit 版本(Junit4.12以上),并增加 evosuite 运⾏依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.evosuite</groupId>
<artifactId>evosuite-standalone-runtime</artifactId>
<version>1.0.6</version>
<scope>test</scope>
</dependency>
</dependencies>
2. 添加 evosuite 插件
<plugin>
<groupId>org.evosuite.plugins</groupId>
<artifactId>evosuite-maven-plugin</artifactId>
<version>1.0.6</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20</version>
<configuration>
<properties>
<property>
<name>listener</name>
<value>org.evosuite.runtime.InitializingListener</value>
</property>
</properties>
</configuration>
</plugin>
3. 执⾏命令⽣成单元测试代码
注意:Evosuite 是基于编译后的字节码来⽣成单测代码的,因此源代码必须先进⾏编译,然后才能使⽤evosuite.
⽰例1:
mvn evosuite:help -Ddetail=true -Dgoal=generate
⽰例2:
mvn evosuite:generate -Dcuts=com.isoftstone.pcis.service.impl.ApiServiceImpl
#注意:当⼯程代码量⼤时,⽣成花费的时间可能很长。
⽰例3:
mvn compile -DmemoryInMB=2000 -Dcores=2 -DtargetFolder=src/test/java/evosuite evosuite:generate evosuite:export test
注意:当⼯程代码量⼤时,⽣成花费的时间可能很长。
可⽤参数和常⽤命令说明:
a. -DmemoryInMB=2000 表⽰使⽤ 2000MB 的内存
b. -Dcores=2 表⽰⽤2个 cpu 来并⾏加快⽣成速度
c. -Dcuts=packageName.className 表⽰只针对指定类⽣成⽤例。多个⽤例可以⽤英⽂逗号分隔
d. -DtargetFolder=src/test/java/evosuite 表⽰⽣成的⽤例放到 src/test/java/evosuite 。
e. 常⽤命令
e1. prepare:需要同时运⾏EvoSuite测试和现有测试mvn evosuite:prepare test
e2. evosuite:generate 表⽰执⾏⽣成⽤例
e3. evosuite:export 表⽰导出⽤例到 targetFolder 的值所在的⽬录中(默认值为“ src / test / java”)
e4. evosuite:clean:删除“ .evosuite”⽂件夹中的所有数据,该⽂件夹⽤于存储到⽬前为⽌⽣成的所有最佳测试
具体更多详情可evosuite:help进⾏查看
4. 执⾏完毕后,在 .evosuite 的⽬录下会⽣成测试⽂件
针对⼀个类会⽣成两份测试⽂件: ***_ESTest.java包含单测⽤例,***_scaffolding.java ⽤例基类,⽤来在测试前初始化Evosuite的沙盒环境。
效果评估
a. 可以看到 Evosuite 会⾃动对 servce 依赖的其他对象进⾏ mock。
b. 针对被测⽅法的参数,根据参数类型会使⽤各种边界值进⾏测试。使⽤ evoSuite ⽣成的单测代码覆盖率可以达到:⽅法覆盖100%,⾏覆盖51%。
c. ⼯具存在的不⾜之处: Mock 对象的⽅法调⽤只能返回空值 null 等, 没有对⽅法进⾏特定的 stub ,因此正常的逻辑⽆法⾛到。EvoSuite ⽣成的单测⽤例更适⽤于测试边界情况和异常情况。正常场景还是得靠⼈
2.3 eclipse 插件
EvoSuite 插件需要 Java 8 的运⾏环境,并且只⽀持 Eclipse 的 Lunar 和 Mars 版本,若系统中有多种 Java 开发环境,需将 Eclipse 的默认jre 设置成 Java 8 版本。
1. 插件安装,并重启Eclipse
2. 插件参数设置
3. 选中需要测试的类,右击⿏标,选择Generate tests with EvoSuite
4. Junit测试报告的⽣成
2.4 idea 插件
1. 插件安装,并重启IDEA
2. 选中需要测试的类,右击⿏标,选择Run EvoSuite
3. 在参数输⼊对话框中,设置参数并执⾏
三、其他类似扩展
商业⼯具:,对应
免费⼯具:CodePlex AnalytiX,EvoSuite,Randoop, JUnitGenerator V2.0(IDEA plugins)