2016-01-20 117 views
4

我有一个测试套件,需要手动执行一些设置代码才能确保数据库中的某些数据是正确的。如何在maven surefire运行测试之前执行一次方法

我们使用maven surefire插件并行运行测试。 ${tests.wildcard}由配置文件指定。

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.16</version> 
    <configuration> 
     <forkCount>4</forkCount> 
     <reuseForks>false</reuseForks> 
     <includes> 
      <include>${tests.wildcard}</include> 
     </includes> 
    </configuration> 
</plugin> 

我希望能够在整个maven执行过程中只运行一次方法,然后surefire会并行运行我的测试。我怎样才能做到这一点?

+0

你有没有检查[this](http://stackoverflow.com/questions/12087959/junit-run-set-up-method-once)和[this](http://stackoverflow.com/questions/18574513/junit-run-setup-only-once-for-a-large-of-test-classes)回答一些提示? –

+0

是的,那些不会工作。这会让我的代码每个类运行一次,而不是每个Maven执行一次。 –

回答

3

您可以有一个特殊的测试用例来执行您的验证代码(如果出现问题,将会失败)。

这个测试用例然后将通过一个特定的Maven神火执行(不包括其他测试)只是test阶段之前执行,并且附接至一个Maven相occurring(如process-test-classes):因此,有效地被每Maven的运行和之前调用一次任何其他测试。

然后,正常的test阶段将执行任何其他所需的测试,不包括特殊的初始化测试。

这样的配置的一个例子是:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.19</version> 
    <configuration> 
     <excludes> 
      <exclude>**/InitTest.java</exclude> 
     </excludes> 
    </configuration> 
    <executions> 
     <execution> 
      <id>test-init</id> 
      <phase>process-test-classes</phase> 
      <goals> 
       <goal>test</goal> 
      </goals> 
      <configuration> 
       <test>InitTest</test> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

注意任何神火执行全局配置将排除特殊的初始化测试。然后会执行一个额外的执行(在test阶段之前),并且仅运行初始测试(使用<test>元素,其中priority超过任何其他包含/排除)。

因此,你将有以下流程:

  • 执行特殊的初始化验证数据到数据库(如果需要的话失败)
  • 执行任何其他测试

更新
请注意,您可以实现相同的,也许更具语义的通过覆盖默认的Surefire测试执行(具有default-test执行ID)来运行特殊测试(并排除其他测试),然后为其余部分添加另一个surefire执行(如上面描述的全局配置,这次是特定的执行配置)。
使用这种方法,一切都将附加到test阶段,这就是为什么它会在语义上更加正确,虽然在pom中稍微冗长些。

+0

@安迪你试过这种方法吗?任何反馈? –

+0

对不起,还没有机会检查出来。我一定会回复和/或接受你的回答。感谢您的建议! –

相关问题