Gradle : 실시간으로 콘솔에 테스트 결과를 표시하는 방법


231

내가 실행 하는 동일한 콘솔에서 테스트 결과 (system.out / err, 테스트중인 구성 요소의 로그 메시지) 를보고 싶습니다.

gradle test

그리고 테스트가 완료 될 때만 생성되는 테스트 보고서를보기 위해 테스트가 완료 될 때까지 기다리지 마십시오.

답변:


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

1
grep원하지 않는 수천 개의 라인을 필터링하는 데 사용할 수 있습니다 . 참조 stackoverflow.com/questions/3963708/...
씨-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
제 생각에는 이것이 가장 좋은 대답입니다. 여기에는 가장 큰 옵션 세트가 포함되어 있으며 누구나 필요에 따라 테스트를 구성 할 수 있습니다.
Slav

2
@sealskej이 코드를 어디에 복사해야합니까? 그리고 명령 줄에서 어떻게 실행합니까? 편집 : 그것을 얻었다-그냥 모듈의 gradle.config에 추가하고 정상적으로 실행
hardysim

좋은! Android Studio 2.2.3을 통해 작업을 실행하면 메시지에서 오류로 인식하고 성공 빌드에서 성가신 것이기 때문에 파이프 |를 제거했습니다 startItem.
madlymad

1
그리고 색상을 어떻게 활성화 했습니까?
Durga Swaroop

1
@DurgaSwaroop 즉시 사용할 수 있습니다. 터미널 응용 프로그램이 색상을 지원하는지 확인하십시오. 저는 개인적으로 iTerm2 앱을 사용합니다.
Shubham Chaudhary

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

질문을 오해해서 미안 해요 이 경우 Gradle 설명서의 다음 부분을 살펴 봐야합니다. gradle.org/logging.html#sec:external_tools
stefanglase

1
출력을보기 위해 실제로 어떤 변경을해야합니까? 설명서에 이러한 모든 사용자 정의 리스너와 내용이 있지만이를 구성하는 방법을 모릅니다.
jpswain

118

stefanglase 가 대답 한 것처럼 :

다음 코드를 build.gradle(버전 1.1 이후)에 추가하면 통과 , 건너 뛰기실패한 테스트 에서 출력에 잘 작동합니다 .

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

추가로 말하고 싶은 것은 (이것이 초보자에게는 문제라는 것을 알았습니다) gradle test명령이 변경 당 한 번만 테스트를 실행한다는 입니다.

따라서 두 번째 로 실행하면 테스트 결과에 대한 출력이 없습니다 . 또한 건물 출력에서 ​​이것을 볼 수 있습니다. gradle 은 테스트에서 UP-TO-DATE 라고 말합니다 . 따라서 n 번째로 실행되지 않았습니다.

똑똑한 gradle!

테스트 케이스를 강제 실행하려면을 사용하십시오 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

exceptionFormat "full"AssertJ 또는 유사한 lib를 사용할 때 실패한 것에 대한 세부 정보를 얻으려면 포함 시키십시오.
Shairon Toledo

5
대신에 cleanTest당신은 사용할 수 있습니다test --rerun-tasks
gavenkoa

2
@gavenkoa --rerun-tasks테스트 작업뿐만 아니라 모든 작업을 다시 실행할 것 입니다.
ThomasW

2
실제로 cleanTest test최신 Android Studio 및 gradle 3.3에서는 내 측면에서 작동 --rerun-tasks하지 않지만 트릭을 수행했습니다. 이유를 모릅니다. 그러나이 답변을 읽으면 두통이 실제로 풀 렸습니다. 모든 것을 추가 한 후 f * king 테스트 로깅은 어디에 있습니까?
Wingzero

111

면책 조항 : 저는 Gradle Test Logger Plugin 개발자입니다.

Gradle Test Logger 플러그인 을 사용 하여 콘솔에서 아름다운 로그를 인쇄 할 수 있습니다 . 이 플러그인은 합리적인 기본값을 사용하여 구성이 거의 없거나 전혀없는 대부분의 사용자를 만족시킬뿐 아니라 모든 사용자에게 적합한 다양한 테마와 구성 옵션을 제공합니다.

표준 테마 표준 테마

모카 테마 모카 테마

용법

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 2019

방금 플러그인을 통합했지만 괄호 (1.6 초)의 모든 테스트에 대해 git에서와 같이 지속 시간 테스트가 수행되는 것을 보지 못했습니다. 어떻게 활성화합니까?
dk7

기본적으로 @ dk7은 실행하는 데 1 초 이상 걸리는 테스트 만 인쇄됩니다. 자세한 내용 은 설명서 를 참조하십시오. 모든 지속 시간을 보려면 간단히로 설정 slowThreshold하십시오 0.
adarshr

1
@ HaroldL.Brown 예 :) 나는 현재 약간의 것들로 조금 늪에 있지만 매우 살아있다.
adarshr

1
네 @VadymTyemirov. 동일 github.com/radarsh/gradle-test-logger-plugin/issues/137 내가 그것을 문서화하면 🙂
adarshr

49

build.gradlegradle 이 stdout과 stderr를 삼키지 못하게하려면 이것을 추가하십시오 .

test {
    testLogging.showStandardStreams = true
}

여기에 문서화되어 있습니다 .


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

18

Shubham의 위대한 답변에 대한 후속 조치 로 string 대신 enum 값을 사용하는 것이 좋습니다 . 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

2

에 이어 벤자민 Muschko의 대답 (2011년 3월 19일), 당신은 사용할 수 -i와 함께 깃발을 그렙 원치 않는 라인의 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 test -i으로 파이프되어 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 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)")
        }
    }))
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.