如何在我的 Slick 测试中查看诊断调试信息以修复性能不佳的问题?
How can I see diagnostic debug info in my Slick tests to fix poor performance?
我无法弄清楚执行缓慢的集成测试发生了什么,使用 Slick 写入数据库。但是,我不知道如何通过 SLF4J 访问诊断日志记录。
我最终自己解决了这个问题,答案有两个组成部分。
表现不佳
我意识到我的糟糕表现是由于异步 API 的同步测试所致。我正在使用 Scalatest 和基于 Scalacheck 属性 的测试,并使用 futureValue
approach to blocking on async requests. For some reason, I had set the interval
of the PatienceConfiguration
到 500 毫秒,因此每个 futureValue
调用至少需要半秒,即使数据库查询自己通常最多在 20 毫秒内执行,通常 <10 毫秒。我最终将间隔调低到 2ms,性能大大提高。
Scalatest 3 具有适当的异步测试支持,尽管从 3.0.0-M15 开始,GeneratorDrivenPropertyChecks
目前不支持异步。这个might change.
诊断日志记录
我使用 "org.slf4j" % "slf4j-simple" % "1.7.12"
的 SBT libraryDependencies
条目安装了 SLF4J 简单日志记录后端。我无法通过 application.conf
.
设置 simple logger properties 使其正常工作
我设置了一个Java系统属性告诉SLF4J-simple以调试模式登录org.slf4j.simpleLogger.defaultLogLevel=debug
然后在SBT提示符下运行test
.因为这导致了 Slick 查询编译器的输出量荒谬,我将该编译器的记录器的调试输出设置回 info
,这在很大程度上抑制了额外的输出,通过添加 属性 org.slf4j.simpleLogger.log.slick.compiler=info
。您可以通过这种方式修改匹配前缀的记录器级别。
实际上设置属性是一个非常重要的问题。我尝试了几种方法:
通过类型安全配置 (test/resources/application.conf
) 通过添加 org.slf4j.simpleLogger.defaultLogLevel=debug
设置 属性 没有 工作。通常,这是在解析配置之前由系统属性设置的情况,所以我假设记录器就是这种情况。
在启动 SBT 时从命令行设置 属性,通过使用 sbt -Dorg.slf4j.simpleLogger.defaultLogLevel=debug
启动 SBT,但 仅 时运行 使用 SBT 设置 fork in test := false
.
在非分支 JVM 中进行测试
使用 javaOptions += "org.slf4j.simpleLogger.defaultLogLevel=debug"
从 SBT 设置 属性 没有 工作,是否分叉 JVM。
通过将 org.slf4j.simpleLogger.defaultLogLevel=debug
添加到 test/resources/simplelogger.properties
来设置 属性 对分叉的 JVM 和未分叉的 JVM 都有效。
我无法弄清楚执行缓慢的集成测试发生了什么,使用 Slick 写入数据库。但是,我不知道如何通过 SLF4J 访问诊断日志记录。
我最终自己解决了这个问题,答案有两个组成部分。
表现不佳
我意识到我的糟糕表现是由于异步 API 的同步测试所致。我正在使用 Scalatest 和基于 Scalacheck 属性 的测试,并使用 futureValue
approach to blocking on async requests. For some reason, I had set the interval
of the PatienceConfiguration
到 500 毫秒,因此每个 futureValue
调用至少需要半秒,即使数据库查询自己通常最多在 20 毫秒内执行,通常 <10 毫秒。我最终将间隔调低到 2ms,性能大大提高。
Scalatest 3 具有适当的异步测试支持,尽管从 3.0.0-M15 开始,GeneratorDrivenPropertyChecks
目前不支持异步。这个might change.
诊断日志记录
我使用 "org.slf4j" % "slf4j-simple" % "1.7.12"
的 SBT libraryDependencies
条目安装了 SLF4J 简单日志记录后端。我无法通过 application.conf
.
我设置了一个Java系统属性告诉SLF4J-simple以调试模式登录org.slf4j.simpleLogger.defaultLogLevel=debug
然后在SBT提示符下运行test
.因为这导致了 Slick 查询编译器的输出量荒谬,我将该编译器的记录器的调试输出设置回 info
,这在很大程度上抑制了额外的输出,通过添加 属性 org.slf4j.simpleLogger.log.slick.compiler=info
。您可以通过这种方式修改匹配前缀的记录器级别。
实际上设置属性是一个非常重要的问题。我尝试了几种方法:
通过类型安全配置 (
test/resources/application.conf
) 通过添加org.slf4j.simpleLogger.defaultLogLevel=debug
设置 属性 没有 工作。通常,这是在解析配置之前由系统属性设置的情况,所以我假设记录器就是这种情况。在启动 SBT 时从命令行设置 属性,通过使用
sbt -Dorg.slf4j.simpleLogger.defaultLogLevel=debug
启动 SBT,但 仅 时运行 使用 SBT 设置fork in test := false
. 在非分支 JVM 中进行测试
使用
javaOptions += "org.slf4j.simpleLogger.defaultLogLevel=debug"
从 SBT 设置 属性 没有 工作,是否分叉 JVM。通过将
org.slf4j.simpleLogger.defaultLogLevel=debug
添加到test/resources/simplelogger.properties
来设置 属性 对分叉的 JVM 和未分叉的 JVM 都有效。