为什么在使用maven surefire运行时,surefire会忽略Scala specs2测试的测试类别?

时间:2013-07-17 16:07:13

标签: scala maven junit4 specs2

我有一个Scala Specs 2测试,如下所示:

import org.specs2.mutable.Specification
import org.junit.runner.RunWith
import org.junit.experimental.categories.Category
import util.categories.NightlyTestCategory
import org.specs2.runner.JUnitRunner
import org.junit.Test
import org.junit.runners.JUnit4

@RunWith(classOf[JUnitRunner]) 
class MyTest extends Specification {

  "My Test" should {
    "succeed" in {
      done
    }
  }

}

请注意,上述测试使用自定义运行器JUnitRunner(来自Specs2)来执行测试。我使用Maven 3维护项目并配置surefire以仅包含标记为组NightlyTestCategory的测试:

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.15</version>
    <configuration>
    ...
       <groups>util.categories.NightlyTestCategory</groups>

    </configuration>
  </plugin>

当我执行测试时,我希望Maven不会运行上面的测试,因为它没有使用Category NightlyTestCategory进行注释。但是,Maven确实执行了测试。奇怪的是,如果我将测试转换为使用JUnit4运行程序执行的常规JUnit测试,只有在我添加Category NightlyTestCategory时,Maven才会执行此测试:

@RunWith(classOf[JUnit4])
@Category(Array(classOf[NightlyTestCategory])) 
class MyTest extends Specification {

  @Test
  def test = println("Test")

}    

对我来说,似乎使用自定义Specs2运行程序JUnitRunner以某种方式影响surefire忽略组设置并简单地运行它找到的所有测试。我正在寻找一种解决方案,允许我使用JUnitRunner运行specs2测试,但同时应该尊重该类别。

1 个答案:

答案 0 :(得分:3)

specs2确实还不了解Junit类别。与此同时,解决方法是使用标记:

import org.specs2.specification.Tags

@RunWith(classOf[JUnitRunner])
class MyTest extends Specification with Tags { section("NightlyTest")

  "My Test" should {
    "succeed" in {
      done
    }
  }
}

然后,如果你作为系统参数添加-Dspecs2.include=NightlyTest,那么只会执行此规范。但是这意味着你不能使用 来自Surefire的“群组”配置,您将不得不使用Maven配置文件。

另一种选择是使用所有JUnit / Maven基础架构并仅重用specs2匹配器:

import org.specs2.matcher._

@RunWith(classOf[JUnit4])
@Category(Array(classOf[NightlyTestCategory]))
class MyTest extends JUnitMatchers {

  @Test
  def test = { 1 must_== 1 }

}