Gradle: Konsolda Test Sonuçlarını Gerçek Zamanlı Olarak Görüntüleme


232

Çalıştığım aynı konsolda çalışırken test sonuçlarını (system.out / err, test edilen bileşenlerden günlük iletileri) görmek istiyorum:

gradle test

Ve test raporlarına bakmak için testler yapılana kadar beklemeyin (sadece testler tamamlandığında üretilir, bu yüzden testler çalışırken hiçbir şeyi "kuyruk" yapamam)

Yanıtlar:


170

Gradle'ı komut satırında INFO günlük kaydı düzeyi ile çalıştırabilirsiniz. Her testin sonuçları çalışırken size gösterilecektir. Dezavantajı, diğer görevler için çok daha fazla çıktı elde etmenizdir.

gradle test -i

13
1.0-kilometre taşı 6 ile Gradle DSL şimdi bunun doğrudan kullanarak yapılandırmak yapalım gerçek testLogging.showStandardStreams = dahilinde testkapatılması.
Benjamin Muschko

4
Bu seviye 1.11'de çalışmaz. Çok sayıda hata ayıklama çıktısı alıyorum, ancak tek tek test sonuçları almıyorum.
David Moles

45
Bu -i, terminale bir sürü alakasız bilgi atacak.
Thuy Trinh

9
Çok fazla yararsız çıktıya ek olarak, çıktı veren ve çıkmayan testler için hiçbir şey görüntülenmez.
araç çubuğu

1
grepBinlerce istenmeyen satırı filtrelemek için kullanabilirsiniz . Bkz. Stackoverflow.com/questions/3963708/…
Mr-IDE

173

İşte benim fantezi versiyonu:

fantezi test sonucu

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
Bence buradaki en iyi cevap bu. En büyük seçenek grubunu içerir ve herkes testlerini ihtiyaç duydukları şekilde yapılandırabilir.
Slav

2
@sealskej Bu kodu nereye kopyalamalıyım ve komut satırından nasıl çalıştırırım? DÜZENLEME: anladım - sadece modüllerin gradle.config dosyasına ekleyin ve normal şekilde çalıştırın
hardysim

Güzel! Sadece boru kaldırıldı |gelen startItemAndroid Studio 2.2.3 üzeri görev çalıştıran mesajlarda hatalar olarak tanımaması nedeniyle ve başarı kurar üzerinde sinir bozucu oldu.
madlymad

1
Ve renkleri nasıl etkinleştirdiniz?
Durga Swaroop

1
@DurgaSwaroop Benim için kutunun dışında çalışır. Lütfen terminal uygulamanızın renkleri desteklediğinden emin olun. Şahsen iTerm2 uygulamasını kullanıyorum.
Shubham Chaudhary

158

Build.gradle dosyanızın içine günlüğe kaydetme yapan bir Groovy kapatma ekleyebilirsiniz:

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

Konsolunuzda şu şekilde okunur:

: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 sürümünden bu yana Gradle, test çıktısını kaydetmek için çok daha fazla seçeneği destekler . Bu seçeneklerle, aşağıdaki yapılandırmayla benzer bir çıktı elde edebilirsiniz:

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

4
bu, yalnızca test yürütüldükten sonra çıktıyı üretecektir . ne aradığım testler çalışırken günlüğü / raporlama / sistem çıkışları / printlns vb .. görmektir . maven ile veya sadece IntelliJ / Eclipse ile test yapmayı düşünün: çıktı gerçek zamanlı olarak üretilir.
tolitius

Tamam, sorunuzu yanlış anladığınız için üzgünüm. Bu durumda Gradle belgelerinin aşağıdaki bölümüne göz atmalısınız: gradle.org/logging.html#sec:external_tools
stefanglase

1
Peki çıktıyı görmek için ne gibi değişiklikler yapıyorum? Tüm bu özel dinleyicileri ve belgeleri belgelerde görüyorum, ancak bunu nasıl yapılandıracağım konusunda hiçbir fikrim yok.
jpswain

118

As stefanglase cevap verdi:

Aşağıdaki kodu ekleyerek sizin build.gradle(sürüm 1.1 beri) üzerine çıkış için ceza işleri geçti , atlanır ve başarısız testler.

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

Ek olarak söylemek istediğim (bu yeni başlayanlar için bir sorun olduğunu öğrendim) gradle testkomut testi değişiklik başına sadece bir kez yürütmesidir .

Dolayısıyla, ikinci kez çalıştırıyorsanız , test sonuçlarında herhangi bir çıktı olmayacaktır . Bunu bina çıktısında da görebilirsiniz: gradle daha sonra testlerde UP-TO-DATE diyor . Yani n'inci kez yapılmadı.

Akıllı kepçe!

Test senaryolarını çalışmaya zorlamak istiyorsanız kullanın gradle cleanTest test.

Bu biraz konu dışı ama umarım bazı yeni başlayanlara yardımcı olacaktır.

Düzenle

Yorumlarda belirtildiği gibi sparc_spread :

Size gradle zorlamak istiyorsanız her zaman çalıştırmak taze testler (her zaman iyi bir fikir olmayabilir) ekleyebilir outputs.upToDateWhen {false}için testLogging { [...] }. Burada okumaya devam edin .

Barış.


11
Hey, sadece gradle cleanTest testher seferinde söylemek zorunda kalmamam için bir yol bulduğumu bildirmek istedim (1.12. Sınıftan itibaren). Ekle outputs.upToDateWhen {false}için testLogging {...}ve hile yapmak gerekir. Gradle'ı her seferinde testleri yapmaya zorlar. Bunu Dockter'ın gönderdiği Gradle forumlarında buldum . Bu yardımcı olur umarım.
sparc_spread

exceptionFormat "full"AssertJ veya benzeri bir lib kullandığınızda neyin başarısız, yararlı olduğuna dair ayrıntılar almayı da dahil ederim .
Shairon Toledo

5
Bunun yerine cleanTestkullanabilirsiniztest --rerun-tasks
gavenkoa

2
@gavenkoa --rerun-tasksSadece testler için değil tüm görevlerinizi tekrar çalıştıracağınızı düşünüyorum .
ThomasW

2
aslında, cleanTest testen son Android Studio ve gradle 3.3'te benim tarafımda çalışmıyor, ancak --rerun-taskshile yaptı. Neden bilmiyorum. Ama bu cevabı okumak baş ağrımı gerçekten çözdü, her şeyi ekledikten sonra en iyi test kaydı.
Wingzero

111

Yasal Uyarı: Gradle Test Logger Eklentisinin geliştiricisiyim.

Konsolda güzel günlükler yazdırmak için Gradle Test Logger Eklentisini kullanabilirsiniz. Eklenti, yapılandırmayı çok az olan veya hiç olmayan çoğu kullanıcıyı tatmin etmek için makul varsayılanları kullanır, ancak herkese uyacak bir dizi tema ve yapılandırma seçeneği sunar.

Örnekler

Standart Tema Standart tema

Mocha Teması Mocha teması

kullanım

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

Gradle Central'dan her zaman en son sürümü aldığınızdan emin olun .

Yapılandırma

Hiçbir yapılandırmaya ihtiyacınız yok. Ancak, eklenti birkaç seçenek sunar. Bu aşağıdaki gibi yapılabilir (varsayılan değerler gösterilmiştir):

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
}

Umarım kullanmaktan zevk alırsınız.


3
Güzel! Başarılı / başarısız / atlanmış testlerin bir özeti kadar basit bir şey buna yol açtı.
MarkHu

Sadece eklentiyi entegre ettim, ancak parantez içindeki her test için git testinizde olduğu gibi sürenin testlerini göremiyorum (1.6s) Bunu nasıl etkinleştirebilirim?
dk7

@ dk7 varsayılan olarak yalnızca 1 saniyeden uzun süren testlerin yazdırılma süresine sahip olacaktır. Daha fazla bilgi için belgelere bakın . Tüm süreleri görmek istiyorsanız, ayarını slowThresholdyapın 0.
adarshr

1
@ HaroldL.Brown Evet gerçekten :) Şu anda birkaç şeyle biraz batakım ama çok canlı.
adarshr


49

build.gradleGraderin stdout ve stderr'i yutmasını durdurmak için bunu ekleyin .

test {
    testLogging.showStandardStreams = true
}

Belgeli burada .


38

'test' görevi Android eklentisi için çalışmıyor, Android eklentisi için aşağıdakileri kullanın:

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

Aşağıdakilere bakın: https://stackoverflow.com/a/31665341/3521637


3
Muhteşem. FYI Future me - android {} bloğuna yerleştirerek iki dakikanızı kaydedin
Shubham Chaudhary

18

Bir takip yukarı olarak shubham harika cevap kullanıyorum önermek ister enum yerine değerlerini dizeleri . Lütfen TestLogging sınıfının belgelerine bakın .

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 cevabına dayanan en sevdiğim minimalist versiyon. resim açıklamasını buraya girin

Bunu build.gradledosyaya koy :

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

7

Android eklentisini kullanarak Gradle'da:

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

Sonra çıktı:

Test testinin dönüştürülmesiConversionMinutes [org.example.app.test.DurationTest] sonucuyla sonuçlanıyor: SUCCESS


3

Ait Birleştirme shubham harika cevabı ve yerine dize JJD kullanımı enum

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
Cevabınızın etrafına biraz daha bağlam eklemenizi rica ediyorum. Yalnızca kod veya yalnızca bağlantı yanıtlarını anlamak zordur. Gönderinize daha fazla bilgi ekleyebilmeniz hem askerlere hem de gelecekteki okuyuculara yardımcı olacaktır.
RBT

2

İtibaren ardından Benjamin Muschko cevabı (19 Mart 2011), kullanabilirsiniz -ibirlikte bayrağı grep istenmeyen çizgilerin 1000'ler filtrelemek için. Örnekler:

Güçlü filtre - Yalnızca her birim test adını ve sonucunu ve genel oluşturma durumunu görüntüler. Kurulum hataları veya istisnalar görüntülenmez.

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

Yumuşak filtre - Her bir birim test adını ve sonucunu ve kurulum hatalarını / istisnalarını görüntüleyin. Ancak bazı alakasız bilgiler de içerir:

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

Yumuşak filtre, Alternatif sözdizimi: (arama simgeleri tek tek dizelere ayrılır)

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

Nasıl çalıştığının açıklaması: İlk komutun çıktısı, normal bir ifadeye dayalı olarak istenmeyen birçok satırı filtreleyecek olan ./gradlew test -iikinci bir komuta gönderilir grep. "-E"normal ifade modunu etkinleştirir ve "|""veya" anlamına gelir. Bir birim test adının ve sonucunun kullanılarak görüntülenmesine izin verilir " > "ve genel durum ile birlikte izin verilir "BUILD". Yumuşak filtrede, "-v"bayrak "içermiyor" ve "^""satır başlangıcı " anlamına gelir. Böylece "Yürütme" ile başlayan veya "Oluşturma" vb. İle başlayan tüm satırları çıkarır.


Gradle 5.1 ile Android enstrümantasyon ünitesi testleri için örnek:

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

4.10 dereceli Jacoco birim testi kapsamı örneği:

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

0

Eğer bir varsa build.gradle.ktsyazılmış Kotlin DSL (Ben hayır "java" ile, bir KOTLIN çok platformlu bir proje geliştiriyordu uygulanan eklentisi) ile test sonuçlarını yazdırabilirsiniz:

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

Sadece build.gradle dosyasına aşağıdaki kapağı ekleyin. çıktı her testin yürütülmesinden sonra yazdırılacaktır.

test{
    useJUnitPlatform()
    afterTest { desc, result ->
        def output = "Class name: ${desc.className}, Test name: ${desc.name},  (Test status: ${result.resultType})"
        println( '\n' + output)
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.