播放代码覆盖率!项目

And*_*rea 6 scala code-coverage sbt playframework-2.0 scct

我玩了!项目,我想添加一些代码覆盖率信息.到目前为止,我已经尝试过JaCoCoscct.前者存在基于字节码的问题,因此它似乎对Scala编译器自动生成的方法(例如copy或)的缺失测试发出警告canEqual.scct似乎是一个更好的选择,但无论如何我在两个测试期间都会遇到很多错误.

让我坚持使用scct.我基本上每次尝试连接数据库的测试都会出错.我的许多测试都将一些灯具加载到内存中的H2数据库中,然后进行一些断言.我的Global.scala包含

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

    def connection() = {
        Session.create(DB.getConnection()(app), new MySQLInnoDBAdapter)
    }
}
Run Code Online (Sandbox Code Playgroud)

而测试通常被封闭在一个块中

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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Ale*_*rju 1

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

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

.settings(parallelExecution in ScctPlugin.ScctTest := false)
Run Code Online (Sandbox Code Playgroud)

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