记使用ekstazi进行jpetstore测试用例的选择的经历

记使用ekstazi进行jpetstore测试用例的选择的经历

前言

今天尝试使用 ekstazi 进行 jpetstore 测试用例的选择,但是是进行了不顺利,中间经历了很多曲折。

经历

一开始我的想法很简单,就是按照官方文档的 说明 ,在pom.xml文件的加入ekstazi插件的配置。但是由于jpetstore使用了profile,所以我先到itest这个profile的<plugins>标签下加入了下面的代码,唯一的改变就是多加了额<phase>标签(太作了!!!)。

<plugin>
  <groupId>org.ekstazi</groupId>
  <artifactId>ekstazi-maven-plugin</artifactId>
  <version>5.3.0</version> 
  <executions>
     <execution>
       <id>ekstazi</id>
       <phase>test</phase> <!-- 我自以为是,多添加了的东西,给自己造成了不小的麻烦--->
       <goals>
         <goal>select</goal>
       </goals>
     </execution>
  </executions>
</plugin>

在执行了mvn test -P itest后,我发现ekstazi插件并没有被执行,我百思不得其解,我再尝试把上述代码放在pom.xml默认<plugins>标签下,发现任然不执行。

好郁闷啊!!!!!!!!!!!!!!

冷静了一会儿,我发现我一直都是在<pluginManagement>这个标签下的<plugins>标签下添加插件配置,会不会是因为这个标签的原因呢?

在查阅了一番资料后,发现应该是这一块的问题,<pluginManagement>只是用来声明插件的配置,并不决定是否执行插件,jpetstore的插件执行顺序是配置再父模块中。

那解决的方法就很简单了,我直接在itest的profile下的<build>标签下的<plugins>下添加ekstazi的插件配置。这回的确执行了ekstazi插件,但是却是在执行了测试后,在执行ekstazi的插件。

ekstazi是用来进行测试用例选择的,你测试都执行完了,还选择什么啊!!!!!!!!!

我第一反应就是test阶段执行插件的顺序没不是按照我设想的顺序执行的,所以又去查阅一些资料,看如何调整maven插件执行的顺序,发现声明顺序,就是插件执行的顺序。可是我只声明了一个ekstazi插件,surefire插件是父模块中声明的,我没办法改变啊,那我怎么定义它们的顺序呢?

我想我在<pluginManagement>中的surefire插件前面声明ekstazi插件,是不是可以使test阶段ekstazi先执行呢?

还是不行。。。。。。。。

逼我出绝招了,我直接把ekstazi的放在别的阶段执行。我先是放在test-compile阶段执行,这次成功了,但是总感觉怪怪的。

我查看了一些ekstazi-maven的mojo源码,发现他默认把select的绑定在process-test-classes阶段,我又去 maven官网 上查了下在test阶段前有那些阶段,果然不出所料,紧接着test阶段前面的阶段就是process-test-classes阶段,定义这一阶段就是为了对测试代码进行插桩的,正好适合ekstazi。

接下来我为了把ekstai单独封装成了一个profile,这一过程也是费了一番功夫。我以为直接添加个<profile>,在配置下<plugins>下ekstazi和surefire就完事了,但是却报了如下的错误

java.lang.instrument.IllegalClassFormatException: Error while instrumenting 
......
Caused by: org.jacoco.agent.rt.internal_28bab1d.asm.MethodTooLargeException: 
          Method too large: com/gargoylesoftware/css/parser/javacc/CSS3ParserTokenManager.jjMoveNfa_0 (II)I
        at org.jacoco.agent.rt.internal_28bab1d.asm.MethodWriter.computeMethodInfoSize(MethodWriter.java:2080)
        at org.jacoco.agent.rt.internal_28bab1d.asm.ClassWriter.toByteArray(ClassWriter.java:459)
        at org.jacoco.agent.rt.internal_28bab1d.core.instr.Instrumenter.instrument(Instrumenter.java:104)
        at org.jacoco.agent.rt.internal_28bab1d.core.instr.Instrumenter.instrument(Instrumenter.java:123)
        ... 50 more

和itest进行对比后,我发现在itest的中跳过了jacoco这个测试覆盖率插件,而我自己定义的profile则会执行这个插件。我也添加了该配置后,终于成功了。

最终配置

<profile>
  <id>ekstazi</id>
  <build>
    <plugins>
      <plugin>
       <groupId>org.ekstazi</groupId>
       <artifactId>ekstazi-maven-plugin</artifactId>
        <version>5.3.0</version>
        <executions>
          <execution>
            <id>ekstazi</id>
            <!--<phase>process-test-classes</phase>-->
            <goals>
              <goal>select</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <includes>
            <include>**/*IT.class</include>
          </includes>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <configuration>
          <skip>true</skip>
        </configuration>