排除ScalaTest(maven)中的特定测试子类
我有一个带有WordSpecLike的超类,每个后端有几个子类排除ScalaTest(maven)中的特定测试子类,scala,maven,scalatest,Scala,Maven,Scalatest,我有一个带有WordSpecLike的超类,每个后端有几个子类 abstract class A extends TestKit(_system) with WordSpecLike { "backend" must { "do something useful" in { //test useful stuff } "print something pretty" in { //test
abstract class A extends TestKit(_system) with WordSpecLike {
"backend" must {
"do something useful" in {
//test useful stuff
}
"print something pretty" in {
//test pretty print
}
}
}
class B extends A {
}
class C extends A {
}
C和B测试不同的后端,但问题是我需要为集成测试分别打开/关闭每个后端测试(使用排除组)。
显然,我不能用taggedAs。
在下面的例子中使用一个单独的特征是不可行的:
trait backendB { this: Tag =>
override val name = "backendB"
}
class B extends A with backendB {
//...
}
}
纯java注释不起作用:
@TagAnnotation
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface backendB {
}
因此,问题是:我是否有其他选项可以在特殊组下运行每个后端测试,或者我必须复制粘贴代码?
Scala版本2.10
ScalaTest版本2.2.2
Java版本1.8.0_20
不能使用sbt代替maven,不能使用scala版本。如果我理解正确,您有时希望排除类B,只运行类C。其他时候排除类C,只运行类B。如果正确,则通常使用相应的标记注释(使用Java进行注释)。例如,这样做会导致B的所有测试都标记为backendB:
@backendB
class B extends A {
}
你没有展示演员系统的来源。关于标记的一点是,它只排除测试,仍然会创建一个B的实例。这意味着它持有的任何状态都将被初始化,在您的情况下,这可能意味着一个参与者系统。这可能就是你所说的“没有工作”的意思。如果是这样,我通常的建议是将该状态惰性地初始化。实例仍将被创建,但由于没有运行任何测试,因此状态将永远不会被访问,并且由于它是惰性的,因此将永远不会被初始化
由于这个回复中有很多未知因素,您可能会在scalatest用户上做得更好,因为在scalatest用户上来回比较容易。好的,我的最终解决方案并不像它可能的那么优雅,但至少它是可行的(还是一种java方式的解决方案) 几个小变化:
trait A-suite extends WordSpecLike {
val tagToExclude = Tag("here we can write anything")
def createTestBackend: Backend
"backend" must {
"do something useful" taggedAs(tagToExclude) in {
val backend = createTestBackend
//test useful stuff
}
"print something pretty" taggedAs(tagToExclude) in {
val backend = createTestBackend
//test pretty print
}
}
}
和不同后端的测试类:
`
现在排除组可以与maven正常工作。谢谢您的回答。是的,您理解正确,但由于某些原因,整个类的注释不起作用-maven只运行它能找到的每个类。
class backendA(override val tagToExclude = "backendA") extends A-suite {
override def createTestBackend: Backend = new backendA
}
class backendB(override val tagToExclude = "backendB") extends A-suite {
override def createTestBackend: Backend = new backendB
}