zoukankan      html  css  js  c++  java
  • 【原创】单测代码生成工具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是可以省不少力的。
  • 相关阅读:
    java1.8版本的HashMap源码剖析
    java并发包——阻塞队列BlockingQueue及源码分析
    java多线程(二)-线程的生命周期及线程间通信
    单例设计模式的回顾。。。。
    java多线程的(一)-之java线程的使用
    根据IO流源码深入理解装饰设计模式使用
    IO流回顾与总结第一篇之字节流与字符流的操作。。。。。
    java中的异常类型以及区别????
    设计模式之装饰设计案例
    集合源码(一)之hashMap、ArrayList
  • 原文地址:https://www.cnblogs.com/sanmuqingliang/p/12209897.html
Copyright © 2011-2022 走看看