unit - scalatest play framework
¡Cómo forzar la salida de Logger.debug en el juego! marco specs2 pruebas? (5)
Creé un archivo logger.xml bajo conf como este:
<configuration>
<conversionRule conversionWord="coloredLevel" converterClass="play.api.Logger$ColoredLevel" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder><pattern>%coloredLevel %logger{15} - %message%n%xException{5}</pattern></encoder>
</appender>
<logger name="play" level="ERROR" />
<logger name="application" level="INFO" />
<root level="ERROR">
<appender-ref ref="STDOUT" />
</root>
</configuration>
Entonces comienzo mi entorno de juego con el siguiente comando:
play -Dlogger.file = conf / logger.xml
Voila! Registro de datos en prueba. Conduce a fugas de memoria, pero es invaluable durante el desarrollo.
Por defecto, toda la salida del Logger
, visible cuando una aplicación se está ejecutando, se silencia cuando se prueba la aplicación.
¿Cómo forzar que los debugs, infos, etc. se muestren en los informes de specs2
?
En primer lugar, puede que te guste algo de fondo por qué el registro está deshabilitado en modo de prueba Esta fue la respuesta de Guillame Bort a una pregunta en el foro de juego (ver este hilo ):
El registrador está deshabilitado en el modo de prueba por ahora porque estaba causando una gran pérdida de espacio en PermGen al ejecutar pruebas. Pero estamos trabajando para ejecutar pruebas en una JVM bifurcada, así que lo habilitaremos nuevamente pronto.
Como solución, creé mi propio registrador de esta manera (código Scala):
import play.api.{Play, LoggerLike, Logger}
import org.slf4j.LoggerFactory
import org.slf4j.impl.SimpleLoggerFactory
object MyLogger extends LoggerLike {
val factory = if (Play.isTest(Play.current)) {
new SimpleLoggerFactory()
} else {
LoggerFactory.getILoggerFactory
}
val redirectDebugToInfo = factory.isInstanceOf[SimpleLoggerFactory]
val logger = factory.getLogger("application")
def apply(name: String): Logger = new Logger(factory.getLogger(name))
def apply[T](clazz: Class[T]): Logger = new Logger(factory.getLogger(clazz.getCanonicalName))
// this method is to make debug statements to show up in test mode
override def debug(m: => String) = {
if (redirectDebugToInfo) {
info(m)
} else {
super.debug(m)
}
}
}
No sé cómo se comporta este código con respecto a la filtración de PermGen en general, pero hasta ahora no tuve ese problema. Para que funcione debe agregar esta dependencia:
"org.slf4j" % "slf4j-simple" % "1.6.4"
Si está usando sbt para ejecutar pruebas (la reproducción se realiza de manera predeterminada), puede configurar javaOptions en la tarea de Prueba para controlar la configuración de registro utilizada.
Por ejemplo, en project / Build.scala:
javaOptions in Test += "-Dlogger.file=conf/test-logger.xml"
Más sobre la sintaxis del archivo test-logger.xml aquí:
Si está utilizando FakeApplication, puede pasar algo de información de configuración:
FakeApplication(additionalConfiguration = Map(
"logger.application" -> "DEBUG"
))
Eso limita la salida de LOGGER para depurar y una salida más alta.
Me sorprendió observar que el ajuste es "pegajoso". Si una prueba temprana usa FakeApplication, una prueba posterior que no usa FakeApplication seguirá usando el mismo nivel de registro.
Si observa la fuente de Play Logger , verá que el registro está deshabilitado en el modo de prueba.
Si realmente desea el registro, puede crear un archivo de configuración de registro para la prueba y pasarlo a Play como propiedad del sistema "logger.file".
Ejemplo de configuración de registro (archivo test-logger.xml en la raíz del proyecto):
<configuration>
<conversionRule conversionWord="coloredLevel" converterClass="play.api.Logger$ColoredLevel" />
<logger name="application" level="INFO">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%coloredLevel %logger{15} - %message%n%xException{5}</pattern>
</encoder>
</appender>
</logger>
</configuration>
Pruebas de carrera:
JAVA_OPTS="-Dlogger.file=test-logger.xml" play test