我可以在 scalaTest 规范之间建立依赖关系,这样如果测试失败,所有依赖于它的测试都会被跳过?
4 回答
我没有添加 TestNG 的那个特性,因为当时我没有任何令人信服的用例来证明它的合理性。从那以后,我收集了一些用例,并正在为下一个版本的 ScalaTest 添加一个特性来解决它。但它不会是依赖测试,只是一种基于未满足的先决条件“取消”测试的方法。
同时,您可以做的只是使用 Scala if 语句仅在满足条件时注册测试,或者如果您希望看到它的输出,则将它们注册为忽略。如果您使用的是 Spec,它看起来像:
if (databaseIsAvailable) {
it("should do something that requires the database") {
// ...
}
it ("should do something else that requires the database") {
}
}
这仅在测试构建时确定满足条件时才有效。例如,如果数据库应该由 beforeAll 方法启动,那么您可能需要在每个测试中进行检查。在这种情况下,您可以说它正在等待中。就像是:
it("should do something that requires the database") {
if (!databaseIsAvailable) pending
// ...
}
it("should do something else that requires the database") {
if (!databaseIsAvailable) pending
// ...
}
这是一个 Scala 特征,如果任何测试失败,它会使测试套件中的所有测试失败。
(感谢 Jens Schauder 的建议(他发布了这个问题的另一个答案)。)
优点:易于理解的测试依赖项。
缺点:不是很可定制。
我将它用于我的自动浏览器测试。如果出现故障,那么通常没有必要继续与 GUI 交互,因为它处于“混乱”状态。
许可证:公共领域(Creative Common 的 CC0),或(由您选择)MIT 许可证。
import org.scalatest.{Suite, SuiteMixin}
import scala.util.control.NonFatal
/**
* If one test fails, then this traits cancels all remaining tests.
*/
trait CancelAllOnFirstFailure extends SuiteMixin {
self: Suite =>
private var anyFailure = false
abstract override def withFixture(test: NoArgTest) {
if (anyFailure) {
cancel
}
else try {
super.withFixture(test)
}
catch {
case ex: TestPendingException =>
throw ex
case NonFatal(t: Throwable) =>
anyFailure = true
throw t
}
}
}
我不知道现成的解决方案。但是您可以相当轻松地编写自己的 Fixtures。
请参阅Suite trait的 javadoc 中的“组合可堆叠夹具特征”
例如,这样的夹具可以将第一个测试执行之后的所有测试执行替换为调用pending
您可以使用 traitorg.scalatest.CancelAfterFailure
在第一次失败后取消剩余的测试:
import org.scalatest._
class MySpec extends FunSuite with CancelAfterFailure {
test("successfull test") {
succeed
}
test("failed test") {
assert(1 == 0)
}
test("this test and all others will be cancelled") {
// ...
}
}