单元测试自动生成工具EvoSuite的简单使用

2,815 阅读4分钟

本文已参与「新人创作礼」活动.一起开启掘金创作之路。

单元测试自动生成工具EvoSuite的简单使用

一、EvoSuite介绍

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

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

EvoSuite官网为www.evosuite.org

EvoSuite GitHub github.com/EvoSuite/ev…

EvoSuite问题及解答stackoverflow.com/questions/t…

二、EvoSuite插件安装

    EvoSuite 插件需要Java 8 的运行环境,Eclipse里只支持Lunar和Mars版本,IDEA没做要求。

(一)maven插件

1、调整下 junit 版本

junit

junit

4.12

test

2、添加evosuite 的运行依赖

org.evosuite

evosuite-standalone-runtime

1.0.6

test

3、添加 evosuite 插件

org.evosuite.plugins

evosuite-maven-plugin

1.0.6

org.apache.maven.plugins

maven-surefire-plugin

2.20

listener

org.evosuite.runtime.InitializingListener

4、执行命令

mvn compile -DmemoryInMB=2000 -Dcores=2 -Dcuts=alexp.blog.service.PostServiceImpl -DtargetFolder=src/test/java/evosuite evosuite:generate evosuite:export

简单说明下:

  • 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 表示导出用例到 targetFolder 的值所在的目录中

执行完毕后,在 src/test/evosuite 下会增加一个 alexp/blog/service 文件夹,里面存放生成的测试文件:

image.png

然后直接在 idea 执行 PostServiceImpl_ESTest.java ,并统计覆盖率。

效果评估

a. 可以看到 Evosuite 会自动对 servce 依赖的其他对象进行 mock。
b. 针对被测方法的参数,根据参数类型会使用各种边界值进行测试。使用 evoSuite 生成的单测代码覆盖率可以达到:方法覆盖100%,行覆盖51%。
c. 工具存在的不足之处: Mock 对象的方法调用只能返回空值 null 等, 没有对方法进行特定的 stub ,因此正常的逻辑无法走到。EvoSuite 生成的单测用例更适用于测试边界情况和异常情况。正常场景还是得靠人

(二)eclipse安装过程

  1. 打开Eclipse 依次点击菜单栏的help->Install New Software… 截图如下

image.png 、 2.点击Add…按钮,弹出如下对话框

image.png

3.在Location栏中输入EvoSuite Eclipse插件的地址:www.evosuite.org/update 后,点击OK按钮,结果如下

image.png

4.选中 Junit Test Generation 后,点击Next按钮,结果如下

image.png 5.上图中运行时间可能过长,请耐心等待,运行完毕后,结果如下

image.png

6.点击Next按钮,选中 I accept the terms of license agreement后,点击Finish按钮后,显示 Installing Software对话框,等待一段时间后,会弹出如下对话框

image.png 7.点击OK按钮,等待一段时间后,出现如下对话框

image.png 8.点击Yes按钮,Eclipse重启后,随意选中一个java类文件,若出现如下图标,则插件安装成功。

image.png (三)IDEA插件安装过程

官方插件安装教程www.evosuite.org/documentati…

1、安装 EvoSuite Plugin

2、重启 IDEA

3、执行代码

找到任意一个 java 文件,然后右键,即可看到 Run EvoSuite

image.png 点击即可看到参数选项,配置上刚才所说的几个参数即可: f9~tplv-k3u1fbpfcp-zoom-1.image)

image.png evosuite:generate 生成测试用例,默认路径为根目录下 .evosuite 文件夹下 best-tests

cores: 分配 CPU 核数,可以理解为任务进程数

memoryInMB: 分配内存空间

cuts: 需要生成单元测试的源代码,不填默认整个项目

evosuite:export 导出文件

targetFolder 目标路径

三、EvoSuite的简单使用(以eclipse为例)

     选中需要测试的类,右击鼠标,选择Generate tests with EvoSuite ,则会生成测试用例,测试用例生成在项目中的evosuite-tests文件夹内。生成的测试类为标准的Junit 4 测试类,可以完全按照Junit 4 的操作规范对其测试。

image.png

四、Junit测试报告的生成(以eclipse为例)

选中项目,右击鼠标,选择Export->General->Ant Buildfiles后,设置Name for Ant buildfile和Junit output directory(一般不修改使用默认值),点击Finish,项目中出现build.xml文件,选中build.xml,右击鼠标,选择Run As->Ant Build…后,选中junitreport和要生成测试报告的测试类,选中Sort targets后,点击Run按钮,在junit文件夹中可以看到测试报告。

image.png

image.png 在junit文件夹中点击index.html之后,示例结果如下图:

image.png

至此EvoSuite简单使用完毕。

五、结论

1、工具使用简单,生成的用例确实有效,推荐试用。

2、但比较适合用于生成一些异常场景的用例,省不少力(当然还得人工 review 下)。正常场景还是得靠人。