覆盖或隐藏从父套件继承的测试



假设我在一个抽象类中有几个测试,打算在一个trait的几个实现上运行:

trait Foo {
  def method1
  def method2
  // etc.
}
class Foo1 extends Foo { ... }
class Foo2 extends Foo { ... }
class Foo3 extends Foo { ... }
abstract class FooTest extends FunSuite with Matchers {
  val foo: Foo
  test("method1") { foo.method1 should equal(...) }
  test("method2") { ... }
}
class Foo1Tests extends FooTests { val foo = new Foo1 }
...

不幸的是,有一些测试不能通过Foo2,其他测试不能通过Foo3。可以把它们看作是Foo的规范,其中不完整的实现可能已经有用了。我希望有一种方法可以将一些继承的测试标记为挂起(或完全隐藏它们)。

FooTests分解为基于子类测试工作的特征并不是一个解决方案:未来可能会添加新的子类,包括在外部项目中。

使用JUnitSuite会有帮助,因为测试只是方法,可以正常覆盖,但这可能太迟了。

放在抽象类主体中的任何代码都将被执行,句号。如果希望能够排除某些测试,则需要自定义解决方案。其中之一是根据名称排除测试:

abstract class FooTest extends FunSuite with Matchers {
  def excluded: Seq[String] = Seq.empty
  override def test(testName: String, testTags: Tag*)(testFun: => Unit) =
    if (excluded.contains(testName)) ()
      else super.test(testName, testTags: _*)(testFun)
  test("method1") { ... }
  test("method2") { ... }

那么在子类中,您可以排除一些测试,如下所示:

class Foo1Test extends FooTest {
  override def excluded = Seq("method2")
}

你当然可以想出更多的语法糖,但我认为如果它只是为了隐藏测试直到它们被实现,那就不值得花太多时间了。

还请注意,使用这种方法可以完全隐藏测试,但是您也可以在调用test之前标记它们、标记它们或执行任何您想要的操作。

最新更新