Gradle: Comment afficher les résultats des tests dans la Console en temps réel?

je voudrais voir les résultats des tests ( système./err, les messages du journal de composants testés ) comme ils courent dans la même console, je run:

gradle test

et de ne pas attendre jusqu'à ce que les essais soient faits pour examiner les rapports d'essais ( qui ne sont générés que lorsque les essais sont terminés, de sorte que je ne peux pas "tail-f" quoi que ce soit pendant que les essais sont en cours)

153
demandé sur Grzegorz Żur 2010-10-19 01:53:13

11 réponses

vous pouvez lancer Gradle avec le niveau de journalisation de l'information sur la ligne de commande. Il vous montrera le résultat de chaque test pendant qu'ils sont en cours d'exécution. Inconvénient est que vous aurez beaucoup plus de sortie pour d'autres tâches aussi.

gradle test -i
106
répondu Benjamin Muschko 2011-03-19 14:01:17

vous pouvez ajouter une fermeture Groovy à l'intérieur de votre construction.fichier gradle qui fait la journalisation pour vous:

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

sur votre console il se lit alors comme ceci:

: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

depuis la version 1.1 Gradle soutient beaucoup plus d'options pour enregistrer la sortie de test . Avec ces options, vous pouvez obtenir une sortie similaire avec la configuration suivante:

test {
    testLogging {
        events "passed", "skipped", "failed"
    }
}
121
répondu stefanglase 2017-07-10 12:28:25

voici ma version Fantaisie:

fancy test result

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))
            }
        }
    }
}
103
répondu Shubham Chaudhary 2017-09-23 10:19:08

Comme stefanglase "151980920 répondit:

ajouter le code suivant à votre build.gradle (depuis la version 1.1) fonctionne bien pour la sortie sur passé , sauté et échec tests.

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

ce que je veux dire en plus (j'ai découvert que c'est un problème pour les débutants) est que la commande gradle test exécute le test un seul heure par changement .

ainsi si vous l'exécutez la deuxième fois il n'y aura pas de sortie sur les résultats d'essai . Vous pouvez également le voir dans la sortie du bâtiment: gradle dit alors à jour sur les tests. Ce n'est donc pas la première fois qu'il est exécuté.

Smart Grad!

si vous voulez forcer les cas de test à s'exécuter, utilisez gradle cleanTest test .

c'est légèrement hors sujet mais J'espère que ça aidera certains débutants.

modifier

Comme sparc_spread , a indiqué dans les commentaires:

si vous voulez forcer gradle à toujours exécuter des tests frais (ce qui pourrait ne pas toujours être une bonne idée), vous pouvez ajouter outputs.upToDateWhen {false} à testLogging { [...] } . Continuer la lecture ici .

de la Paix.

85
répondu Langusten Gustel 2016-03-24 11:00:22

ajouter à build.gradle pour empêcher gradle d'avaler stdout et stderr.

test {
    testLogging.showStandardStreams = true
}

c'est documenté ici .

42
répondu Darwin 2016-03-24 11:00:03

clause de non-responsabilité: je suis le développeur du Plugin Gradle test Logger.

vous pouvez utiliser le Gradle test Logger Plugin pour imprimer de belles logs sur la console. Le plugin offre un certain nombre de thèmes et d'options de configuration pour convenir à un large public.

Note: Gradle test Logger Plugin V1.4+ supporte maintenant aussi l'exécution de test en parallèle. Utilisez simplement un thème approprié .

exemples

Standard Theme Thème Standard

Mocha Theme Mocha thème

Utilisation

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

assurez-vous que vous obtenez toujours la dernière version de Gradle Central .

Configuration

vous n'avez besoin d'aucune configuration. Cependant, le plugin offre quelques options. Ceci peut être fait comme suit (valeurs par défaut affichées):

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 1000

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

j'espère que vous aimerez l'utiliser.

32
répondu adarshr 2018-09-17 08:02:00

"test" tâche de ne pas travailler pour Android plugin, pour Android plugin utilise le suivant:

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

voir le texte suivant: https://stackoverflow.com/a/31665341/3521637

31
répondu user3521637 2017-05-23 10:31:36

comme suite à la grande réponse de Shubham j'aime suggérer d'utiliser enum valeurs au lieu de cordes . Veuillez consulter la documentation de la classe .

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
    }
}
17
répondu JJD 2017-05-23 12:10:43

en Gradle utilisant Android plugin:

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

alors la sortie sera:

l'Exécution de test testConversionMinutes [org.exemple.App.test.DurationTest] avec résultat: succès

7
répondu radeklos 2016-03-24 10:58:48

ma version minimaliste préférée basée sur la réponse de Shubham Chaudhary. enter image description here

Mettre cela en build.gradle fichier:

test {
    afterSuite { desc, result ->
    if (!desc.parent)
        println("${result.resultType} " +
            "(${result.testCount} tests, " +
            "${result.successfulTestCount} successes, " +
            "${result.failedTestCount} failures, " +
            "${result.skippedTestCount} skipped)")
    }
}
6
répondu Hoto 2017-05-31 15:16:19

Fusion Shubham de la grande réponse et JJD utiliser enum au lieu de 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))
           }
       }
   }
}
3
répondu odemolliens 2017-05-23 12:18:23