Gradle:コンソールにテスト結果をリアルタイムで表示する方法は?


231

私が実行しているのと同じコンソールで実行したときのテスト結果(system.out / err、テスト対象のコンポーネントからのログメッセージ)を見たいのですが。

gradle test

そして、テストが終了してテストレポートが表示されるまで待ちません(テストが完了したときにのみ生成されるため、テストの実行中は何も "tail -f"できません)。

回答:


169

コマンドラインでINFOロギングレベルでGradleを実行できます。実行中の各テストの結果が表示されます。欠点は、他のタスクでも出力がはるかに多くなることです。

gradle test -i

13
1.0マイルストーン6では、Gradle DSLは、クロージャー内でtestLogging.showStandardStreams = trueを使用して直接構成できるようになりtestました。
Benjamin Muschko

4
これはgradle 1.11では機能しません。大量のデバッグ出力が得られますが、個々のテスト結果は得られません。
David Moles

44
これ-iにより、無関係な情報が端末に大量にスローされます。
Thuy Trinh

9
多くの役に立たない出力に加えて、合格して出力を生成しないテストでは何も表示されません。
toolbear 2016年

1
を使用grepして、数千の不要な行を除外できます。stackoverflow.com/questions/3963708/…を
Mr-IDE

172

ここに私の素晴らしいバージョンがあります:

ファンシーテスト結果

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} passed, ${result.failedTestCount} failed, ${result.skippedTestCount} skipped)"
                def startItem = '|  ', endItem = '  |'
                def repeatLength = startItem.length() + output.length() + endItem.length()
                println('\n' + ('-' * repeatLength) + '\n' + startItem + output + endItem + '\n' + ('-' * repeatLength))
            }
        }
    }
}

13
私の意見では、これがここでの最良の答えです。これには最大のオプションセットが含まれており、誰でも必要に応じてテストを構成できます。
スレーブは

2
@sealskejこのコードをどこにコピーする必要があり、コマンドラインから実行する方法を教えてください。編集:取得しました-モジュールのgradle.configに追加して、通常どおり実行します
hardysim '26

いいね!Android Studio 2.2.3を介してタスクを実行すると、パイプがメッセージのエラーとして認識され、成功したビルドが煩わしいため、パイプ|を削除しましたstartItem
madlymad 2017年

1
そして、どのようにして色を有効にしましたか?
Durga Swaroop、2017

1
@DurgaSwaroopは、すぐに使用できます。端末アプリケーションが色をサポートしていることを確認してください。個人的にiTerm2アプリを使用しています。
Shubham Chaudhary 2017

156

ロギングを行う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はテスト出力をログに記録するためのより多くのオプションをサポートしています。これらのオプションを使用すると、次の構成で同様の出力を実現できます。

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

4
これはテストが実行された後にのみ出力を生成します。私が探しているのは、テストの実行中にロギング/レポート/システム出力/ printlnsなどを確認することです。mavenを使用して、またはIntelliJ / Eclipseだけでテストを実行することを検討してください。出力はリアルタイムで生成されます。
tolitius 2010年

さて、あなたの質問を誤解して申し訳ありません。その場合は、Gradleのドキュメントの次の部分をご覧ください。gradle.org
logging.html#sec

1
では、出力を確認するために実際にどのような変更を行いますか?ドキュメントにはこれらすべてのカスタムリスナーやものが表示されますが、これを構成する方法がわかりません。
jpswain

118

以下のようstefanglaseは答えました:

次のコードをbuild.gradle(バージョン1.1以降)に追加すると、合格したテスト、スキップテスト、および失敗したテストの出力に問題なく機能します。

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

さらに言いたいのは(これは初心者の問題であることがわかりました)、gradle testコマンドは変更ごとに1回だけテストを実行するということです。

したがって、2回目に実行した場合、テスト結果の出力はありません。これは建物の出力でも確認できます。gradleはテストでUP-TO-DATEと表示します。そのため、n回実行されません。

スマートグラドル!

テストケースを強制的に実行する場合は、を使用しますgradle cleanTest test

これは少し話題から外れていますが、初心者に役立つことを願っています。

編集する

sparc_spreadコメントで次のように述べました。

あなたがするのGradleを強制したい場合は、常に新鮮なテストを実行し、追加することができます(常に良いアイデアではないかもしれません)outputs.upToDateWhen {false}にしtestLogging { [...] }ここを読み続けてください

平和。


11
ねえ、ちょうどあなたに知らせたかったのですが、gradle cleanTest test毎回言う必要がない方法を見つけました(Gradle 1.12以降)。に追加outputs.upToDateWhen {false}するtestLogging {...}と、それでうまくいくはずです。Gradleが毎回テストを実行するように強制します。Dockter自身が投稿したGradleフォーラムでこれを見つけまし。お役に立てれば。
sparc_spread 2014年

exceptionFormat "full"AssertJまたは同様のlibを使用しているときに役立つ、何が失敗したかについての詳細を取得するために含めます。
Shairon Toledo 2015

5
代わりにcleanTest使用することができますtest --rerun-tasks
ギヴェンコア2017年

2
@gavenkoa --rerun-tasksテスト用のタスクだけでなく、すべてのタスクを再実行すると思います。
ThomasW 2017年

2
実際、cleanTest test最新のAndroid Studioでは、gradle 3.3は私の側では機能しません--rerun-tasksが、トリックを行いました。理由がわからない。しかし、この答えを読んだことで頭痛は本当に解決しました。
Wingzero 2017年

111

免責事項:私はGradle Test Logger Pluginの開発者です。

Gradle Test Logger Pluginを使用するだけで、コンソールに美しいログを印刷できます。プラグインは、ほとんどまたはまったく設定なしでほとんどのユーザーを満足させるために適切なデフォルトを使用しますが、誰にでも合うように多くのテーマと設定オプションを提供します。

標準テーマ 標準テーマ

モカのテーマ モカのテーマ

使用法

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

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 to false to hide stack traces
    showStackTraces true

    // set to true to remove any filtering applied to stack traces
    showFullStackTraces false

    // set to false to hide exception causes
    showCauses 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 true to see simple class names
    showSimpleNames false

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

どうぞよろしくお願いいたします。


3
いいね!成功した/失敗した/スキップされたテストの要約と同じくらい単純な驚くべきものがそれにつながりました。
MarkHu 2018

プラグインを統合しましたが、括弧内のすべてのテストのgit(1.6s)のように、テストの所要時間がわかりません。それを有効にするにはどうすればよいですか?
dk7 '19年

@ dk7のデフォルトでは、実行に1秒以上かかるテストのみが期間を出力します。詳細については、ドキュメントを参照しください。すべての期間を表示するには、単にに設定slowThreshold0ます。
adarshr 2018年

1
@ HaroldL.Brownはい、確かに:)私は現在、いくつかのことで少し困っていますが、それは非常に生きています。
adarshr

1
うん、@ VadymTyemirov。同じgithub.com/radarsh/gradle-test-logger-plugin/issues/137私はそれを文書化したら🙂
adarshr


38

「テスト」タスクはAndroidプラグインでは機能しません。Androidプラグインの場合、以下を使用します。

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

次を参照してください:https : //stackoverflow.com/a/31665341/3521637


3
驚くばかり。FYI Future me-android {}ブロック内に配置しないことで2分節約
Shubham Chaudhary 2015

18

Shubhamの素晴らしい答えのフォローアップとして、文字列ではなく列挙値を使用することをお勧めしますTestLoggingクラスのドキュメントをご覧ください。

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

12

Shubham Chaudharyの回答に基づいた私のお気に入りのミニマルバージョン。 ここに画像の説明を入力してください

これをbuild.gradleファイルに入れます:

test {
    afterSuite { desc, result ->
    if (!desc.parent)
        println("${result.resultType} " +
            "(${result.testCount} tests, " +
            "${result.successfulTestCount} successes, " +
            "${result.failedTestCount} failures, " +
            "${result.skippedTestCount} skipped)")
    }
}

7

Androidプラグインを使用するGradleの場合:

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

次に、出力は次のようになります。

テストtestConversionMinutes [org.example.app.test.DurationTest]を実行して次の結果を返します:SUCCESS


3

Shubhamの素晴らしい答えJJDのマージは文字列の代わりに列挙型を使用します

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

2
回答の前後にもう少しコンテキストを追加してください。コードのみまたはリンクのみの回答は理解が困難です。投稿にさらに情報を追加できれば、質問者と将来の読者の両方に役立ちます。
RBT 2017年

2

Benjamin Muschkoの回答(2011年3月19日)に続き、-iフラグをgrepとともに使用して、不要な数千行を除外できます。例:

強力なフィルター -各単体テストの名前と結果、および全体的なビルドステータスのみを表示します。セットアップのエラーまたは例外は表示されません。

./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 test -i除外する2番目のコマンドにパイプされgrepます。"-E"正規表現モードを有効にし、"|"「または」を意味します。ユニットテストの名前と結果はを使用して表示でき" > "、全体的なステータスはを使用して表示でき"BUILD"ます。ソフトフィルターでは、"-v"フラグは「含まない」"^"意味し、「行の先頭を意味します。したがって、「Executing」または「Creating」で始まるすべての行が削除されます。


Gradle 5.1でのAndroidインストルメンテーションユニットテストの例:

./gradlew connectedDebugAndroidTest --continue -i | grep -v -e \
"^Transforming " -e "^Skipping " -e "^Cache " -e "^Performance " -e "^Creating " -e \
"^Parsing " -e "^file " -e "ddms: " -e ":app:" -e "V/InstrumentationResultParser:"

Gradle 4.10でのJacocoユニットテストカバレッジの例:

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

0

Kotlin DSLでbuild.gradle.kts記述されている場合は、テスト結果を印刷できます(私はkotlinマルチプラットフォームプロジェクトを開発しており、「java」プラグインを適用していません)。

tasks.withType<AbstractTestTask> {
    afterSuite(KotlinClosure2({ desc: TestDescriptor, result: TestResult ->
        if (desc.parent == null) { // will match the outermost suite
            println("Results: ${result.resultType} (${result.testCount} tests, ${result.successfulTestCount} successes, ${result.failedTestCount} failures, ${result.skippedTestCount} skipped)")
        }
    }))
}

0

次のクロージャーをbuild.gradleに追加するだけです。出力は、すべてのテストの実行後に印刷されます。

test{
    useJUnitPlatform()
    afterTest { desc, result ->
        def output = "Class name: ${desc.className}, Test name: ${desc.name},  (Test status: ${result.resultType})"
        println( '\n' + output)
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.