记使用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>