Scala 游戏代码覆盖率!项目

Scala 游戏代码覆盖率!项目,scala,playframework-2.0,code-coverage,sbt,scct,Scala,Playframework 2.0,Code Coverage,Sbt,Scct,我有一个剧本!我想在其中添加一些代码覆盖率信息的项目。到目前为止,我一直在努力。前者的问题是它基于字节码,因此它似乎对Scala编译器自动生成的方法(如copy或canEqual)缺少测试发出警告。scct似乎是一个更好的选择,但在任何情况下,我都会在使用两者的测试中遇到许多错误 让我坚持使用scct。实际上,每次尝试连接到数据库的测试都会出现错误。我的许多测试将一些装置加载到内存中的H2数据库中,然后进行一些断言。我的Global.scala包含 override def onStart(ap

我有一个剧本!我想在其中添加一些代码覆盖率信息的项目。到目前为止,我一直在努力。前者的问题是它基于字节码,因此它似乎对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)
    }
}
而测试通常被封闭在一个类似于

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--4104547
为什么在默认配置中启动测试能够连接到数据库,而在scct(或JaCoCo)上下文中运行却无法初始化缓存和数据库


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

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

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

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

您需要在规范的开头添加sequential

class MySpec extends Specification {
  sequential

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

}

Scala代码覆盖率的更好选择是Scoverage,它提供语句行覆盖率。

添加到project/plugins.sbt:

addSbtPlugin("com.sksamuel.scoverage" % "sbt-scoverage" % "1.0.1")
然后运行SBT

sbt clean coverage test

非常感谢。我已经对JaCoCo进行了这种配置,但这似乎不是问题的根本原因。据我所知,我所犯的所有错误仍然存在-(如果你运行一个像
playdebug-coverage:doc
这样的目标,你能在你的
Global.scala
中附加一个带有断点的调试器,看看它是否被并行地多次命中吗?顺便说一句,我一直认为可疑的一件事是,我声明应用程序使用
MySqlInnoDBAdapter
,但测试是在上面运行的。)内存中的H2实例。某种程度上,魔法必须发生在
FaekApplication
中,但我想知道这是否与当前的问题有关。我们如何使基于play framework的应用程序能够实现这一点?它检测所有生成的路由文件,这不是play应用程序测试的主要目的。