如何在Slick测试中查看诊断调试信息以修复性能不佳?

时间:2016-03-22 16:18:49

标签: scala logging slf4j slick scalatest

我无法弄清楚执行缓慢的集成测试发生了什么,使用Slick写入数据库。但是,我无法通过SLF4J弄清楚如何访问诊断日志记录。

1 个答案:

答案 0 :(得分:2)

我最终自己想出来了,答案有两个组成部分。

表现不佳

我意识到我的糟糕表现是由于异步API的同步测试。我使用Scalatest和Scalacheck基于属性的测试,并使用futureValue方法阻止异步请求。出于某种原因,我已将PatienceConfigurationinterval设置为500毫秒,因此每个futureValue调用至少需要半秒钟,即使数据库查询本身通常在最多20毫秒,通常<10毫秒。我最终将间隔时间缩短到2毫秒,性能大大提高。

Scalatest 3具有正确的异步测试支持,但从3.0.0-M15开始,GeneratorDrivenPropertyChecks目前不支持异步。这might change

诊断记录

我安装了SLF4J简单日志记录后端,其中libraryDependencies条目为"org.slf4j" % "slf4j-simple" % "1.7.12"。通过设置simple logger propertiesapplication.conf

,我无法正常工作

我设置了一个Java系统属性,告诉SLF4J-simple登录调试模式org.slf4j.simpleLogger.defaultLogLevel=debug,然后在SBT提示符下运行test。因为这导致了Slick查询编译器输出的荒谬量,所以我将该编译器的记录器的调试输出设置回info,这通过添加属性org.slf4j.simpleLogger.log.slick.compiler=info来大大压制了额外的输出。 。您可以通过这种方式修改与前缀匹配的记录器级别。

实际上设置属性是一个非常重要的问题。我尝试了几种方法:

  • 通过添加test/resources/application.conf通过Typesafe配置(org.slf4j.simpleLogger.defaultLogLevel=debug)设置属性工作。通常,在解析配置之前由系统属性设置的情况就是这种情况,因此我假设记录器就是这种情况。

  • 在启动SBT工作时从命令行设置属性,通过使用sbt -Dorg.slf4j.simpleLogger.defaultLogLevel=debug启动SBT,但在使用SBT的非分叉JVM中运行测试时仅 设置fork in test := false

  • 使用javaOptions += "org.slf4j.simpleLogger.defaultLogLevel=debug"从SBT设置属性工作,是否分叉JVM。

  • 通过将org.slf4j.simpleLogger.defaultLogLevel=debug添加到test/resources/simplelogger.properties来设置属性,这对于分叉的JVM和unforked都有效。