一、Maven中pom.xml配置

以IDEA+Maven为例:

修改maven中pom.xml文件如下(不唯一)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zjn</groupId>
<artifactId>EvotestDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<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>

<build>
<finalName>EvotestDemo</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<groupId>org.evosuite.plugins</groupId>
<artifactId>evosuite-maven-plugin</artifactId>
<version>1.0.6</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

二、使用 EvoSuite 生成测试用例的步骤

将要被测试的类放置在 src/main/java 文件夹下

在终端窗口命令行输入如下指令:

mvn compile -DmemoryInMB=2000 -Dcores=2 -Dcriterion=line:branch

-DtargetFolder=src/test/java/evosuite evosuite:generate evosuite:export

简单说明下各个参数含义:

compile 表示编译。因为 evosuite 也是基于编译后的.class 文件生成用例的, 所以需要先编译。

-DmemoryInMB=2000 表示使用 2000MB 的内存 -Dcores=2 表示用 2 个 cpu 来并行加快生成速度

-Dcriterion=line:branch 表示覆盖准则选择

这里定义分支、语句覆盖准则 可以定义不止一个覆盖准则,用:隔开就行

-DtargetFolder=src/test/java/evosuite 表示生成的用例放到 src/test/java/evosuite

evosuite:generate 表示执行生成用例

evosuite:export 表示导出用例到 targetFolder 的值所在的目录中


用时 9.846s 成功运行, EvoSuite 生成的自动测试用例,部分截图如下所示:

运行 evosuite 生成的 ArrayUtils_ESTest 测试用例, 可以成功运行,如下图所示:

三、一些问题

从使用 Evosuite 生成测试的结果来看,会生成两份文件,ArrayUtils_ESTest.java 包含单测用例,ArrayUtils _ESTest_scaffolding.java 用例基类,用来在测试前初始化 Evosuite 的沙盒环境。这次使用的覆盖率还挺高的,两种覆盖准则(分支、语句覆盖)下都达到了100%的覆盖率。

当然,覆盖率并不代表全部,更重要的是测的内容。可以看到,有时它没有校验正常逻辑(多个用例会用来校验 null 或者非法参数,唯独缺少正常场景),而且 Evosuite 生成测试用例比较随机,有些方法显然更需要被测试,但是它可能只给了一个用例,显然不够充分。

总的来说,Evosuite 更适用于测试边界情况和异常情况,确实是能省很多力,工具生成的用例也确实有效,是有用的,在正常场景下还是人工更靠谱。 不过由于我使用时间短、对软件测试领域的了解也很有限,也不排除是我对该工具使用不熟练的原因。


(Evosuite运行生成的.evosuite/tmp_2023_01_07_19_42_43/logs/test/std_out_CLIENT.log截图)

如果你感觉读后有收获,可以点击下方打赏请作者喝杯咖啡。