在Scala after()方法中有没有办法知道测试是否失败?

时间:2016-11-22 04:07:57

标签: scala scalatest

我有一个实现BeforeAndAfter的测试套件,理想情况下我希望能够检查我的after()方法,如果测试失败,并且它确实计算了一些值,打印出来。是否有内置的方式来做到这一点?

PS。我知道我可以尝试/捕捉整个测试,但我宁愿不必这样做。

2 个答案:

答案 0 :(得分:4)

我认为您无法在after()中执行此操作,但您可以通过覆盖withFixture()来完成此操作。此方法运行实际测试,之后您可以匹配结果并在出现故障时打印一些内容:

class ExampleSpec extends WordSpec with MustMatchers {

  "Example" must {
    "work correctly" in {
      3 must be(3)
    }

    "not fail" in {
      true must be(false)
    }
  }

  override def withFixture(test: NoArgTest) = super.withFixture(test) match {
    case failed: Failed =>
      val nameLen = test.name.length
      info(s"The test '${test.name}' failed")
      info(s"The test name is $nameLen characters long")
      failed
    case other => other
  }
}

请参阅Sharing Fixtures,尤其是“Overriding withFixture(NoArgTest)”

部分

答案 1 :(得分:1)

根据您的需要,您可以:

1)写一些类似def around[T](code: => T) = try {code} ...的内容并使用它:

    test("mytest") {
       around {

       }
    }

    it should "blabla" in around {
       ...
    }

2)如果您不使用规格,那么只需编写自己的规范:

    def mytest[T](name: String)(code: =>T) = test(name){
      try {
        code
      } ...
    }

或只是覆盖test

   override def test[T](name: String)(code: =>T) = super.test(name){
      try {
        code
      } ...
    }

两者都可以在单独的特征中完成,顺便说一句。

3)覆盖{@ 1}},如描述@ alextsc的回答

4)如果要拦截构建中的所有测试,请编写自己的reporter

P.S。 BeforeAndAfter / withFixture旨在清理资源(这就是为什么它们不会给你任何异常访问权限),所以如果你需要分析并重新表示你的错误,那么逻辑上的记者解决方案可能更合适,但这并不方便。