我有一个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测试,但同时应该尊重该类别。
答案 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 }
}