【问题标题】:Logging while testing through Gradle通过 Gradle 进行测试时的日志记录
【发布时间】:2012-03-10 12:32:57
【问题描述】:

在测试时,Gradle 似乎将 stdout/stderr 重定向到 project_dir/build/reports/tests/index.html。有没有办法避免这种重定向,而是将内容打印到控制台?

附加信息:

  • 这是一个 Scala 2.9.1 项目。
  • 我正在使用slf4s 进行日志记录。

【问题讨论】:

    标签: java scala logging gradle


    【解决方案1】:

    对于 Android Gradle:https://stackoverflow.com/a/42425815/413127

    对于 Android Gradle KTS (Kotlin):

    // Test Logging
    tasks.withType<Test> {
        testLogging {
            events("standardOut", "started", "passed", "skipped", "failed")
        }
    }
    

    【讨论】:

      【解决方案2】:

      如果您将 Kotlin DSL 与 build.gradle.kts 一起使用,则语法会有些不同。

      确保您的依赖项中有 junit:

      dependencies {
          testImplementation("org.junit.jupiter:junit-jupiter:5.4.2")
          testImplementation("org.junit.jupiter:junit-jupiter-api")
          testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine")
      }
      

      然后你需要添加到你的测试任务中:

      import org.gradle.api.tasks.testing.logging.TestExceptionFormat
      
      tasks.test {
          useJUnitPlatform()
          testLogging {
              showStandardStreams = true
              exceptionFormat = TestExceptionFormat.FULL
              events("skipped", "failed")
          }
      }
      

      然后您可以根据需要调整设置。

      【讨论】:

        【解决方案3】:
        ./gradlew --info clean build test
        

        使用--stacktrace 选项运行以获取堆栈跟踪。使用--info--debug 选项运行以获得更多日志输出。使用--scan 运行以获得完整的见解。

        【讨论】:

        • --info--debug 会显示太多 Gradle 日志,大多数时候我们不需要它们
        【解决方案4】:

        就我而言,我使用的是 Java 和 Spring-boot-starter-test。

        我有同样的问题,问题是我没有任何测试引擎。

        所以我在 build.gradle 的依赖项中添加了一个,它就可以工作了。

        testCompile 组:'org.junit.jupiter',名称:'junit-jupiter-api', 版本:dependencyVersion.junit5 testCompile 组:'org.junit.jupiter',名称:'junit-jupiter-engine',版本:dependencyVersion.junit5

        【讨论】:

          【解决方案5】:
          test {
              testLogging.showStandardStreams = true
          }
          

          test {
              testLogging {
                  showStandardStreams = true
              }
          }
          

          也可以。

          【讨论】:

            【解决方案6】:

            对于 Android Gradle 文件

            如果您在 android gradle 文件中(如果 apply plugin: 'com.android.application' 位于 build.gradle 文件的顶部)

            然后将其粘贴到 build.gradle 中

            // Test Logging
            tasks.withType(Test) {
                testLogging {
                    events "standardOut", "started", "passed", "skipped", "failed"
                }
            }
            

            对于常规 Gradle 文件

            将此粘贴​​到 build.gradle 中

            // Test Logging
            test {
                testLogging {
                    showStandardStreams = true
                }
            }
            

            【讨论】:

              【解决方案7】:

              只是补充一下:

              showStandardStreams = true
              

              shorthand 用于:

              events = ["standard_out", "standard_error"]
              

              在混合以下两个条目时,请务必牢记这一点:

              test {
                  testLogging {
                      showStandardStreams = true
                      events = ["passed", "failed", "skipped"]
                  }
              }
              

              将导致无标准输出,而相反的顺序:

              test {
                  testLogging {
                      events = ["passed", "failed", "skipped"]
                      showStandardStreams = true
                  }
              }
              

              会将标准输出条目添加到列表中,因此 标准输出将起作用

              详情请见the source

              【讨论】:

              • showStandardStreams 排在第二位时,仔细检查一下,标准流是否附加到事件列表中?看起来是这样,但只是仔细检查。
              【解决方案8】:

              正如 @roby 回答的那样:

              将以下代码添加到您的build.gradle

              apply plugin : 'java'
              
              test {
                  testLogging.showStandardStreams = true
              }
              

              重要!

              您需要运行 gradle test 或使用添加的clean 命令构建。

              ./gradlew clean test
              
              or
              
              ./gradlew clean build
              

              希望有效。

              【讨论】:

              • 您能解释一下为什么需要“干净”吗?
              • @MichaelKanis 因为你已经改变了 gradle 配置。据我所知,gradle 配置被缓存了。
              • @nmfzone 这意味着您需要运行一次干净的测试来更新缓存。但在我的场景中,我每次都需要运行 clean 命令才能在控制台上显示测试结果。即使在以下运行中没有对 gradle 配置进行任何更改。
              • @WeishiZeng 你确定测试根本没有运行,因为它们的输入没有改变吗?如果你有一些除 java 源文件之外的测试输入,你应该将它们注册为 Task.inputs,这样 gradle 就可以知道你何时需要重新运行测试。
              【解决方案9】:

              我也在使用(testLogging.exceptionFormat = 'full'):

              test {
                  testLogging.showStandardStreams = true
                  testLogging.exceptionFormat = 'full'
              }
              

              从堆栈跟踪中了解更多信息是件好事

              【讨论】:

              • exceptionFormat 设置对我有用,showStandardStreams 无效!
              【解决方案10】:
              apply plugin : 'java'
              
              test {
                  testLogging.showStandardStreams = true
              }
              

              http://gradle.org/docs/current/dsl/org.gradle.api.tasks.testing.Test.html

              这需要当前的 gradle 版本。我假设 Scala 测试是在 Java 测试任务下运行的。

              【讨论】:

              • 哎呀,测试它看起来不像,但这会为我产生输出:pastebin.com/PX8e1EKv 编辑:将 println 修改为 print,因为我认为该事件捕获了换行符
              • 谢谢。我也会试试的。我在源文件中也有一些日志语句。如何让它们打印到控制台?
              • 这取决于日志实现。 slf4s 可能默认为 NOP 记录器并丢弃您的日志语句。你在测试类路径上有一个记录器实现 jar 吗?如果 slf4j-simple-1.6.4.jar 存在,它会将 INFO 及更高版本记录到 STDERR。如果这还不够,我会添加一个 logback jar 并设置一个 logback-test.xml 以将日志附加到控制台。
              • 使用 Spring/JUnit 为我工作
              • 它“不起作用”可能是因为测试任务被认为是最新的并且没有运行,因此您看不到任何输出。您可以使用$ gradle clean test 或在testLogging 块内使用outputs.upToDateWhen {false} (test { testLogging { outputs...)。详情见docs
              猜你喜欢
              • 2018-03-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-01-11
              • 2019-08-10
              • 2015-12-10
              • 2023-04-04
              相关资源
              最近更新 更多