使用带有FunSpec和BeforeAndAfter的scalatest时的测试代码执行顺序

时间:2013-05-31 08:59:35

标签: scala scalatest

这可能是大多数人都知道的事情,但让我感到惊讶。

鉴于以下测试:

import org.scalatest.{BeforeAndAfterAll, FunSpec}

class MyFunSpecTest extends FunSpec with BeforeAndAfterAll {
    override def beforeAll {
        println("Inside beforeAll")
    }

    describe("Testing something") {
        println("Inside describe")
        it("should fail") {
            println("Inside it")
            fail("not yet implemented")
        }
    }
}

我会预料到输出:

Inside beforeAll
Inside describe
Inside it
[info] MyFunSpecTest:
[info] Testing something
[info] - should fail *** FAILED ***
[info]   not yet implemented (MyFunSpec.scala:12)

而是输出:

Inside describe
Inside beforeAll
Inside it
[info] MyFunSpecTest:
[info] Testing something
[info] - should fail *** FAILED ***
[info]   not yet implemented (MyFunSpec.scala:12)

这至少与scalatest_2.9.1版本2.0.M5b和2.0.M5。

我们发现这一点的方式是使用Selenium测试我们在beforeAll中创建了Web驱动程序 - 钩子并在测试中使用它。只要我们在lazy val块中初始化describe并在it块中使用它们就没有问题,因为计算延迟到it,其中状态为{{1}已经执行了。我们第一次引入在beforeAll块中计算并依赖于Web驱动程序(此时未构造)的内容时,自然会出现问题。

1 个答案:

答案 0 :(得分:0)

before()在每个it()之前调用,而不是在每个describe()之前调用。尝试将代码移动到它()并告诉我们是否有帮助。