目录
两工具对比结论如下
Diffblue
使用方法
使用此插件的前提条件
不过自动生成单元测试用例还是很香的
EvoSuite
使用方法
分析一下生成的测试用例
把EvoSuite Test和人工的Test分开
两工具对比结论如下
| | | EvoSuite | 基本信息 | 使用方法 | IDEA安装插件后重启即可 | 需要手动配置pom | 生成用例时间 | 快 (不到10秒,不过这可能是依赖项目大小编译速度) | 慢 (同样的源码工程,EvoSuite花了18分钟) | 生成用例位置 | src/test中 | 生成一个隐藏文件夹.evosuite,用例都在这里面 | 测试用例数量 | 一般 | 很多 | 测试用例质量 | 可以直接运行(可能会出现包引用不到) | 生成的用例精确度不高,执行的时候报错较多,且出错位置不是断言错误比较多 | 操作范围 | 可以对指定类/方法进行单独生成测试用例操作 (专业版支持对包生成测试用例) | 对整个项目源码进行扫描生成测试用例 (目前不知道这个工具能不能实现指定类/方法来自动生成测试用例,有兴趣可以调查调查) | 测试用例规范 | 测试路径 | 与源码一致 | 与源码一致 | 测试类名 | 源码类名+Test | 源码类名+_ESTest | 测试基类 | 无@Before等 | 源码类名+_ESTest_scaffolding | 测试用例名 | test+方法名(同名用例名补数字区分) | 以test00、test01....命名 | 测试用例类型 | 基本都是功能验证 | 除功能验证外,还会生成关于异常参数的用例校验 | 特殊API | 无返回值无参数的API | 生成无断言的测试用例 | 生成无断言的测试用例 | 抛异常的API | 对应测试用例抛同样的异常 | 所有用例,不论有没有异常,都会throws Throwable | private的API | 不生成测试用例 | 不生成测试用例 | 你有我没有 | timeout | 无 | 所有用例都加了(timeout = 4000) | 支持指定类/方法重复生成用例 | 支持,重复用例类名以数字区分,用例内容一模一样 | - |
Diffblue
使用方法
IDEA中Setting -> Plugins -> 搜索Diffblue -> Install -> ReStart
使用此插件的前提条件
https://docs.diffblue.com/getting-started/intellij/cover-intellij-plugin/
-
支持的开发工具是IntelliJ ?IntelliJ IDEA的插件库里面可以搜到Diffblue,但是Android Studio里面没有 ?(不过在AS里面意外发现了插件Unit Test Coverage History runner,可以帮忙只执行指定方法的所有相关的单元测试用例) -
支持Maven或Gradle项目,不支持Android项目
不过自动生成单元测试用例还是很香的
找了一个maven项目,试了几次自动生成用例
-
用例生成很快(不到10秒,不过这可能是依赖项目大小编译速度) -
自动生成的单元测试用例大概率都可以直接运行(可能会出现import错误,需要人工解决) -
生成的单元测试类名为被测类名+Test,在Test下面,其余路径与被测类路径一致
-
测试用例名为test+方法名,若一个方法生成多个测试用例的话在用例名最后加上数字区分 ?
-
可以根据类/方法来进行生成测试用例 -
允许重复生成指定类或者方法的单元测试用例,但是内容一样 -
一个被测类只会有一个测试类,但是一个方法会对应多个测试用例(用例名最后加数字区分) -
针对无参且无返回值的方法,不会生成有断言的测试用例 -
识别到抛异常的方法,对应测试用例也会做抛异常的动作 -
很重要的一点:生成的用例都是验证基本功能的,需要人工梳理补充其他测试类型的用例(可能还会包括少量基本功能用例)
EvoSuite
使用方法
以maven项目为例
-
pom.xml中引入EvoSuite插件后,同步刷新一下maven仓库 <plugin>
?<groupId>org.evosuite.plugins</groupId>
?<artifactId>evosuite-maven-plugin</artifactId>
?<version>1.0.6</version>
</plugin> -
然后执行命令检查一下是否引入成功 mvn evosuite:help 成功打印如下 [INFO] Scanning for projects...
[INFO]
[INFO] ----------------< io.diffblue.corebanking:CoreBanking >-----------------
[INFO] Building CoreBanking 1.0.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- evosuite-maven-plugin:1.0.6:help (default-cli) @ CoreBanking ---
[INFO] Maven Plugin for EvoSuite 1.0.6
Plugin used to run EvoSuite to automatically generate high coverage JUnit
tests
?
This plugin has 7 goals:
?
evosuite:clean
Remove all local files created by EvoSuite so far
?
evosuite:coverage
Execute the manually written test suites (usually located under src/test/java)
and return the coverage of each class.
?
evosuite:export
When run, EvoSuite generate tests in a specific folder. New runs of EvoSuite
can exploit the tests in such folder, and/or modify them.
?
So, with 'export' we can copy all generated tests to a specific folder, which
by default points to where Maven searches for tests. If another folder is
rather used (or if we want to run with Maven the tests in the default EvoSuite
folder), then Maven plugins like build-helper-maven-plugin are needed
?
evosuite:generate
Generate JUnit tests
?
evosuite:help
Display help information on evosuite-maven-plugin.
Call mvn evosuite:help -Ddetail=true -Dgoal=<goal-name> to display parameter
details.
?
evosuite:info
Obtain info of generated tests so far
?
evosuite:prepare
Mojo needed to prepare the EvoSuite tests for execution. This is needed to
?make sure that bytecode is properly instrumented.
?
?
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: ?0.501 s
[INFO] Finished at: 2021-08-21T17:26:15+08:00
[INFO] ------------------------------------------------------------------------ -
执行一下命令,生成UT代码 mvn evosuite:generate -
生成的测试用例在.evosuite/best-tests中
-
执行以下命令,可以把.evosuite/best-tests中用例cp到src/test/java中 mvn evosuite:export -
直接运行即可
分析一下生成的测试用例
-
需要人工配置(pom) -
很慢,同样的源码工程,EvoSuite花了18分钟 -
生成的测试用例不在src下,需要手动cp -
生成的测试用例路径与源码一致 -
测试类名以被测类名_ESTest组合 ? -
测试用例类名以test00、test01命名,没有标识度 -
针对同一套源码,测试用例量比较大 -
生成的用例不仅仅有基本功能的,还会做一些异常的校验 -
?生成的测试套件基本都会对应生成scaffolding -
生成的用例精确度不高,执行的时候报错较多,且出错位置不是断言 -
所有用例,不论有没有异常,都会throws Throwable -
所有用例都加了(timeout = 4000)
-
针对无参且无返回值的方法,不会生成有断言的测试用例
把EvoSuite Test和人工的Test分开
-
如果想把自己写的Test和EvoSuite Tests分开,先从src/test/java 中删除所有之前export过来的EvoSuite Test mvn evosuite:help -Ddetail=true -Dgoal=export -
通过运行下面的命令,我们可以知道export goal的详细用法: ?????????????得到如下信息: Available parameters:
?
? targetFolder (Default: src/test/java)
? ? ?
? ? User property: targetFolder - 有两种方式来配置targetFolder:(任选一种)
- 直接修改export 命令
mvn evosuite:export -DtargetFolder=src/test/evosuite - 修改pom.xml文件,在<project>节点下下,添加<properties> 配置:
<properties>
<targetFolder>src/test/evosuite</targetFolder>
</properties> 再次运行: mvn evosuite:export
-
执行完上面其中一种方式,你会发现tests 被exported到src/test/evosuite 如果现在去运行mvn test,你会发现src/test/evosuite的Tests不会被包含到测试中,需要做如下配置: <plugin>
? <groupId>org.codehaus.mojo</groupId>
? <artifactId>build-helper-maven-plugin</artifactId>
? <version>1.8</version>
? <executions>
? ? <execution>
? ? ? <id>add-test-source</id>
? ? ? <phase>generate-test-sources</phase>
? ? ? <goals>
? ? ? ? <goal>add-test-source</goal>
? ? ? </goals>
? ? ? <configuration>
? ? ? ? <sources>
? ? ? ? ? <source>${targetFolder}</source>
? ? ? ? </sources>
? ? ? </configuration>
? </execution>
</executions>
</plugin> -
再次执行mvn test,log中会看到 EvoSuite Test也一起被执行了
把EvoSuite Test和程序员写的Test一起运行
如果手写的tests和EvoSuite Test运行在相同的进程中,它们就会使用相同的执行容器版本。 为了确保执行容器只能激活EvoSuite tests,我们需要增加一个初始化Listener:
<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>
|