Ich habe Probleme herauszufinden, was passiert mit langsam ausgeführten Integrationstests, mit Slick, um in die Datenbank zu schreiben. Aber ich kann nicht herausfinden, wie ich über SLF4J auf die Diagnoseprotokollierung zugreifen kann.Wie kann ich diagnostische Debug-Informationen in meinen Slick-Tests sehen, um schlechte Leistung zu beheben?
Antwort
Ich habe das irgendwann selbst herausgefunden und es gibt zwei Komponenten für die Antwort.
Schlechte Leistung
Ich erkannte, dass meine schlechte Leistung aufgrund der synchronen Prüfung von Asynchron-APIs war. Ich verwende Scalatest zusammen mit dem eigenschaftsbasierten Testen von Scalacheck und verwende die Methode futureValue
zum Blockieren von Async-Anfragen. Aus irgendeinem Grund hatte ich die interval
der PatienceConfiguration
auf 500ms eingestellt, und so dauerte jeder Anruf mindestens eine halbe Sekunde, obwohl die Datenbankabfragen selbst in der Regel in höchstens 20ms ausgeführt werden, und normalerweise < 10ms. Ich habe das Intervall schließlich auf 2ms heruntergesetzt, und die Leistung wurde stark verbessert.
Scalatest 3 hat eine ordnungsgemäße asynchrone Testunterstützung, obwohl die Version 3.0.0-M15 GeneratorDrivenPropertyChecks
derzeit nicht async unterstützt. Dies might change.
Diagnoseprotokollierung
installierte ich den SLF4J einfache Protokollierung Backend mit dem SBT libraryDependencies
Eintrag von "org.slf4j" % "slf4j-simple" % "1.7.12"
. Ich konnte es nicht richtig funktionieren, indem ich die simple logger properties durch application.conf
setze.
Ich legte eine Java-Systemeigenschaft zu sagen SLF4J-einfach anmelden Debug-Modus org.slf4j.simpleLogger.defaultLogLevel=debug
und dann test
an der SBT-Eingabeaufforderung ausgeführt. Da dies zu einer absurden Menge an Ausgaben aus dem Slick-Abfragecompiler führte, setzte ich die Debugausgabe für die Logger dieses Compilers zurück auf info
, wodurch die zusätzliche Ausgabe weitgehend unterdrückt wurde, indem die Eigenschaft org.slf4j.simpleLogger.log.slick.compiler=info
hinzugefügt wurde. Auf diese Weise können Sie Logger-Ebenen ändern, die mit einem Präfix übereinstimmen.
Die Einstellung der Eigenschaften erwies sich als ein nicht-triviales Problem. Ich habe versucht, mehrere Ansätze:
die Eigenschaft über Typesafe Konfigurationseinstellung (
test/resources/application.conf
) durch Zusatz vonorg.slf4j.simpleLogger.defaultLogLevel=debug
nicht Arbeit tat. Dies ist normalerweise der Fall für Dinge, die von Systemeigenschaften vor dem Analysieren der Konfiguration eingerichtet werden, also nehme ich an, dass dies für den Logger der Fall ist.die Eigenschaft von der Kommandozeile einstellen, wenn SBT Inbetriebnahme gearbeitet, von SBT beginnend mit
sbt -Dorg.slf4j.simpleLogger.defaultLogLevel=debug
, aber nur, wenn sie mit dem SBT Einstellungfork in test := false
Tests in einer nicht-gegabelten JVM ausgeführt wird.Einstellung der Eigenschaft von SBT mit
javaOptions += "org.slf4j.simpleLogger.defaultLogLevel=debug"
tat nicht Arbeit, gegabelte JVM oder nicht.Die Einstellung der Eigenschaft durch Hinzufügen von
org.slf4j.simpleLogger.defaultLogLevel=debug
zutest/resources/simplelogger.properties
funktionierte sowohl für gegabelte JVM als auch ungeforkt.