【发布时间】:2017-01-20 21:47:52
【问题描述】:
我有一个非常具体的用例,为了减少测试套件的实例化时间,我将它们定义为一个对象而不是一个类,例如
import org.scalatest._
import scala.collection.mutable.Stack
object StackSuite extends FunSuite with Matchers {
test("stackShouldPopValuesIinLastInFirstOutOrder") {
val stack = new Stack[Int]
stack.push(1)
stack.push(2)
stack.pop() should equal(2)
stack.pop() should equal(1)
}
}
这可行,但这样做是否存在根本问题或缺陷?如果每个测试单独执行,并且在套件级别具有可修改状态的不幸情况下,应该与多线程问题分开。
更新:当我说“减少实例化时间”时,我的意思是整体,例如考虑对象/类中的重量级夹具数据,而不仅仅是纯 Suite 类实例化时间。由于 object 是一个单例,因此它将是一个查找而不是一个新类的实例化。
我需要这样做以便在计算机网格中分发数百万个测试。有些测试是标准的,有些测试是评估一组输入参数的排列,因此需要减少套件实例化的启动时间。
顺便说一句,我这样做是为了在集群机器中执行每个测试:
import scala.reflect.runtime.universe
// I receive the suite and test names as input
val suite = "com.mycomp.StackSuite"
val test = "stackShouldPopValuesIinLastInFirstOutOrder"
val runtimeMirror = universe.runtimeMirror(getClass.getClassLoader)
val module = runtimeMirror.staticModule(suite)
val obj = runtimeMirror.reflectModule(module)
val status = obj.asInstanceOf[TestSuite].execute(test)
【问题讨论】:
-
查看我的更新答案。