代码改变世界

工具尝鲜--单元测试自动生成工具 evosuite

2020-07-10 07:30  zouhui  阅读(1166)  评论(0编辑  收藏  举报

作者|高嘉怡

Evosuite简介

EvoSuite是由Sheffield等大学联合开发的一种开源工具,用于自动生成测试用例集,生成的测试用例均符合Junit的标准,可直接在Junit中运行。

通过使用此自动测试工具能够在保证代码覆盖率的前提下极大地提高测试人员的开发效率。但是只能辅助测试,并不能完全取代人工,测试用例的正确与否还需人工判断。

官方提供了包括:命令行工具、eclipse 插件、idea 插件、maven 插件 在内的数种运行方式。本文主要介绍:idea 插件、maven 插件。

Evosuite的配置与使用

maven -- EvoSuite插件

1、pom.Xml配置

配置 junit 版本

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
 配置evosuite 插件:
<build>
    <plugins>
        <plugin>
            <groupId>org.evosuite.plugins</groupId>
            <artifactId>evosuite-maven-plugin</artifactId>
            <version>1.0.6</version>
        </plugin>
    </plugins>
</build>
<dependency>
    <groupId>org.evosuite</groupId>
    <artifactId>evosuite-standalone-runtime</artifactId>
    <version>1.0.6</version>
    <scope>compile</scope>
</dependency>

2、maven -- EvoSuite插件使用

使用之前先了解一下基本命令:

  • prepare:需要同时运行EvoSuite测试和现有测试mvn evosuite:prepare test

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

  • -DmemoryInMB=2000:表示使用 2000MB 的内存

  • -Dcores=2 表示用2个 cpu 来并行加快生成速度

  • -Dcuts=alexp.blog.service.PostServiceImpl

    表示只针对 alexp.blog.service.PostServiceImpl 这个类生成用例。多个用例可以用英文逗号分隔

  • -DtargetFolder=src/test/java/evosuite

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

  • evosuite:generate :表示执行生成用例

  • evosuite:export:默认情况下,EvoSuite在“ .evosuite”文件夹中创建测试。通过使用“导出”,将生成的测试复制到另一个文件夹,该文件夹可以使用“ targetFolder”选项设置(默认值为“ src / test / java”)

  • evosuite:clean:删除“ .evosuite”文件夹中的所有数据,该文件夹用于存储到目前为止生成的所有最佳测试

具体更多详情可evosuite:help进行查看

准备被测试方法,如:demoService

控制台执行:

mvn compile evosuite:generate  -Dcuts=demoTest.testService.demoTwoService  evosuite:export  -DtargetFolder=src/main/java/testcase

对指定文件进行编译生成用例 放置指定文件

生成结果如下,有两个文件:

demoService_ESTest:测试用例文件

demoService_ESTest_scaffolding:用例基类,用于在开始测试前初始化


注意:
1、运行后会产生evosuite 文件 存储生成测试用例文件
2、用例生成地址为:DtargetFolder+ Dcuts被测文件路径,
原因:evosuite:export 通过用“导出”,将生成的测试复制
到另一个文件夹,(根据自身情况)导出后对package 与
import需要手动调整



查看运行结果
Example 1:被测试内容demoTwoService.java
mvn  compile  evosuite:generate  -Dcuts
=demoTest.testService.demoTwoService 

生成测试方法case:

IDEA-- EvoSuite插件的配置与使用
1、打开IDE,进入setting(mac版本是Preferences)选择plugins,点击Browse repositories,搜索EvoSuite Plugin,然后选择Install plugin

2、重启IDEA
3、打开idea选择文件右键,就可以看见Run EvoSuite

4、点击Run EvoSuite 可以看见参数输入框

-DmemoryInMB=2000 表示使用 2000MB 的内存
-Dcores=2 表示用2个 cpu 来并行加快生成速度
Mavenlocation:Maven地址,当项目是Maven
项目时需要
EvoSuite location:evosuite-1.0.6.jar包地址,当
项目是非Maven项目时需要
配置maven(D:\workspace\maven\apache-maven
-3.6.3\bin\mvn.cmd)路径或EvoSuitejar路径
如上,配置完Maven location(or EvoSuite location)
回车即触发执行,执行完毕后会提示:

Example 2:被测试内容demoService
使用插件进行生成测试用例publicclass demoTwoService {
publicintMath(int a, int b) {
if(a == 0) {
System.out.println("运行1");
return a;
} elseif(b == 0) {
System.out.println("运行2");
return0;
} else{
System.out.println("运行3");
return a/b;
}
}
查看控制台:根据参数生成了执行命令
查看生成用例结构与maven命令行生成一样
生成的测试用例:

覆盖率:


使用EvoSuite的几种情况例1:以Example 1:被测试内容demoTwoService.java
为例,查看本类调用生成测试用例情况
被测试内容如下:
publicclass TEST {
publicintMath(int a, int b) {
if(a == 0) {
System.out.println("运行1");
return0;
} elseif(b == 0) {
System.out.println("运行2");
return b;
} else{
System.out.println("运行3");
return a / b;
}
}
publicintTest(int a, int b) {
int aa = this.Math(a, b);
System.out.println("结果"+ aa);
return aa;
}
}

生成测试用例
(因为本类2个方法,只截取Test方法的用例):

运行Test方法的用例:

很明显的是Test调用本类的Math方法,但生成的测试用例
却少了一条 b=0的情况。
覆盖率为84%

例2:不在同一个类调用方法

生成测试用例:

运行结果:

就生成用例与结果看来,未有a=0 与b=0的情况,
而是以结果为正数,负数,0
覆盖率:

测试用例的生成一般以被生成的方法的结果为导向,
会将被测方法的每种if与输出结果的情况进行覆盖。
但不会全面覆盖方法中调用的方法。生成的测试
用例只能辅助测试,并不能完全取代人工,
测试用例的正确与否还需人工判断。


本公众号全部原创已整理成一个专栏,请在公众号里回复「测试开发」获取!

点个“在看”支持一下????