Scala after() 方法中有没有办法知道测试是否失败?
Is there a way in a Scala after() method to know whether the test failed?
我有一个实现 BeforeAndAfter
的测试套件,理想情况下我希望能够在测试失败时检查我的 after()
方法,如果它确实计算了一些值并且打印出来。有内置的方法吗?
ps。我知道我可以围绕整个测试做 try/catch,但我宁愿不必那样做。
我认为您无法在 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) 写类似 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) 按照@alextsc 的回答
覆盖withFixture
4) 如果您想拦截构建中的所有测试,请编写您自己的 reporter
P.S。 BeforeAndAfter/withFixture 旨在清理资源(这就是为什么他们不给你任何异常访问权限),所以如果你需要分析和重新表示你的错误,逻辑上记者解决方案可能更适合,但它不是很方便。
我有一个实现 BeforeAndAfter
的测试套件,理想情况下我希望能够在测试失败时检查我的 after()
方法,如果它确实计算了一些值并且打印出来。有内置的方法吗?
ps。我知道我可以围绕整个测试做 try/catch,但我宁愿不必那样做。
我认为您无法在 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) 写类似 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) 按照@alextsc 的回答
覆盖withFixture
4) 如果您想拦截构建中的所有测试,请编写您自己的 reporter
P.S。 BeforeAndAfter/withFixture 旨在清理资源(这就是为什么他们不给你任何异常访问权限),所以如果你需要分析和重新表示你的错误,逻辑上记者解决方案可能更适合,但它不是很方便。