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

共 3042字,需浏览 7分钟

 ·

2020-07-10 12:08

作者|高嘉怡

Evosuite简介

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

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

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

Evosuite的配置与使用


maven -- EvoSuite插件

1、pom.Xml配置

配置 junit 版本

  1. <dependencies>

  2. <dependency>

  3. <groupId>junitgroupId>

  4. <artifactId>junitartifactId>

  5. <version>4.12version>

  6. dependency>

  7. 配置evosuite 插件:

  8. <build>

  9. <plugins>

  10. <plugin>

  11. <groupId>org.evosuite.pluginsgroupId>

  12. <artifactId>evosuite-maven-pluginartifactId>

  13. <version>1.0.6version>

  14. plugin>

  15. plugins>

  16. build>

  17. <dependency>

  18. <groupId>org.evosuitegroupId>

  19. <artifactId>evosuite-standalone-runtimeartifactId>

  20. <version>1.0.6version>

  21. <scope>compilescope>

  22. 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

54bcb8802ce9892c30cb81b1422f16e0.webp

控制台执行:

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

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

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

demoService_ESTest:测试用例文件

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


603ac199f2f0252806b2d43caf0366e3.webp

注意:

1、运行后会产生evosuite 文件 存储生成测试用例文件

2、用例生成地址为:DtargetFolder+ Dcuts被测文件路径,

原因:evosuite:export 通过用“导出”,将生成的测试复制

到另一个文件夹,(根据自身情况)导package 与

import需要手动调整

edb479370fba670e009d953fdbbf8511.webp

查看运行结果

Example 1:被测试内容demoTwoService.java

mvn  compile  evosuite:generate  -Dcuts

=demoTest.testService.demoTwoService 

bd06a12ac8c8f106a7eb4d99fcf8b881.webp

生成测试方法case:

6d5421df72e0653ffba0643a0c34e3e8.webp

IDEA-- EvoSuite插件的配置与使用

1、打开IDE,进入setting(mac版本是Preferences)选择plugins,点击Browse repositories,搜索EvoSuite Plugin,然后选择Install plugin

89f975ff58fcfd8e5dc2246efe6bdd45.webp

2、重启IDEA

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

d354ca352bc7e088779fbbd5786915bd.webp

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

f5e4757150a2434f9446e267ea55564f.webp

  • -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)

回车即触发执行,执行完毕后会提示:

a8a0da417dcd445b1d0cca3553889fb9.webp

Example 2:被测试内容demoService

使用插件进行生成测试用例
  1. publicclass demoTwoService {

  2. publicintMath(int a, int b) {

  3. if(a == 0) {

  4. System.out.println("运行1");

  5. return a;

  6. } elseif(b == 0) {

  7. System.out.println("运行2");

  8. return0;

  9. } else{

  10. System.out.println("运行3");

  11. return a/b;

  12. }

  13. }


查看控制台:根据参数生成了执行命令

016b1d4a9546cae3d7fc18f602c08c2d.webp

查看生成用例结构与maven命令行生成一样

877d63c4838d9dfbc8d3bd739fd8965c.webp

生成的测试用例:

26d02087ccdd41074d43b9a31f0b76a6.webp

覆盖率:

43b70cf5797ef5dbdd91ff7ff29dc571.webp

使用EvoSuite的几种情况

例1:以Example 1:被测试内容demoTwoService.java

为例,查看本类调用生成测试用例情况

被测试内容如下:

  1. publicclass TEST {

  2. publicintMath(int a, int b) {

  3. if(a == 0) {

  4. System.out.println("运行1");

  5. return0;

  6. } elseif(b == 0) {

  7. System.out.println("运行2");

  8. return b;

  9. } else{

  10. System.out.println("运行3");

  11. return a / b;

  12. }

  13. }

  14. publicintTest(int a, int b) {

  15. int aa = this.Math(a, b);

  16. System.out.println("结果"+ aa);

  17. return aa;

  18. }

  19. }

生成测试用例

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

bdccaea6e1c75faa02d178903478fe5c.webp

运行Test方法的用例:

3f23c1dc65827a56f75aac7948c8d4de.webp

很明显的是Test调用本类的Math方法,但生成的测试用例

却少了一条 b=0的情况。

覆盖率为84%

10714ab9657e41c89f39b425ce1db5fe.webp

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

5707848c1e6d67617fddc333e25c10c7.webp

生成测试用例:

1148450393c5f07e518a72ef0b08bfc9.webp

运行结果:

e3a456af547afcc9631426484545eb3d.webp

就生成用例与结果看来,未有a=0 与b=0的情况,

而是以结果为正数,负数,0

覆盖率:

259623b358650301659146ed5fd79c01.webp

测试用例的生成一般以被生成的方法的结果为导向,

会将被测方法的每种if与输出结果的情况进行覆盖。

但不会全面覆盖方法中调用的方法。生成的测试

例只能辅助测试,并不能完全取代人工,

测试用例的正确与否还需人工判断。


083699cada412c2d991d8715dcf59b39.webp



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


点个“在看”支持一下?
浏览 49
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报