Lớp: Làm thế nào để hiển thị kết quả kiểm tra trong bảng điều khiển trong thời gian thực?


231

Tôi muốn xem kết quả kiểm tra (system.out / err, thông báo nhật ký từ các thành phần đang được kiểm tra) khi chúng chạy trong cùng bảng điều khiển tôi chạy:

gradle test

Và không đợi cho đến khi các thử nghiệm được thực hiện để xem xét các báo cáo thử nghiệm (chỉ được tạo khi các thử nghiệm được hoàn thành, vì vậy tôi không thể "cắt đuôi" bất cứ điều gì trong khi các thử nghiệm đang chạy)

Câu trả lời:


169

Bạn có thể chạy Gradle với mức ghi nhật ký INFO trên dòng lệnh. Nó sẽ cho bạn thấy kết quả của mỗi bài kiểm tra trong khi chúng đang chạy. Nhược điểm là bạn sẽ nhận được nhiều đầu ra hơn cho các nhiệm vụ khác.

gradle test -i

13
Với 1.0 cột mốc 6, Gradle DSL bây giờ cho phép bạn định cấu hình trực tiếp bằng testLogging.showSt ChuẩnStreams = true trong bao testđóng.
Benjamin Muschko

4
Điều này không hoạt động trong lớp 1.11. Tôi nhận được rất nhiều đầu ra gỡ lỗi, nhưng không phải là kết quả thử nghiệm riêng lẻ.
David Moles

44
Điều đó -isẽ ném một loạt các infos không liên quan trên thiết bị đầu cuối.
Thủy Trinh

9
Ngoài rất nhiều đầu ra vô dụng, không có gì được hiển thị cho các thử nghiệm vượt qua và không tạo ra đầu ra.
cụ

1
Bạn có thể sử dụng grepđể lọc ra hàng ngàn dòng không mong muốn. Xem stackoverflow.com/questions/3963708/ Mạnh
Mr-IDE

172

Đây là phiên bản ưa thích của tôi:

kết quả kiểm tra ưa thích

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
Theo tôi, đây là câu trả lời tốt nhất ở đây. Nó chứa tập hợp tùy chọn lớn nhất và mọi người có thể định cấu hình các bài kiểm tra của họ khi họ cần.
Slav

2
@sealskej Tôi cần sao chép mã này vào đâu và làm thế nào để chạy nó từ dòng lệnh? EDIT: hiểu rồi - chỉ cần thêm nó vào gradle.config của mô-đun và chạy bình thường
hardysim

Đẹp! Tôi vừa xóa các đường ống |khỏi startItemvì chạy tác vụ qua Android Studio 2.2.3 nhận ra chúng là lỗi trong tin nhắn và điều đó gây khó chịu cho các bản dựng thành công.
madlymad

1
Và làm thế nào bạn kích hoạt màu sắc?
Durga Swaroop

1
@DurgaSwaroop Hoạt động ngoài hộp cho tôi. Vui lòng đảm bảo rằng ứng dụng đầu cuối của bạn hỗ trợ màu sắc. Cá nhân tôi sử dụng ứng dụng iTerm2.
Shubham Chaudhary

156

Bạn có thể thêm một đóng Groovy bên trong tệp build.gradle để ghi nhật ký cho bạn:

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

Trên bảng điều khiển của bạn, nó sẽ đọc như thế này:

: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

Vì phiên bản 1.1 Gradle hỗ trợ nhiều tùy chọn hơn để ghi nhật ký kiểm tra . Với các tùy chọn đó, bạn có thể đạt được đầu ra tương tự với cấu hình sau:

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

4
điều này sẽ chỉ tạo ra đầu ra sau khi thử nghiệm được thực hiện. những gì tôi đang tìm kiếm là để xem ghi nhật ký / báo cáo / hệ thống out / printlns, v.v. khi các bài kiểm tra đang chạy . nghĩ về việc thực hiện các thử nghiệm với maven hoặc chỉ trong IntelliJ / Eclipse: đầu ra được tạo ra trong thời gian thực.
Tolican

Được rồi, xin lỗi vì đã hiểu nhầm câu hỏi của bạn. Trong trường hợp đó, bạn nên xem phần sau của tài liệu Gradle: gradle.org/logging.html#sec:external_tools
stefanglase

1
Vì vậy, những thay đổi tôi thực sự thực hiện để xem đầu ra? Tôi thấy tất cả các trình nghe tùy chỉnh và nội dung trong tài liệu này, nhưng tôi không biết làm cách nào để định cấu hình này.
jpswain

118

Như stefanglase trả lời:

việc thêm đoạn mã sau vào build.gradle(kể từ phiên bản 1.1) của bạn sẽ hoạt động tốt cho đầu ra khi vượt qua , bỏ qua và thử nghiệm thất bại .

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

Điều tôi muốn nói thêm (tôi phát hiện ra đây là một vấn đề cho người mới bắt đầu) là gradle testlệnh chỉ thực hiện kiểm tra một lần cho mỗi thay đổi .

Vì vậy, nếu bạn đang chạy nó lần thứ hai, sẽ không có kết quả đầu ra nào cho kết quả kiểm tra . Bạn cũng có thể thấy điều này trong đầu ra của tòa nhà: gradle sau đó nói UP-TO-DATE trong các bài kiểm tra. Vì vậy, nó không thực hiện lần thứ n.

Học sinh thông minh!

Nếu bạn muốn buộc các trường hợp thử nghiệm chạy, sử dụng gradle cleanTest test.

Điều này hơi lạc đề nhưng tôi hy vọng nó sẽ giúp được một số người mới.

biên tập

Như sparc_s Lan đã nêu trong các ý kiến:

Nếu bạn muốn buộc lớp phải luôn chạy các bài kiểm tra mới (có thể không phải lúc nào cũng là một ý tưởng hay), bạn có thể thêm outputs.upToDateWhen {false}vào testLogging { [...] }. Tiếp tục đọc ở đây .

Sự thanh bình.


11
Này, chỉ muốn cho bạn biết tôi đã tìm ra cách để không phải nói gradle cleanTest testmỗi lần (kể từ Lớp 1.12). Thêm outputs.upToDateWhen {false}vào testLogging {...}và nên làm thủ thuật. Nó sẽ buộc Gradle chạy các bài kiểm tra mỗi lần. Tôi tìm thấy điều này trong các diễn đàn Gradle, được đăng bởi chính Dockter . Hi vọng điêu nay co ich.
sparc_siverse

Tôi bao gồm exceptionFormat "full"để có được thông tin chi tiết về những gì thất bại, hữu ích khi bạn đang sử dụng AssertJ hoặc lib tương tự.
Shairon Toledo

5
Thay vì cleanTestbạn có thể sử dụngtest --rerun-tasks
gavenkoa

2
@gavenkoa Tôi nghĩ --rerun-taskssẽ làm cho tất cả các nhiệm vụ của bạn chạy lại, không chỉ các nhiệm vụ cho các bài kiểm tra.
ThomasW

2
Trên thực tế, cleanTest testtrên Android Studio mới nhất và lớp 3.3 không hoạt động về phía tôi, nhưng --rerun-tasksđã làm được điều đó. Không biết tại sao. Nhưng đọc câu trả lời này thực sự đã giải quyết được vấn đề đau đầu của tôi, nơi đăng nhập bài kiểm tra vua sau khi tôi thêm mọi thứ.
Wingzero

111

Tuyên bố miễn trừ trách nhiệm: Tôi là nhà phát triển Plugin Gradle Test Logger.

Bạn chỉ có thể sử dụng Plugin Gradle Test Logger để in các bản ghi đẹp trên bảng điều khiển. Plugin sử dụng mặc định hợp lý để đáp ứng hầu hết người dùng với ít hoặc không có cấu hình nhưng cũng cung cấp một số chủ đề và tùy chọn cấu hình để phù hợp với tất cả mọi người.

Ví dụ

Chủ đề tiêu chuẩn Chủ đề tiêu chuẩn

Chủ đề Mocha Chủ đề Mocha

Sử dụng

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

Hãy chắc chắn rằng bạn luôn nhận được phiên bản mới nhất từ ​​Gradle Central .

Cấu hình

Bạn không cần bất kỳ cấu hình nào cả. Tuy nhiên, plugin cung cấp một vài tùy chọn. Điều này có thể được thực hiện như sau (giá trị mặc định được hiển thị):

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
}

Tôi hy vọng bạn sẽ thích sử dụng nó.


3
Đẹp! Tuyệt vời một cái gì đó đơn giản như một bản tóm tắt của các bài kiểm tra đã qua / thất bại / bỏ qua đã dẫn đến nó.
MarkHu

Tôi chỉ tích hợp plugin, nhưng tôi không thấy các bài kiểm tra thời lượng thực hiện, như trong git của bạn cho mọi bài kiểm tra trong ngoặc đơn (1.6s) Làm thế nào để kích hoạt điều đó?
dk7

@ dk7 theo mặc định chỉ các bài kiểm tra mất hơn 1 giây để chạy sẽ có thời lượng được in. Xem tài liệu để biết thêm. Nếu bạn muốn xem tất cả thời lượng, chỉ cần đặt slowThresholdthành 0.
adarshr

1
@ HaroldL.Brown Có thực sự :) Tôi chỉ là một chút đầm lầy với một vài điều hiện tại nhưng nó rất sống.
adarshr

1
Yup @VadymTyemirov. Tương tự như github.com/radarsh/gradle-test-logger-plugin/issues/137 một khi tôi ghi lại nó
adarshr

49

Thêm phần này để build.gradlengăn chặn gradle từ nuốt stdout và stderr.

test {
    testLogging.showStandardStreams = true
}

Nó được ghi lại ở đây .


38

Nhiệm vụ 'kiểm tra' không hoạt động đối với plugin Android, đối với plugin Android sử dụng như sau:

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

Xem phần sau: https://stackoverflow.com/a/3166534135321637


3
Tuyệt vời. FYI Tương lai tôi - tiết kiệm hai phút của bạn bằng cách không đặt nó trong khối Android {}
Shubham Chaudhary

18

Để theo dõi câu trả lời tuyệt vời của Shubham, tôi muốn đề xuất sử dụng các giá trị enum thay vì chuỗi . Xin hãy xem tài liệu của lớp 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

Phiên bản tối giản yêu thích của tôi dựa trên câu trả lời của Shubham Chaudhary. nhập mô tả hình ảnh ở đây

Đặt cái này trong build.gradletập tin:

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

7

Trong Gradle sử dụng plugin Android:

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

Sau đó, đầu ra sẽ là:

Thực hiện kiểm tra testConversionMinutes [org.example.app.test.DurationTest] với kết quả: THÀNH CÔNG


3

Hợp nhất câu trả lời tuyệt vời của ShubhamJJD sử dụng enum thay vì chuỗi

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
Tôi yêu cầu bạn vui lòng thêm một số bối cảnh xung quanh câu trả lời của bạn. Câu trả lời chỉ có mã hoặc liên kết là khó hiểu. Nó sẽ giúp người hỏi và người đọc tương lai cả nếu bạn có thể thêm thông tin trong bài viết của mình.
RBT

2

Tiếp theo câu trả lời của Benjamin Muschko (19 tháng 3 năm 2011), bạn có thể sử dụng -icờ cùng với grep , để lọc ra 1000 dòng không mong muốn. Ví dụ:

Bộ lọc mạnh - Chỉ hiển thị từng tên và kết quả kiểm tra đơn vị và trạng thái bản dựng tổng thể. Lỗi thiết lập hoặc ngoại lệ không được hiển thị.

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

Bộ lọc mềm - Hiển thị từng tên và kết quả kiểm tra đơn vị, cũng như các lỗi / trường hợp thiết lập. Nhưng nó cũng sẽ bao gồm một số thông tin không liên quan:

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

Bộ lọc mềm, Cú pháp thay thế: (mã thông báo tìm kiếm được chia thành các chuỗi riêng lẻ)

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

Giải thích về cách thức hoạt động của nó: Đầu ra của lệnh đầu tiên ./gradlew test -i, được chuyển sang lệnh thứ hai grep, sẽ lọc ra nhiều dòng không mong muốn dựa trên biểu thức chính quy. "-E"cho phép chế độ biểu thức chính quy và "|"có nghĩa là "hoặc". Tên và kết quả kiểm tra đơn vị được phép hiển thị bằng cách sử dụng " > "và trạng thái chung được cho phép với "BUILD". Trong bộ lọc mềm, "-v"cờ có nghĩa là "không chứa""^"có nghĩa là "bắt đầu dòng". Vì vậy, nó loại bỏ tất cả các dòng bắt đầu bằng "Thực thi" hoặc bắt đầu với "Tạo", v.v.


Ví dụ cho các bài kiểm tra đơn vị thiết bị Android, với lớp 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:"

Ví dụ cho phạm vi kiểm tra đơn vị Jacoco, với lớp 4.10:

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

0

Nếu bạn có một build.gradle.ktsvăn bản trong DSL DSL, bạn có thể in kết quả thử nghiệm (Tôi đang phát triển một dự án đa nền tảng kotlin, không áp dụng plugin "java"):

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

Chỉ cần thêm bao đóng sau đây vào build.gradle của bạn. đầu ra sẽ được in sau khi thực hiện mọi thử nghiệm.

test{
    useJUnitPlatform()
    afterTest { desc, result ->
        def output = "Class name: ${desc.className}, Test name: ${desc.name},  (Test status: ${result.resultType})"
        println( '\n' + output)
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.