【问题标题】:How do I share a single object with multiple Scalatest suites?如何与多个 Scalatest 套件共享单个对象?
【发布时间】:2016-12-14 13:21:57
【问题描述】:

我有许多测试文件,每个文件都有自己的测试。到目前为止,每个人都有一个我创建配置对象的特征。

现在构建该对象需要两分钟的大部分时间,因为它必须做大量工作来调用许多数据库(不要问 - 真的,它必须完成)。

有没有办法在多个文件中的多个测试套件之间共享这个对象(下面的 tldConfigMap),而不必一遍又一遍地构建它?

这就是我的做法 - 正如你所看到的,当作为 trait 引入时,每次都会调用 load():

trait TLDMapAcceptanceIsLoadedSpec extends org.scalatest.fixture.FlatSpecLike with TLDConfigMap {

  val tldConfigMap: Map[String, TLDConfig] = load(withAttributes = true).right.get

  type FixtureParam = Map[String, TLDConfig]

  def withFixture(test: OneArgTest) = {

    withFixture(test.toNoArgTest(tldConfigMap)) // "loan" the fixture to the test
  }
}

【问题讨论】:

  • 答案评论中提到的小repro似乎从未到达。我建议将其关闭。

标签: scala scalatest


【解决方案1】:

你可以把它放到一个object 中(假设它是真正的配置并且没有被测试改变):

object TldConfigMap {
  val tldConfigMap: Map[String, TLDConfig] = load(withAttributes = true).right.get
}

trait TLDMapAcceptanceIsLoadedSpec extends org.scalatest.fixture.FlatSpecLike with TLDConfigMap {

  def tldConfigMap: Map[String, TLDConfig] = TldConfigMap.tldConfigMap // or just use it directly

  type FixtureParam = Map[String, TLDConfig]

  def withFixture(test: OneArgTest) = {
    withFixture(test.toNoArgTest(tldConfigMap)) // "loan" the fixture to the test
  }
}

【讨论】:

  • 这不起作用,因为 Scalatest 单独实例化每个测试套件,因此为每个测试套件创建对象。我需要找到如何创建一次对象并将其提供给 Scalatest 使用。
  • 不,对象应该在每次测试运行时只创建一次,而不是在每个套件中创建一次(除非您正在执行类似stackoverflow.com/questions/15798341/… 的操作,但这并不常见)。
  • 然后有些不对劲,因为我有在创建对象时触发的调试输出,并且我看到它针对我的测试目录中的三个套件中的每一个触发。
  • 你是如何运行测试的:只是来自 SBT 控制台的test
  • 查看代码,确实看起来应该只使用一个ClassLoader,因此只初始化对象一次:github.com/scalatest/scalatest/blob/3.1.x/scalatest/src/main/…。因此,不幸的是,我不知道是什么原因造成的,也没有时间尝试重现这种情况。您能否使用 object 和至少 2 个套件的代码更新您的问题,以防万一?
猜你喜欢
  • 1970-01-01
  • 2019-07-06
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 2020-05-04
  • 2012-07-22
相关资源
最近更新 更多