ग्रेड: वास्तविक समय में कंसोल में परीक्षा परिणाम कैसे प्रदर्शित करें?


231

मैं परीक्षा परिणाम देखना चाहता हूं (system.out / इरेट, घटकों से परीक्षण किए गए संदेशों को लॉग करें) क्योंकि वे उसी कंसोल में चलते हैं जो मैं चलाता हूं:

gradle test

और तब तक इंतजार न करें जब तक कि परीक्षण रिपोर्ट देखने के लिए परीक्षण न किए जाएं (जो कि परीक्षण पूरा होने पर ही उत्पन्न होते हैं, इसलिए मैं परीक्षण के दौरान कुछ भी "पूंछ-एफ" नहीं कर सकता)

जवाबों:


169

आप कमांड लाइन पर INFO लॉगिंग स्तर के साथ ग्रैडल चला सकते हैं। जब वे चल रहे हों तो यह आपको प्रत्येक परीक्षा का परिणाम दिखाएगा। नकारात्मक पक्ष यह है कि आपको अन्य कार्यों के लिए भी अधिक आउटपुट मिलेगा।

gradle test -i

13
1.0-मील के पत्थर 6 के साथ ग्रैडल डीएसएल अब आप इसे कॉन्फ़िगर करते हैं कि सीधे testLogging.showStandardStreams =test बंद के भीतर सच का उपयोग कर ।
बेंजामिन मुश्को

4
यह 1.11 में वर्गीकृत नहीं है। मुझे बहुत डिबग आउटपुट मिलता है, लेकिन व्यक्तिगत परीक्षा परिणाम नहीं।
डेविड मोल्स

44
यह -iटर्मिनल पर अप्रासंगिक infos का एक गुच्छा फेंक देगा।
थू त्रिनह

9
बहुत सारे बेकार आउटपुट के अलावा, एक परीक्षण के लिए कुछ भी प्रदर्शित नहीं किया जाता है जो कोई आउटपुट नहीं देता है।
टूलबार

1
आप grepहजारों अवांछित लाइनों को छानने के लिए उपयोग कर सकते हैं । देखें stackoverflow.com/questions/3963708/...
श्री-आईडीई

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
@ सील्सकेज मुझे इस कोड को कहां कॉपी करना है और इसे कमांड लाइन से कैसे चलाना है? संपादित करें: यह मिल गया - बस इसे मॉड्यूल के gradle.config में जोड़ दें और सामान्य रूप से चलाएं
हार्डविम

अच्छा! मैंने सिर्फ एंड्रॉइड स्टूडियो 2.2.3 के माध्यम से कार्य चलाने |के startItemकारण पाइपों को हटा दिया और उन्हें संदेशों में त्रुटियों के रूप में पहचाना और यह सफलता के आधार पर कष्टप्रद था।
शाम

1
और आपने रंगों को कैसे सक्षम किया?
दुर्गा स्वरूप

1
@ दुर्गास्वरुप मेरे लिए बॉक्स से बाहर काम करती है। कृपया सुनिश्चित करें कि आपका टर्मिनल एप्लिकेशन रंगों का समर्थन करता है। मैं व्यक्तिगत रूप से iTerm2 ऐप का उपयोग करता हूं।
शुभम चौधरी

156

आप अपनी बिल्ड.ग्रेड फ़ाइल के अंदर एक ग्रूवी क्लोजर जोड़ सकते हैं जो आपके लिए लॉगिंग करता है:

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 के बाद से ग्रैड टेस्ट आउटपुट लॉग करने के लिए बहुत अधिक विकल्पों का समर्थन करता है । हाथ में उन विकल्पों के साथ आप निम्न कॉन्फ़िगरेशन के साथ एक समान आउटपुट प्राप्त कर सकते हैं:

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

4
परीक्षण निष्पादित होने के बाद यह केवल आउटपुट का उत्पादन करेगा । मैं जो देख रहा हूं वह लॉगिंग / रिपोर्टिंग / सिस्टम बहिष्कार / प्रिंटलैन्स आदि को देखना है। जैसे कि परीक्षण चल रहे हैं । मावेन के साथ या सिर्फ इंटेलीज / एक्लिप्स में परीक्षण निष्पादित करने के बारे में सोचें: आउटपुट वास्तविक समय में निर्मित होता है।
टोलिशस

ठीक है, आपके प्रश्न को गलत समझने के लिए क्षमा करें। उस स्थिति के लिए, आपको ग्रैडल
stefanglase

1
तो आउटपुट को देखने के लिए मुझे वास्तव में क्या परिवर्तन करना है? मैं इन सभी कस्टम श्रोताओं और दस्तावेज़ों में सामान देखता हूं, लेकिन मुझे नहीं पता कि इसे कैसे कॉन्फ़िगर किया जाए।
jpswain

118

स्टेफंगल के रूप में उत्तर दिया:

निम्न कोड को अपने build.gradle(1.1 संस्करण के बाद से) उत्तीर्ण , स्किप किए गए और असफल परीक्षणों पर आउटपुट के लिए ठीक काम करता है ।

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

मैं इसके अतिरिक्त क्या कहना चाहता हूं (मुझे पता चला कि यह शुरुआत के लिए एक समस्या है) यह है कि gradle testकमांड परीक्षण को केवल एक बार बदलने से पहले निष्पादित करता है

इसलिए यदि आप इसे दूसरी बार चला रहे हैं तो परीक्षण के परिणामों पर कोई आउटपुट नहीं होगा । आप इसे बिल्डिंग आउटपुट में भी देख सकते हैं: फिर टेस्ट पर यूपी-टू- डेट कहते हैं । इसलिए इसका n-th समय निष्पादित नहीं हुआ।

स्मार्ट ग्रेडल!

यदि आप परीक्षण मामलों को चलाने, उपयोग करने के लिए बाध्य करना चाहते हैं gradle cleanTest test

यह विषय से थोड़ा हटकर है, लेकिन मुझे उम्मीद है कि यह कुछ newbies की मदद करेगा।

संपादित करें

जैसा कि स्पार्क_स्प्रेड ने टिप्पणियों में कहा है:

आप के लिए Gradle मजबूर करने के लिए चाहते हैं, तो हमेशा चलने वाला ताजा परीक्षण आप जोड़ सकते हैं (जो हमेशा एक अच्छा विचार हो नहीं हो सकता है) outputs.upToDateWhen {false}करने के लिए testLogging { [...] }यहाँ पढ़ना जारी रखें

शांति।


11
अरे, बस आपको बता देना चाहता हूं कि मुझे gradle cleanTest testहर बार कहने का एक तरीका नहीं मिला (जैसे कि ग्रेडेल 1.12)। जोड़े outputs.upToDateWhen {false}को testLogging {...}और है कि चाल करना चाहिए। यह ग्रैडल को हर बार परीक्षण चलाने के लिए मजबूर करेगा। मुझे यह ग्रैडल मंचों में मिला , जिसे खुद डॉटर ने पोस्ट किया था । उम्मीद है की यह मदद करेगा।
स्पार्क_स्प्रेड

exceptionFormat "full"जब आप AssertJ या इसी तरह के lib का उपयोग कर रहे हों, तो क्या हुआ, इस बारे में विवरण प्राप्त करना उपयोगी होगा।
शिरॉन टोलेडो

5
इसके बजाय cleanTestआप उपयोग कर सकते हैंtest --rerun-tasks
गावेंको

2
@gavenkoa मुझे लगता है कि --rerun-tasksआपके सभी कार्यों को फिर से किया जाएगा, न कि केवल परीक्षणों के लिए कार्य।
थॉमस डब्ल्यू

2
वास्तव में, cleanTest testनवीनतम एंड्रॉइड स्टूडियो और ग्रेडल 3.3 पर मेरी तरफ से काम नहीं किया जा रहा है, लेकिन --rerun-tasksयह चाल है। पता नहीं क्यों। लेकिन इस जवाब को पढ़ने से वास्तव में मेरे सिर दर्द का समाधान हो गया, जहां मैं हर चीज को जोड़ने के बाद च ** राजा परीक्षण लॉगिंग करता हूं।
विंग्जेरो

111

डिस्क्लेमर: मैं ग्रेड टेस्ट लॉगर प्लगिन का डेवलपर हूं।

आप बस का उपयोग कर सकते हैं कंसोल पर सुंदर लॉग को मुद्रित करने के ग्रेड टेस्ट लॉगर प्लगइन का । प्लगइन बहुत कम या बिना कॉन्फ़िगरेशन वाले अधिकांश उपयोगकर्ताओं को संतुष्ट करने के लिए समझदार चूक का उपयोग करता है, लेकिन सभी के अनुरूप कई थीम और कॉन्फ़िगरेशन विकल्प भी प्रदान करता है।

उदाहरण

मानक थीम मानक विषय

मोचा थीम मोचा विषय

प्रयोग

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

सुनिश्चित करें कि आप हमेशा ग्रेड सेंट्रल से नवीनतम संस्करण प्राप्त करें

विन्यास

आपको किसी भी विन्यास की आवश्यकता नहीं है। हालाँकि, प्लगइन कुछ विकल्प प्रदान करता है। यह निम्नानुसार किया जा सकता है (डिफ़ॉल्ट मान दिखाए गए हैं):

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

मैं सिर्फ प्लगइन को एकीकृत करता हूं, लेकिन मैं अवधि परीक्षण नहीं देख रहा हूं, जैसे कि कोष्ठक (1.6s) में हर परीक्षण के लिए आपके गिट में कैसे सक्षम करें?
dk7

@ dk7 डिफ़ॉल्ट रूप से केवल 1 सेकंड से अधिक समय तक चलने वाले परीक्षणों में मुद्रित अवधि होगी। अधिक जानकारी के लिए दस्तावेज़ देखें । यदि आप सभी अवधि देखना चाहते हैं, तो बस सेट slowThresholdकरें 0
adarshr

1
@ HaroldL.Brown हां वास्तव में :) मैं अभी कुछ चीजों के साथ थोड़ा बदली हूं, लेकिन यह बहुत ज्यादा जीवित है।
आराध्य

1
यप @VadymTyemirov। एक बार जब मैं इसे 🙂 दस्तावेज करूँगा तो github.com/radarsh/gradle-test-logger-plugin/issues/137 के रूप में rad
adarshr

49

build.gradleस्टैडआउट और स्टडर को निगलने से रोकने के लिए इसे जोड़ें ।

test {
    testLogging.showStandardStreams = true
}

यह यहाँ प्रलेखित है


38

एंड्रॉइड प्लगइन के लिए 'परीक्षण' कार्य काम नहीं करता है, एंड्रॉइड प्लगइन के लिए निम्नलिखित का उपयोग करें:

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

निम्नलिखित देखें: https://stackoverflow.com/a/31665341/3521637


3
बहुत बढ़िया। FYI करें मुझे भविष्य - Android के अंदर न रखकर अपने दो मिनट बचाएं {} block
शुभम चौधरी

18

शुभम के महान जवाब के अनुवर्ती के रूप में मुझे स्ट्रिंग्स के बजाय एनम मूल्यों का उपयोग करने का सुझाव देना पसंद है । कृपया 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

शुभम चौधरी जवाब पर आधारित मेरा पसंदीदा न्यूनतर संस्करण। यहां छवि विवरण दर्ज करें

इसे 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

एंड्रॉइड प्लगइन का उपयोग करके ग्रेड में:

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

तब उत्पादन होगा:

परिणाम परीक्षण के साथ परीक्षण कर रहे हैंसंक्रमण: [org.example.app.test.DurationTest] परिणाम के साथ: सफलता


3

के मर्ज शुभम के महान जवाब और स्ट्रिंग के बजाय JJD उपयोग 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
मैं आपसे अनुरोध करता हूं कि कृपया अपने उत्तर के आसपास कुछ और संदर्भ जोड़ दें। कोड-ओनली या लिंक-ओनली उत्तर समझना मुश्किल है। यह पूछने वाले और भविष्य के पाठकों दोनों की मदद करेगा यदि आप अपनी पोस्ट में अधिक जानकारी जोड़ सकते हैं।
RBT

2

से इसे जारी रखते हुए बेंजामिन Muschko के जवाब (19 मार्च 2011), आप उपयोग कर सकते हैं -iके साथ ध्वज ग्रेप अवांछित लाइनों के 1000s को फ़िल्टर करने,। उदाहरण:

मजबूत फ़िल्टर - केवल प्रत्येक इकाई परीक्षण नाम और परिणाम, और समग्र बिल्ड स्थिति प्रदर्शित करते हैं। सेटअप त्रुटियाँ या अपवाद प्रदर्शित नहीं होते हैं।

./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"ध्वज का अर्थ है "युक्त नहीं" और "^"जिसका अर्थ है "लाइन की शुरुआत"। तो यह उन सभी लाइनों को हटा देता है जो "निष्पादन" से शुरू होती हैं या "बनाना" से शुरू होती हैं, आदि।


एंड्रॉइड इंस्ट्रूमेंटेशन यूनिट परीक्षणों के लिए उदाहरण, ग्रेडल 5.1 के साथ:

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

४.१० के साथ जैकोको यूनिट टेस्ट कवरेज के लिए उदाहरण:

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

0

यदि आपके पास कोटलिन डीएसएलbuild.gradle.kts में लिखा गया है, तो आप परीक्षण परिणाम प्रिंट कर सकते हैं (मैं कोटलिन मल्टी-प्लेटफॉर्म प्रोजेक्ट विकसित कर रहा था, जिसमें कोई "जावा" प्लगइन लागू नहीं है):

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)")
        }
    }))
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.