我有戏!我想在其中添加一些代码覆盖率信息的项目。到目前为止,我已经尝试过JaCoCo和scct。前者的问题是它基于字节码,因此它似乎会警告缺少对 Scala 编译器自动生成的方法的测试,例如copy
or 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)的上下文中运行无法初始化缓存和数据库?