From 5bfa581f0ab0ae0d1260d7361f97a040684973e9 Mon Sep 17 00:00:00 2001 From: Ben Soares Date: Thu, 27 Apr 2023 12:36:15 +0100 Subject: [PATCH] JAL-4167 Added OVERALL summary to bash output --- build.gradle | 137 ++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 75 insertions(+), 62 deletions(-) diff --git a/build.gradle b/build.gradle index 3b06476..6d0eedd 100644 --- a/build.gradle +++ b/build.gradle @@ -1735,7 +1735,6 @@ run.dependsOn compileJava compileTestJava.dependsOn compileJava -ext.testsFailed = false /* testTask0 is the main test task */ task testTask0(type: Test) { group = "Verification" @@ -1802,18 +1801,9 @@ tasks.withType(Test).matching {t -> t.getName().startsWith("testTask")}.all { te if (desc.parent) return // Only summarize results for whole modules - def summary = [testTask.project.name, testTask.name, result, TimeCategory.minus(new Date(result.endTime), new Date(result.startTime)), testTask.reports.html.entryPoint] + def resultsInfo = [testTask.project.name, testTask.name, result, TimeCategory.minus(new Date(result.endTime), new Date(result.startTime)), testTask.reports.html.entryPoint] - // Add reports in `testsResults`, keep failed suites at the end - if (result.resultType == TestResult.ResultType.SUCCESS) { - rootProject.ext.testsResults.add(0, summary) - } else { - rootProject.ext.testsResults.add(summary) - } - - if (result.resultType == TestResult.ResultType.FAILURE) { - testsFailed = true - } + rootProject.ext.testsResults.add(resultsInfo) } // from original test task @@ -1849,49 +1839,67 @@ gradle.buildFinished { printResults allResults allResults.each {r -> if (r[2].resultType == TestResult.ResultType.FAILURE) - throw GradleException("Failed tests (buildFinished)!") + throw new GradleException("Failed tests!") } } } +private static String colString(styler, col, colour, text) { + return col?"${styler[colour](text)}":text +} + +private static String getSummaryLine(s, pn, tn, rt, rc, rs, rf, rsk, t, col) { + def colour = 'black' + def nocol = false + switch(rt) { + case TestResult.ResultType.SUCCESS: + colour = 'green' + break; + case TestResult.ResultType.FAILURE: + colour = 'red' + break; + default: + nocol = true + break; + } + StringBuilder sb = new StringBuilder() + sb.append("${pn}") + if (tn != null) + sb.append(":${tn}") + sb.append(" results: ") + sb.append(colString(s, col && !nocol, colour, rt)) + sb.append(" (") + sb.append("${rc} tests, ") + sb.append(colString(s, col && rs > 0, 'green', rs)) + sb.append(" successes, ") + sb.append(colString(s, col && rf > 0, 'red', rf)) + sb.append(" failures, ") + sb.append("${rsk} skipped) in ${t}") + return sb.toString() +} + private static void printResults(allResults) { + // styler from https://stackoverflow.com/a/56139852 def styler = 'black red green yellow blue magenta cyan white'.split().toList().withIndex(30).collectEntries { key, val -> [(key) : { "\033[${val}m${it}\033[0m" }] } def maxLength = 0 def failedTests = false def summaryLines = [] - allResults.each { + def totalcount = 0 + def totalsuccess = 0 + def totalfail = 0 + def totalskip = 0 + def totaltime = TimeCategory.getSeconds(0) + // sort on project name then task name + allResults.sort {a, b -> a[0] == b[0]? a[1]<=>b[1]:a[0] <=> b[0]}.each { def projectName = it[0] def taskName = it[1] def result = it[2] def time = it[3] def report = it[4] - def colour = 'black' - switch(result.resultType) { - case TestResult.ResultType.SUCCESS: - colour = 'green' - break; - case TestResult.ResultType.FAILURE: - colour = 'red' - failedTests = true - break; - default: - colour = 'yellow' - break; - } - def summaryCol = "${projectName}:${taskName} results: ${styler[colour](result.resultType)} (" + - "${result.testCount} tests, " + - (result.successfulTestCount > 0 ? "${styler['green'](result.successfulTestCount)} successes" : "${result.successfulTestCount} successes") + ", " + - (result.failedTestCount > 0 ? "${styler['red'](result.failedTestCount)} failures" : "${result.failedTestCount} failures") + ", " + - "${result.skippedTestCount} skipped" + - ") " + "in ${time}" - def summaryPlain = "${projectName}:${taskName} results: ${result.resultType} (" + - "${result.testCount} tests, " + - "${result.successfulTestCount} successes, " + - "${result.failedTestCount} failures, " + - "${result.skippedTestCount} skipped" + - ") " + "in ${time}" + def summaryCol = getSummaryLine(styler, projectName, taskName, result.resultType, result.testCount, result.successfulTestCount, result.failedTestCount, result.skippedTestCount, time, true) + def summaryPlain = getSummaryLine(styler, projectName, taskName, result.resultType, result.testCount, result.successfulTestCount, result.failedTestCount, result.skippedTestCount, time, false) def reportLine = "Report file: ${report}" def ls = summaryPlain.length() def lr = reportLine.length() @@ -1900,34 +1908,41 @@ private static void printResults(allResults) { maxLength = m def info = [ls, summaryCol, reportLine] summaryLines.add(info) + failedTests |= result.resultType == TestResult.ResultType.FAILURE + totalcount += result.testCount + totalsuccess += result.successfulTestCount + totalfail += result.failedTestCount + totalskip += result.skippedTestCount + totaltime += time + } + def totalSummaryCol = getSummaryLine(styler, "OVERALL", "", failedTests?TestResult.ResultType.FAILURE:TestResult.ResultType.SUCCESS, totalcount, totalsuccess, totalfail, totalskip, totaltime, true) + def totalSummaryPlain = getSummaryLine(styler, "OVERALL", "", failedTests?TestResult.ResultType.FAILURE:TestResult.ResultType.SUCCESS, totalcount, totalsuccess, totalfail, totalskip, totaltime, false) + def tls = totalSummaryPlain.length() + if (tls > maxLength) + maxLength = tls + def info = [tls, totalSummaryCol, null] + summaryLines.add(info) + + def allSummaries = [] + for(sInfo : summaryLines) { + def ls = sInfo[0] + def summary = sInfo[1] + def report = sInfo[2] + + StringBuilder sb = new StringBuilder() + sb.append("│" + summary + " " * (maxLength - ls) + "│") + if (report != null) { + sb.append("\n│" + report + " " * (maxLength - report.length()) + "│") + } + allSummaries += sb.toString() } println "┌${"${"─" * maxLength}"}┐" - - println summaryLines.collect {info -> - def ls = info[0] - def summary = info[1] - def report = info[2] - - return "│" + summary + " " * (maxLength - ls) + "│" + "\n" + - "│" + report + " " * (maxLength - report.length()) + "│" - - }.join("\n├${"${"─" * maxLength}"}┤\n") - + println allSummaries.join("\n├${"${"─" * maxLength}"}┤\n") println "└${"${"─" * maxLength}"}┘" } /* END of test tasks results summary */ -task verifyTestStatus { - group = "Verification" - description = "Task that FAILs the build if any tests failed" - doLast { - if (testsFailed) { - throw new GradleException("There were failing tests!") - } - } -} - test { // from original test task if (useClover) { @@ -1936,8 +1951,6 @@ test { dependsOn testClasses } dependsOn tasks.withType(Test).matching {t -> t.getName().startsWith("testTask")} - finalizedBy verifyTestStatus - // not running tests in this task exclude "**/*" -- 1.7.10.2