代码之家  ›  专栏  ›  技术社区  ›  tolitius

Gradle:如何在控制台中实时显示测试结果?

  •  178
  • tolitius  · 技术社区  · 14 年前

    我想查看测试结果(system.out/err,记录来自被测试组件的消息) 当他们奔跑 在我运行的同一个控制台中:

    gradle test
    

    12 回复  |  直到 6 年前
        1
  •  125
  •   Benjamin Muschko    14 年前

    您可以在命令行上使用信息日志级别运行Gradle。它将显示每个测试运行时的结果。缺点是你也会得到更多的其他任务的输出。

    gradle test -i
    
        2
  •  131
  •   Sergio del Amo    8 年前

    您可以在build.gradle文件中添加一个groovy闭包,该文件为您进行日志记录:

    test {
        afterTest { desc, result -> 
            logger.quiet "Executing test ${desc.name} [${desc.className}] with result: ${result.resultType}"
        }
    }
    

    然后在控制台上显示如下内容:

    :compileJava UP-TO-DATE
    :compileGroovy
    :processResources
    :classes
    :jar
    :assemble
    :compileTestJava
    :compileTestGroovy
    :processTestResources
    :testClasses
    :test
    Executing test maturesShouldBeCharged11DollarsForDefaultMovie [movietickets.MovieTicketsTests] with result: SUCCESS
    Executing test studentsShouldBeCharged8DollarsForDefaultMovie [movietickets.MovieTicketsTests] with result: SUCCESS
    Executing test seniorsShouldBeCharged6DollarsForDefaultMovie [movietickets.MovieTicketsTests] with result: SUCCESS
    Executing test childrenShouldBeCharged5DollarsAnd50CentForDefaultMovie [movietickets.MovieTicketsTests] with result: SUCCESS
    :check
    :build
    

    因为版本1.1 Gradle支持很多 more options to log test output . 有了这些选项,您可以通过以下配置实现类似的输出:

    test {
        testLogging {
            events "passed", "skipped", "failed"
        }
    }
    
        3
  •  130
  •   Shubham Chaudhary    7 年前

    这是我喜欢的版本:

    import org.gradle.api.tasks.testing.logging.testExceptionFormat
    导入org.gradle.api.tasks.testing.logging.testlogevent
    
    任务。带类型(测试){
    测试日志{
    //设置日志级生命周期的选项
    事件testlogevent.failed,
    已通过testlogevent.
    已跳过testlogevent.skipped,
    测试日志事件.标准输出
    exceptionformat测试exceptionformat.full
    ShowExceptions为真
    显示原因
    ShowStackTraces为真
    
    //设置日志级调试和信息的选项
    调试{
    事件testlogevent.started,
    testlogevent.failed,失败,
    已通过testlogevent.
    已跳过testlogevent.skipped,
    testlogevent.standard_错误,
    测试日志事件.标准输出
    exceptionformat测试exceptionformat.full
    }
    info.events=调试.events
    info.exceptionformat=debug.exceptionformat
    
    AfterSuite描述,结果->
    如果(!)desc.parent)//将与最外面的套件匹配
    def output=“结果:$result.resultType($result.testcount tests,$result.successfultestcount successfuls,$result.failedtestcount failures,$result.skipped testcount skipped testcount)”。
    def startitem='124;',enditem='124;'
    def repeatlength=startitem.length()+output.length()+enditem.length())
    println('\n'+('-'*repeatlength)+'\n'+startitem+output+enditem+'\n'+('-'*repeatlength))
    }
    }
    }
    }
    < /代码> 
    

    import org.gradle.api.tasks.testing.logging.TestExceptionFormat
    import org.gradle.api.tasks.testing.logging.TestLogEvent
    
    tasks.withType(Test) {
        testLogging {
            // set options for log level LIFECYCLE
            events TestLogEvent.FAILED,
                   TestLogEvent.PASSED,
                   TestLogEvent.SKIPPED,
                   TestLogEvent.STANDARD_OUT
            exceptionFormat TestExceptionFormat.FULL
            showExceptions true
            showCauses true
            showStackTraces true
    
            // set options for log level DEBUG and INFO
            debug {
                events TestLogEvent.STARTED,
                       TestLogEvent.FAILED,
                       TestLogEvent.PASSED,
                       TestLogEvent.SKIPPED,
                       TestLogEvent.STANDARD_ERROR,
                       TestLogEvent.STANDARD_OUT
                exceptionFormat TestExceptionFormat.FULL
            }
            info.events = debug.events
            info.exceptionFormat = debug.exceptionFormat
    
            afterSuite { desc, result ->
                if (!desc.parent) { // will match the outermost suite
                    def output = "Results: ${result.resultType} (${result.testCount} tests, ${result.successfulTestCount} successes, ${result.failedTestCount} failures, ${result.skippedTestCount} skipped)"
                    def startItem = '|  ', endItem = '  |'
                    def repeatLength = startItem.length() + output.length() + endItem.length()
                    println('\n' + ('-' * repeatLength) + '\n' + startItem + output + endItem + '\n' + ('-' * repeatLength))
                }
            }
        }
    }
    
        4
  •  93
  •   JJD    9 年前

    AS 炖乳酪 回答:

    将以下代码添加到 build.gradle (自1.1版起)在 通过 , 跳过 失败 测验。

    test {
        testLogging {
            events "passed", "skipped", "failed", "standardOut", "standardError"
        }
    }
    

    另外我想说的是(我发现这对初学者来说是个问题) gradle test 命令执行测试 每次更改仅一次 .

    所以如果你在运行它 第二次测试结果没有输出 . 你也可以在建筑输出中看到:Gradle然后说 最新的 在测试中。所以它没有执行第n次。

    聪明的毕业生!

    如果要强制运行测试用例,请使用 gradle cleanTest test .

    这个话题有点离题,但我希望它能帮助一些新手。

    编辑

    AS 斯巴达 评论中指出:

    如果你想强迫Gradle 始终运行新测试 (这可能并不总是一个好主意)你可以添加 outputs.upToDateWhen {false} testLogging { [...] } . 继续阅读 here .

    和平。

        5
  •  53
  •   adarshr    6 年前

    免责声明:我是Gradle测试记录器插件的开发人员。

    您可以使用 gradle test logger plugin 在控制台上打印漂亮的日志。该插件提供了许多主题和配置选项,以适应大量观众。

    < Buff行情>

    注意:Gradle测试记录器插件v1.4+现在也支持并行测试执行。只需使用一个合适的主题。

    < /块引用>

    示例

    标准主题

    摩卡主题

    用法

    插件{ id'com.adarshr.test logger'version'<版本>' } < /代码>

    确保您始终从Gradle Central获得

    配置

    您根本不需要任何配置。但是,该插件提供了一些选项。可以按如下方式进行(显示默认值):

    测试记录器{
    //选择主题-mocha、standard、plain、mocha parallel、standard parallel或plain parallel
    主题“标准”
    
    //设置为false以禁用详细的失败日志
    ShowExceptions为真
    
    //以毫秒为单位设置阈值以突出显示慢速测试
    慢阈值2000
    
    //显示通过、失败和跳过的细分以及总持续时间
    ShowSummary为真
    
    //设置为false以隐藏通过的测试
    展示真实
    
    //设置为false以隐藏跳过的测试
    ShowSkipped为真
    
    //设置为false以隐藏失败的测试
    显示失败的真
    
    //启用以查看标准输出流和与测试结果内联的错误流
    ShowStandardStreams错误
    
    //设置为false以隐藏传递的标准输出和错误流
    ShowPassedStandardStreams为真
    
    //设置为false以隐藏跳过的标准输出和错误流
    ShowSkippedStandardStreams为真
    
    //设置为false以隐藏失败的标准输出和错误流
    ShowFailedStandardStreams为真
    }
    < /代码> 
    
    

    我希望您喜欢使用它。

    在控制台上打印漂亮的日志。这个插件提供了许多主题和配置选项,以适应大量的读者。

    注意:Gradle测试记录器插件v1.4+现在也支持并行测试执行。简单使用suitable theme.

    实例

    Standard Theme 标准主题

    Mocha Theme 摩卡主题

    用法

    plugins {
        id 'com.adarshr.test-logger' version '<version>'
    }
    

    确保你总是得到latest version from Gradle Central.

    配置

    您根本不需要任何配置。但是,该插件提供了一些选项。可以按如下方式进行(显示默认值):

    testlogger {
        // pick a theme - mocha, standard, plain, mocha-parallel, standard-parallel or plain-parallel
        theme 'standard'
    
        // set to false to disable detailed failure logs
        showExceptions true
    
        // set threshold in milliseconds to highlight slow tests
        slowThreshold 2000
    
        // displays a breakdown of passes, failures and skips along with total duration
        showSummary true
    
        // set to false to hide passed tests
        showPassed true
    
        // set to false to hide skipped tests
        showSkipped true
    
        // set to false to hide failed tests
        showFailed true
    
        // enable to see standard out and error streams inline with the test results
        showStandardStreams false
    
        // set to false to hide passed standard out and error streams
        showPassedStandardStreams true
    
        // set to false to hide skipped standard out and error streams
        showSkippedStandardStreams true
    
        // set to false to hide failed standard out and error streams
        showFailedStandardStreams true
    }
    

    我希望你会喜欢使用它。

        6
  •  43
  •   JJD    9 年前

    将此添加到 build.gradle 阻止Gradle吞咽stdout和stderr。

    test {
        testLogging.showStandardStreams = true
    }
    

    它被记录在案 here .

        7
  •  33
  •   Community CDub    8 年前

    “测试”任务不适用于Android插件,对于Android插件,请使用以下内容:

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

    请参见以下内容: https://stackoverflow.com/a/31665341/3521637

        8
  •  17
  •   Community CDub    8 年前

    作为后续行动 Shubham's great answer 我建议使用 枚举 值而不是 . 请看一下 documentation of the TestLogging class .

    import org.gradle.api.tasks.testing.logging.TestExceptionFormat
    import org.gradle.api.tasks.testing.logging.TestLogEvent
    
    tasks.withType(Test) {
        testLogging {
            events TestLogEvent.FAILED,
                   TestLogEvent.PASSED,
                   TestLogEvent.SKIPPED,
                   TestLogEvent.STANDARD_ERROR,
                   TestLogEvent.STANDARD_OUT
            exceptionFormat TestExceptionFormat.FULL
            showCauses true
            showExceptions true
            showStackTraces true
        }
    }
    
        9
  •  7
  •   JJD    9 年前

    在Gradle中使用Android插件:

    gradle.projectsEvaluated {
        tasks.withType(Test) { task ->
            task.afterTest { desc, result ->
                println "Executing test ${desc.name} [${desc.className}] with result: ${result.resultType}"
            }
        }
    }
    

    然后输出为:

    正在执行测试转换分钟数[org.example.app.test.durationtest],结果:成功

        10
  •  7
  •   Andrzej Rehmann Colin Hebert    8 年前

    我最喜欢的基于Shubham Chaudhary答案的极简版。

    将其放入 build.gradle file:。

    测试{
    AfterSuite描述,结果->
    如果(!)父级)
    println(“$result.resultType”)。+
    “($result.testcount tests,”“+
    “$result.successfulTestCount成功,”。+
    “$result.failedtestcount failures,”。+
    “$result.skippedtestcount跳过)”)
    }
    < /代码> 
    

    把这个放进去build.gradle文件:

    test {
        afterSuite { desc, result ->
        if (!desc.parent)
            println("${result.resultType} " +
                "(${result.testCount} tests, " +
                "${result.successfulTestCount} successes, " +
                "${result.failedTestCount} failures, " +
                "${result.skippedTestCount} skipped)")
        }
    }
    
        11
  •  3
  •   Community CDub    8 年前

    合并 Shubham's great answer JJD use enum instead of string

    tasks.withType(Test) {
       testLogging {
           // set options for log level LIFECYCLE
           events TestLogEvent.PASSED,
                TestLogEvent.SKIPPED, TestLogEvent.FAILED, TestLogEvent.STANDARD_OUT
           showExceptions true
           exceptionFormat TestExceptionFormat.FULL
           showCauses true
           showStackTraces true
    
        // set options for log level DEBUG and INFO
           debug {
            events TestLogEvent.STARTED, TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED, TestLogEvent.STANDARD_OUT, TestLogEvent.STANDARD_ERROR
            exceptionFormat TestExceptionFormat.FULL
           }
           info.events = debug.events
           info.exceptionFormat = debug.exceptionFormat
    
           afterSuite { desc, result ->
               if (!desc.parent) { // will match the outermost suite
                   def output = "Results: ${result.resultType} (${result.testCount} tests, ${result.successfulTestCount} successes, ${result.failedTestCount} failures, ${result.skippedTestCount} skipped)"
                   def startItem = '|  ', endItem = '  |'
                   def repeatLength = startItem.length() + output.length() + endItem.length()
                   println('\n' + ('-' * repeatLength) + '\n' + startItem + output + endItem + '\n' + ('-' * repeatLength))
               }
           }
       }
    }
    
        12
  •  1
  •   Mr-IDE    6 年前

    从以下位置开始 Benjamin Muschko's answer (2011年3月19日),您可以使用 -i 旗随 grep ,过滤掉1000条不需要的线路。实例:

    强滤波器 -只显示每个单元测试名称和结果,以及总体构建状态。不显示安装错误或异常。

    ./gradlew test -i | grep -E " > |BUILD"
    

    软滤器 -显示每个单元测试名称和结果,以及设置错误/异常。但它也将包含一些不相关的信息:

    ./gradlew test -i | grep -E -v "^Executing |^Creating |^Parsing |^Using |^Merging |^Download |^title=Compiling|^AAPT|^future=|^task=|:app:|V/InstrumentationResultParser:"
    

    软筛选器,可选语法: (搜索标记被拆分为单个字符串)

    ./gradlew test -i | grep -v -e "^Executing " -e "^Creating " -e "^Parsing " -e "^Using " -e "^Merging " -e "^Download " -e "^title=Compiling" -e "^AAPT" -e "^future=" -e "^task=" -e ":app:" -e "V/InstrumentationResultParser:"
    

    安卓仪器单元测试示例:

    ./gradlew connectedDebugAndroidTest --continue -i | grep -E -v "^Executing |^Creating |^Parsing |^Using |^Merging |^Download |^title=Compiling|^AAPT|^future=|^task=|:app:|V/InstrumentationResultParser:"
    

    Jacoco单元测试覆盖示例:

    ./gradlew createDebugCoverageReport --continue -i | grep -E -v "^Executing |^Creating |^Parsing |^Using |^Merging |^Download |^title=Compiling|^AAPT|^future=|^task=|:app:|V/InstrumentationResultParser:"
    

    解释其工作原理: 第一个命令的输出, ./gradlew test -i ,通过管道传输到第二个命令 grep ,它将根据正则表达式筛选出许多不需要的行。 "-E" 启用正则表达式模式,以及 "|" 意味着“或”。使用筛选单元测试名称和结果 " > " ,并用筛选总体状态 "BUILD" . 在软过滤箱中, "-v" 标志装置 "not containing" "^" 表示“行首”。所以它去掉了以“创建”或“解析”等开头的行。

    推荐文章