播放代码覆盖率!项目

时间:2013-01-24 15:45:13

标签: scala playframework-2.0 code-coverage sbt scct

我玩了!项目,我想添加一些代码覆盖率信息。到目前为止,我已尝试JaCoCoscct。前者存在基于字节码的问题,因此它似乎对Scala编译器自动生成的方法(例如copycanEqual)缺少测试提出警告。 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)的上下文中运行却无法初始化缓存和db?

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

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

添加到project / plugins.sbt:

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

然后用

运行SBT
sbt clean coverage test

答案 2 :(得分:0)

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

class MySpec extends Specification {
  sequential

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

}
相关问题