6

我有戏!我想在其中添加一些代码覆盖率信息的项目。到目前为止,我已经尝试过JaCoCoscct。前者的问题是它基于字节码,因此它似乎会警告缺少对 Scala 编译器自动生成的方法的测试,例如copyor canEqual。scct 似乎是一个更好的选择,但无论如何我在测试两者时都会遇到很多错误。

让我坚持使用 scct。对于尝试连接到数据库的每个测试,我基本上都会出错。我的许多测试将一些固定装置加载到内存中的 H2 数据库中,然后做出一些断言。我的Global.scala包含

override def onStart(app: Application) {
    SessionFactory.concreteFactory = Some(() => connection)

    def connection() = {
        Session.create(DB.getConnection()(app), new MySQLInnoDBAdapter)
    }
}

而测试通常包含在一个块中

class MySpec extends Specification {
    def app = FakeApplication(additionalConfiguration = inMemoryDatabase())

    "The models" should {
        "be five" in running(app) {
            Fixtures.load()
            MyModels.all.size should be_==(5)
        }
    }
}

该行running(app)允许我在连接到内存数据库的工作应用程序的上下文中运行测试,至少通常如此。但是当我运行代码覆盖任务时,例如 scct coverage:doc,我得到了很多与连接数据库相关的错误。

更奇怪的是至少有 4 个不同的错误,比如:

  • ObjectExistsException:缓存播放已存在
  • SQLException: 试图从已关闭的池中获取连接
  • 配置错误[无法连接到数据库[默认]]
  • 找不到适合 jdbc:h2:mem:play-test--410454547 的驱动程序

为什么在默认配置中启动测试能够连接到数据库,而在 scct(或 JaCoCo)的上下文中运行无法初始化缓存和数据库?

4

3 回答 3

1

specs2 测试默认并行运行。Play 禁用标准单元测试配置的并行执行,但 scct 使用不同的配置,因此它不知道不并行运行。

尝试将此添加到您的 Build.scala 中:

.settings(parallelExecution in ScctPlugin.ScctTest := false)

或者,您可以添加sequential到测试类的开头以强制所有可能的运行配置按顺序运行。我的文件中仍然存在这两个问题,因为我认为在使用 Play 的早期发布候选版本时,Build.scala 解决方案存在一些问题。

于 2013-01-26T05:25:29.347 回答
1

Scala 代码覆盖的更好选择是 Scoverage,它提供语句行覆盖。 https://github.com/scoverage/scalac-scoverage-plugin

添加到项目/plugins.sbt:

addSbtPlugin("com.sksamuel.scoverage" % "sbt-scoverage" % "1.0.1")

然后运行 ​​SBT

sbt clean coverage test
于 2014-01-12T21:04:22.220 回答
0

您需要在规范的开头添加顺序。

class MySpec extends Specification {
  sequential

  "MyApp" should {
  //...//
  }

}
于 2013-08-30T09:55:22.740 回答