在ScalaTest(maven)中排除特定的测试子类



我有一个带有WordSpecLike的超类,每个后端有几个子类。

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测试不同的后端,但问题是我需要为集成测试分别打开/关闭每个后端测试(使用排除组)。很明显,我不能使用标签。像下面的例子一样使用单独的特征是不起作用的

    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。如果这是正确的,那么通常您会用相应的标记注释来注释B和C(使用Java制作)。例如,这样做会导致B的所有测试都被标记为backendB:

@backendB
class B extends A {
}

你没有展示的是演员制度的由来。关于标签的一点是,它只排除测试,仍然会创建B的实例。这意味着它所保持的任何状态都将被初始化,在您的情况下,这可能意味着一个actor系统。这可能就是你所说的"不工作"的意思。如果是这样,我通常的建议是惰性地初始化该状态。实例仍将被创建,但由于没有运行任何测试,状态将永远不会被访问,并且由于它是惰性的,因此永远不会被初始化。

由于这个回复中有很多未知因素,您可能会在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
    }
   }    
}

以及针对不同后端的测试类:

`

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
   }

现在排除组与maven一起正常工作。