【原创】单测代码生成工具Evosuite试用

工具简介

Evosuite是国外大学机构主导开发的一款开源的Java单测代码生成工具,在数次SBST Unit Testing Tool Competition中评测获得最高分。官网地址:http://www.evosuite.org/

Evosuite的主要特性(翻译自官网):

1.对于指定类,生成Junit4类型的单测代码。

2.根据不同覆盖指标调整生成的用例,例如 行覆盖,分支覆盖,输出覆盖等。

3.单测用例最小化,只有对覆盖率有贡献的单测用例才会被保留。

4.生成的单测用例中包含Junit断言。

5.测试运行在sandbox中。

6.虚拟文件系统。

7.虚拟网络。

工具安装方法

工具支持4种方式,包括:1.命令行,2.Eclipst plugin,3.Idea plugin,4.Maven plugin。因为我们工程都是maven工程,因此使用Maven plugin方式介绍。(其他详细用法可参考官网)

1.首先确保项目中有Junit,推荐Junit4.12以上

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <scope>test</scope>
</dependency>

2.在pom.xml中添加下面三段(前两段必须,第三段可选)。 第一段里 evosuite-standalone-runtime.jar是跑单测代码时需要用到的Evosuie运行时环境。第二段 maven plugin用来生成单测代码。第三段是evosuite统计单测覆盖率的plugin。

<dependency>
  <groupId>org.evosuite</groupId>
  <artifactId>evosuite-standalone-runtime</artifactId>
  <version>${evosuiteVersion}</version>
  <scope>test</scope>
</dependency>
-------------------------------------------------------
<pluginManagement>
<plugins>
   <plugin>
      <groupId>org.evosuite.plugins</groupId>
      <artifactId>evosuite-maven-plugin</artifactId>
      <version>1.0.6</version>
      <executions><execution>
         <goals> <goal> prepare </goal> </goals>
         <phase> process-test-classes </phase>
      </execution></executions>
  </plugin>
</plugins>
</pluginManagement>
-----------------------------------------------------
<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>


工具使用方法

Evosuite maven plugin主要包括以下用法:1.generate用来生成单测代码,生成后的单测代码在.evosuite目录下;2.export用来把.evosuite中的单测代码移到指定文件夹下,
默认目标路径是src/test/java,指定路径时使用-DtargetFolder参数;3.info用来显示生成的单测代码信息;4.clean用来清除.evosuite目录下的单测代码;

示例1:mvn evosuite:help -Ddetail=true -Dgoal=generate 显示generate的详细用法,支持的参数。
示例2:mvn evosuite:generate -Dcuts=com.ucenter.users.service.impl.ApiServiceImpl  只针对对ApiServiceImpl生成单测用例。注意:Evosuite基于字节码来生成单测代码,因此源代码必须先编译后,才能使用evosuite.
示例3:mvn -DmemoryInMB=2000 -Dcores=2 evosuite:generate evosuite:export  test,终极用法,编译-》会针对所有类生成单测用例并导出到src/test/java下-》运行单测,-DmemoryInMB=2000表示试用2000MB的内存,-Dcores=2表示用2个cpu来并行加快生成速度。

注意:当工程代码量大时,生成花费的时间可能很长。

工具效果评估

使用业务工程中server层一个service类ApiServiceImpl进行试用,会生成两份文件,ApiServiceImpl_ESTest.java包含单测用例,ApiServiceImpl_ESTest_scaffolding.java 用例基类,用来在测试前初始化Evosuite的沙盒环境。

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

posted on 2020-01-18 19:01  yf清凉  阅读(1470)  评论(0编辑  收藏  举报