使用Gradle进行测试时记录日志

104

在测试过程中,Gradle似乎会将stdout/stderr重定向到project_dir/build/reports/tests/index.html。是否有方法避免此重定向,并将结果打印到控制台上?

附加信息:

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

131

1
在测试它时出了些问题,看起来好像不行,但这个代码段对我产生了输出:http://pastebin.com/PX8e1EKv编辑:将println改为print,因为我认为该事件会捕获换行符。 - roby
谢谢。我也会尝试。我的源文件中有一些日志语句。我该如何使它们打印到控制台? - missingfaktor
这取决于日志记录的实现。slf4s可能默认使用NOP记录器并丢弃您的日志语句。您在测试类路径上是否有记录器实现jar?如果存在slf4j-simple-1.6.4.jar,则会将INFO及以上内容记录到STDERR。如果这还不够,我建议添加logback jar并设置logback-test.xml以将日志附加到控制台。 - roby
使用Spring/JUnit对我很有效。 - Dmitry Minkovsky
可能是因为测试任务被认为是最新的,不需要运行,所以你看不到输出,导致它“无法工作”。你可以使用$ gradle clean test命令或在testLogging块内使用outputs.upToDateWhen {false}。有关详细信息,请参阅文档 - Johnny Baloney
显示剩余3条评论

41

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

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

从堆栈跟踪中看到更多信息是很好的


3
“exceptionFormat”设置对我有用,“showStandardStreams”没有任何效果! - Shakeel

29

对于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
    }
}

22

正如@roby所回答的:

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

apply plugin : 'java'

test {
    testLogging.showStandardStreams = true
}

重要!

您需要运行带有 clean 命令的 gradle test 或 build。

./gradlew clean test

or

./gradlew clean build

希望那能行。


3
请问为什么需要“clean”? - Michael Kanis
2
@MichaelKanis 因为您已更改了gradle配置..据我所知,gradle配置是被缓存的。 - nmfzone
1
@nmfzone 这意味着您需要运行一次 clean test 以更新缓存。但在我的情况下,我需要每次运行 clean 命令,只是为了在控制台上显示测试结果。即使在后续运行中没有对 gradle 配置进行更改。 - Weishi Z
1
@WeishiZeng 你确定测试不运行只是因为它们的输入没有改变吗?如果你有一些测试输入除了Java源文件之外,你应该将它们注册为Task.inputs,这样Gradle就可以知道何时需要重新运行测试。 - Ajax

17

只是补充一下,:

showStandardStreams = true

是以下缩写:showStandardStreams

events = ["standard_out", "standard_error"]

混合两个输入时要记住以下重要事项:

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

将会导致没有标准输出(stdout),而反过来则不会。

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

将标准输出的记录添加到列表中,因此标准输出将正常工作

详见源代码


1
showStandardStreams在顺序上排在第二位时,只是为了双重检查,标准流是否被追加到事件列表中?看起来是这样的,但只是双重检查。 - George Pantazes

15
test {
    testLogging.showStandardStreams = true
}

test {
    testLogging {
        showStandardStreams = true
    }
}

同样适用。


14

如果您正在使用 build.gradle.kts 的 Kotlin DSL,语法会有所不同。

请确保您的依赖项中有 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")
    }
}

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


9

4
./gradlew --info clean build test

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


"--info"和"--debug"会显示太多的Gradle日志,大多数情况下我们并不需要它们。 - Hantsy

0
扩展 @joshuakcockrell 和 @Blundell 的解决方案(这里这里),当处理多模块 Android 应用程序时,可以使用以下内容(根 build.gradle)。
// Call from root build.gradle
setupTestLogging()

fun Project.setupTestLogging() {
    for (sub in subprojects) {
        sub.tasks.withType<Test> {
            testLogging {
                exceptionFormat = TestExceptionFormat.FULL
            }
        }
    }
}

请注意,虽然仅使用exceptionFormat就足以获得所需的结果,但上述提到的events("standardOut" ...)也可以以同样的方式指定。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接