Подтвердить что ты не робот

Как заставить Logger.debug выводить в Play! тесты спецификаций framework2?

По умолчанию весь вывод Logger, видимый при запуске приложения, отключается при тестировании приложения.

Как заставить отлаживатели, информацию и т.д. отображаться в отчетах specs2?

4b9b3361

Ответ 1

Во-первых, вам может понравиться некоторый фон, почему ведение журнала отключено в тестовом режиме. Это был Гийом Борт, отвечая на вопрос на форуме игры (см. этот поток):

Логгер отключен в тестовом режиме, потому что он вызывает огромная утечка пространства PermGen при выполнении тестов. Но мы работаем над запуском тесты в разветвленной JVM, чтобы мы снова включили его.

В качестве обходного пути я создал свой собственный регистратор (Scala code):

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)
    }
  }
}

Я не знаю, как этот код ведет себя относительно утечки PermGen вообще, но до сих пор у меня не было этой проблемы. Чтобы заставить его работать, вам нужно добавить эту зависимость:

"org.slf4j" % "slf4j-simple" % "1.6.4"

Ответ 2

Если вы используете FakeApplication, вы можете передать информацию о конфигурации:

  FakeApplication(additionalConfiguration = Map(
    "logger.application" -> "DEBUG"
  ))

Это ограничивает вывод LOGGER для отладки и более высокой производительности.

Я был удивлен, заметив, что настройка "липкая". Если раннее тестирование использует FakeApplication, более поздний тест, который не использует FakeApplication, по-прежнему будет использовать тот же уровень ведения журнала.

Ответ 3

Я создал файл logger.xml в conf, например:

<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>

Затем я запускаю свою среду воспроизведения со следующей командой:

play -Dlogger.file = conf/logger.xml

Voila! Запись данных в тесте. Это приводит к утечкам памяти, но бесценно в процессе разработки.

Ответ 4

Если вы используете sbt для запуска тестов (которые по умолчанию воспроизводятся), вы можете установить javaOptions в тестовой задаче для управления используемой конфигурацией ведения журнала.

Например, в проекте /Build.scala:

javaOptions in Test      += "-Dlogger.file=conf/test-logger.xml"

Подробнее о синтаксисе файла test-logger.xml здесь:

http://logback.qos.ch/manual/configuration.html

Ответ 5

Если вы посмотрите на Play Источник регистрации, вы увидите, что ведение журнала отключено в тестовом режиме.

Если вы действительно хотите вести журнал, вы можете создать файл конфигурации ведения журнала для тестирования и передать его в качестве системного свойства "logger.file".

Пример конфигурации ведения журнала (файл test-logger.xml в корне проекта):

<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>

Текущие тесты:

JAVA_OPTS="-Dlogger.file=test-logger.xml" play test