293

テスト結果 (system.out/err、テストされているコンポーネントからのログ メッセージ)を、実行している同じコンソールで実行したときに表示したいと思います。

gradle test

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

4

19 に答える 19

218

これが私のファンシーバージョンです:

ファンシーテスト結果

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))
            }
        }
    }
}
于 2016-03-21T12:00:42.800 に答える
211

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

gradle test -i
于 2011-03-19T14:01:17.530 に答える
171

ロギングを行う 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"
    }
}
于 2010-11-27T16:56:19.820 に答える
44

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

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

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

于 2015-07-28T09:21:33.667 に答える
5

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

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)")
        }
    }))
}
于 2019-11-25T10:31:40.890 に答える
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))
           }
       }
   }
}
于 2016-11-30T12:50:46.667 に答える
3

Android の場合、これはうまく機能します。

android {
...

testOptions {
    unitTests.all {
        testLogging {
            outputs.upToDateWhen { false }
            events "passed", "failed", "skipped", "standardError"
            showCauses true
            showExceptions true
        }
    }
} 

}

コンソールからの Android ユニット / インストルメンテーション テストの実行を参照してください。

于 2021-03-09T16:45:00.997 に答える
2

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

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

./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:"

それがどのように機能するかの説明:

最初のコマンドは「Info/Verbose」モード./gradlew test -i"-i"意味し、各テストの結果をリアルタイムで出力しますが、大量の不要なデバッグ行も表示します。

したがって、最初のコマンド の出力は、正規表現に基づいて多くの不要な行を./gradlew test -i除外する 2 番目のコマンド にパイプされます。単一文字列の正規表現モードを有効にします。複数の文字列の正規表現を有効にします。正規表現文字列では、「または」を意味します。grep"-E""-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:"
于 2018-10-20T10:59:21.000 に答える