关于scalaTest中“beforeAll”这样的方法的有用性,我有更多的哲学困惑。我一直在寻找一个答案,为什么需要像beforeAll这样的结构?我确实理解为什么这个设计决定是有原因的,但却不能仔细考虑。有人能帮上忙吗?
例如根据在线教程所建议的方式,
class TestExample extends FunSuite with BeforeAndAfterAll {
private var _tempDir: File = _
protected def tempDir: File = _tempDir
override def beforeAll(): Unit = {
super.beforeAll()
_tempDir = Utils.createTempDir(namePrefix = this.getClass.getName)
}
test("...") {
// using the variable in the function
}
} vs
class TestExample extends FunSuite with BeforeAndAfterAll {
private val tempDir: File = Utils.createTempDir(namePrefix =
this.getClass.getName)
}
test("...") {
// Use the initialized variable here.
} 发布于 2016-02-22 04:52:25
如果你要在afterAll中进行清理,我认为在beforeAll中进行设置是对称的。另外,如果你需要做一些不涉及初始化实例变量的副作用,可以使用beforeAll。但是,在您给出的示例中,您在afterAll中不需要做任何清理工作,而在所有测试之前所做的只是初始化实例变量,我将使用普通的老式初始化。
val初始化器和beforeAll之间的另一个区别是val初始化器在类被实例化时发生,而beforeAll在实例执行时发生。如果你想延迟初始化直到类运行,你可以使用惰性函数。
发布于 2020-10-07 07:09:03
值得注意的一点是,一些运行器(例如ScalaTest ant任务和Intellij IDEA)会在运行任何测试之前实例化所有测试实例。如果您的设置代码碰巧与任何全局变量或外部状态交互,那么您可能希望将这些交互推迟到测试运行。
作为一个简单的(人为的)示例,假设您测试的代码包括
Object Singleton {
var foo = ""
}您有两个测试类:
class Test1 extends FunSuite {
Singleton.foo = "test1"
test("...") {
Singleton.foo should be("test1")
}
}
class Test1 extends FunSuite {
Singleton.foo = "test2"
test("...") {
Singleton.foo should be("test2")
}
}如果在运行任何测试之前都实例化了这两个类,那么两个测试中至少有一个会失败。相反,如果您将初始化工作推迟到beforeAll,您将不会在测试之间看到相同的干扰。
https://stackoverflow.com/questions/35527660
复制相似问题