Gradle:如何将测试的标准错误/标准输出输出到控制台?

84

(Gradle 3.2.1) 我运行了一些Java测试,这些测试将输出记录在标准错误/标准输出中。如果我启动

gradle test --info

但是在这种情况下,大量来自第三方库的不需要输出也会存在。

文档建议使用logging.caputureStandardError/logging.caputureStandardError (loglevel),但似乎没有任何效果。

tasks.withType(Test) {
   logging.captureStandardOutput LogLevel.QUIET
   logging.captureStandardError LogLevel.QUIET
}

如果运行gradle test,控制台不会输出任何STDERR/STDOUT。

我如何在控制台中仅获取测试类的输出?

5个回答

116
build.gradle中添加以下几行代码:
apply plugin: 'java'

test {
    dependsOn cleanTest
    testLogging.showStandardStreams = true
}

注意: dependsOn cleanTest 不是必须的,但是如果没有使用,你需要在运行test任务之前运行cleanTestclean任务。


编辑:

更好的方法:

apply plugin: 'java'

test {
    testLogging {
        outputs.upToDateWhen {false}
        showStandardStreams = true
    }
}

注意: outputs.upToDateWhen {false} 不是必需的,但如果未使用,则需要在运行test任务之前运行cleanTestclean任务。

有关更多信息和选项,请参见文档


14
@Omid,有没有办法在命令行上完成这个操作。我可能不想编辑我的 build.gradle 文件,并且暂时想要查看标准输出流。我是否可以像 -Dtest.testLogging.showStandardStreams=true 这样做? - Kilokahn
3
根据 这个问题,我认为答案是“不可以”。 - Omid
其实,改变Gradle行为的一个解决方案,同时保持build.gradle不变的方法是使用初始化脚本。你甚至可以在此检查项目或系统属性,以确定是否应更改测试任务的配置。 - Lukas Körfer
1
你在哪里找到关于 outputs 选项的信息?我在你提供的文档中没有看到它。 - Big McLargeHuge
在IntelliJ(JUnitPlatform)中,这并没有做任何事情。 - Daniel Mills
使用 outputs.upToDateWhen { false } 不是最佳实践,根据 Gradle 的说法。如果测试依赖于变量,则应该将其注册为任务输入。如果您想重新运行测试,可以在 Gradle 7.6 中添加 --rerun - aSemy

31

如果您使用 Kotlin/Kotlin DSL 进行 Gradle 构建,您需要在 build.gradle.kts 文件中添加以下内容:

tasks.withType<Test> {
    this.testLogging {
        this.showStandardStreams = true
    }
}

正如另一个答案中提到的那样,您需要运行gradle clean test才能每次打印输出。


1
谢谢,伙计。找到Kotlin DSL等效的Gradle代码太难了。 - shinvu
2
可以在上述回应中添加 outputs.upToDateWhen {false} 以避免运行 gradle clean test。只需要运行 gradle test 即可。 - SayeedHussain

1

testLogging 的答案是正确的。对我来说,由于我已经有了一个 tasks.test 部分,所以我认为将其放在那里会更容易。

tasks.test {
    useJUnitPlatform()
    this.testLogging {
        this.showStandardStreams = true
    }
}

0
扩展@Talha Malik上面的解决方案(以及这篇其他帖子),当处理多模块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" ...)也可以以同样的方式指定。


0

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