Skip to content

Commit e4e47ac

Browse files
committed
v1.0.0
simple aggregation customisable RAG status colours minor bugfix (json array)
1 parent a7b3449 commit e4e47ac

File tree

12 files changed

+175
-68
lines changed

12 files changed

+175
-68
lines changed

README.md

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,28 @@ Add or merge this to the top of your buildscript libraries via the mavenCentral
1313
mavenCentral()
1414
}
1515
dependencies {
16-
classpath 'com.kncept.junit5.reporter:junit-reporter:0.9.2-M4'
16+
classpath 'com.kncept.junit5.reporter:junit-reporter:1.0.0
1717
}
1818
}
1919

2020
Then, apply the plugin:
2121

2222
apply plugin: 'com.kncept.junit5.reporter'
2323

24-
This will bind the task 'junit5HTMLReport' to run after the 'check' task.
24+
This will bind the task 'junitHtmlReport' to run after the 'check' task.
25+
26+
If you need to do any customisation (aggregation, or you just don't like red...), Its possible to customise.
27+
Use the following config block (shown with default values):
28+
29+
junitHtmlReport {
30+
// If true, then instead of producing multiple reports per test folder (test run),
31+
// aggregate them all together into the test-reports root directory.
32+
//
33+
// Also use this if all your test results end up directly in the test-results directory
34+
aggregated = false
35+
36+
//RAG status css overrides
37+
cssRed = 'red'
38+
cssAmber = 'orange'
39+
cssGreen = 'green'
40+
}

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ sourceCompatibility = 1.8
2727
targetCompatibility = 1.8
2828

2929
group = 'com.kncept.junit5.reporter'
30-
version = '0.9.2-M4'
30+
version = '1.0.0'
3131

3232

3333
task javadocJar(type: Jar) {

src/main/java/com/kncept/junit5/reporter/gradle/TestHTMLReporterExtension.java

Lines changed: 0 additions & 18 deletions
This file was deleted.

src/main/java/com/kncept/junit5/reporter/gradle/TestHTMLReporterPlugin.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ public class TestHTMLReporterPlugin implements Plugin<Project> {
99
@Override
1010
public void apply(Project project) {
1111

12-
project.getExtensions().create("junit5HTMLReportSettings", TestHTMLReporterExtension.class);
13-
TestHTMLReporterPluginTask junit5HTMLReport = project.getTasks().create("junit5HTMLReport", TestHTMLReporterPluginTask.class);
12+
project.getExtensions().create(TestHTMLReporterSettings.settingsExtensionName, TestHTMLReporterSettings.class);
13+
TestHTMLReporterPluginTask junit5HTMLReport = project.getTasks().create("junitHtmlReport", TestHTMLReporterPluginTask.class);
1414

1515
//can throw UnknownTaskException
1616
Task test = project.getTasks().getByName("check");

src/main/java/com/kncept/junit5/reporter/gradle/TestHTMLReporterPluginTask.java

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -26,45 +26,59 @@ public TestHTMLReporterPluginTask() {
2626
@TaskAction
2727
public void generateJunitReport() throws IOException {
2828
//stub
29-
TestHTMLReporterExtension settings = (TestHTMLReporterExtension)getProject().getExtensions().getByName("junit5HTMLReportSettings");
30-
29+
TestHTMLReporterSettings settings = (TestHTMLReporterSettings)getProject().getExtensions().getByName(TestHTMLReporterSettings.settingsExtensionName);
30+
if (settings == null)
31+
settings = new TestHTMLReporterSettings(); //use defaults
3132
File buildDir = getProject().getBuildDir();
3233

3334
//junit 5: test-results/junit-platform
3435
// 1 file per execution
3536
//junit 4: test-results/test
3637
// 1 file per class
3738
//reports/tests/test
38-
39-
if (settings == null) {
40-
} else {
41-
42-
43-
for (int i = 0; i < settings.getReportDirectories().size(); i++) {
44-
Object val = settings.getReportDirectories().get(i);
45-
System.out.println(i + ": " + val.getClass().getName() + " " + val);
46-
}
47-
}
48-
39+
4940

5041
File testResultsDir = new File(buildDir, "test-results");
5142
File testReportsDir = new File(buildDir, "reports/tests");
5243

44+
TestHTMLReportWriter reporter =null;
45+
5346
for(File file: testResultsDir.listFiles()) {
54-
TestHTMLReportWriter reporter = new TestHTMLReportWriter(file.getName());
55-
for(File testFile: file.listFiles()) {
56-
if (
57-
testFile.isFile() &&
58-
testFile.getName().startsWith("TEST-") &&
59-
testFile.getName().endsWith(".xml")) {
60-
XMLTestResults restResults = readFile(testFile);
47+
if (!file.isDirectory() && !settings.isAggregated())
48+
continue;
49+
if (!settings.isAggregated())
50+
reporter = null;
51+
52+
53+
if (file.isDirectory()) {
54+
for(File testFile: file.listFiles()) {
55+
if (isXmlTestFile(testFile)) {
56+
XMLTestResults restResults = readFile(testFile);
57+
if (reporter == null)
58+
reporter = new TestHTMLReportWriter(settings.isAggregated() ? null : file.getName());
59+
reporter.include(restResults);
60+
}
61+
}
62+
if (reporter != null && !settings.isAggregated())
63+
reporter.write(testReportsDir, settings);
64+
} else if (isXmlTestFile(file) && settings.isAggregated()) {
65+
XMLTestResults restResults = readFile(file);
66+
if (reporter == null)
67+
reporter = new TestHTMLReportWriter(settings.isAggregated() ? null : file.getName());
6168
reporter.include(restResults);
6269
}
63-
}
64-
reporter.write(testReportsDir);
6570
}
71+
if (reporter != null && settings.isAggregated())
72+
reporter.write(testReportsDir, settings);
6673
}
6774

75+
public static boolean isXmlTestFile(File file) {
76+
return file.isFile() &&
77+
file.getName().startsWith("TEST-") &&
78+
file.getName().endsWith(".xml");
79+
}
80+
81+
6882
private XMLTestResults readFile(File file) throws IOException {
6983
try (InputStream in = new FileInputStream(file)) {
7084
return new Junit4DomReader(in);
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.kncept.junit5.reporter.gradle;
2+
3+
public class TestHTMLReporterSettings {
4+
public static final String settingsExtensionName = "junitHtmlReport";
5+
6+
private boolean aggregated;
7+
8+
//RAG status
9+
10+
private String cssRed = "red";
11+
private String cssAmber = "orange";
12+
private String cssGreen = "green";
13+
14+
public void setAggregated(boolean aggregated) {
15+
this.aggregated = aggregated;
16+
}
17+
18+
public boolean isAggregated() {
19+
return aggregated;
20+
}
21+
22+
public void setCssRed(String cssRed) {
23+
this.cssRed = cssRed;
24+
}
25+
26+
public String getCssRed() {
27+
return cssRed;
28+
}
29+
30+
public void setCssAmber(String cssAmber) {
31+
this.cssAmber = cssAmber;
32+
}
33+
34+
public String getCssAmber() {
35+
return cssAmber;
36+
}
37+
38+
public void setCssGreen(String cssGreen) {
39+
this.cssGreen = cssGreen;
40+
}
41+
42+
public String getCssGreen() {
43+
return cssGreen;
44+
}
45+
46+
}

src/main/java/com/kncept/junit5/reporter/html/TestHTMLReportWriter.java

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import com.kncept.junit5.reporter.domain.TestCase;
2222
import com.kncept.junit5.reporter.domain.TestCaseStatus;
23+
import com.kncept.junit5.reporter.gradle.TestHTMLReporterSettings;
2324
import com.kncept.junit5.reporter.xml.XMLTestResults;
2425

2526
public class TestHTMLReportWriter {
@@ -51,23 +52,31 @@ public void include(TestCase testcase) {
5152
testcases.add(testcase);
5253
}
5354

54-
public void write(File outputDir) throws IOException {
55+
public void write(File outputDir, TestHTMLReporterSettings settings) throws IOException {
5556
if (testcases.isEmpty())
5657
return;
5758

5859
//sort by test name
5960
Collections.sort(testcases, (t1, t2) -> {return String.CASE_INSENSITIVE_ORDER.compare(t1.getName(), t2.getName());});
6061

61-
File htmlDir = new File(outputDir, category);
62-
htmlDir.mkdirs();
62+
File htmlDir = outputDir;
63+
if (category != null) {
64+
htmlDir = new File(outputDir, category);
65+
htmlDir.mkdirs();
66+
}
6367

64-
writeDynamicData(htmlDir);
68+
writeDynamicData(htmlDir, settings);
6569
writeStaticData(htmlDir);
6670

6771
}
6872

69-
public void writeDynamicData(File htmlDir) throws IOException {
70-
try (
73+
public void writeDynamicData(File htmlDir, TestHTMLReporterSettings settings) throws IOException {
74+
writeDataJs(htmlDir);
75+
writeRagCss(htmlDir, settings);
76+
}
77+
78+
private void writeDataJs(File htmlDir) throws IOException {
79+
try (
7180
PrintStream out = new PrintStream(new FileOutputStream(new File(htmlDir, "data.js")));
7281
) {
7382

@@ -177,6 +186,28 @@ public void writeDynamicData(File htmlDir) throws IOException {
177186

178187
}
179188

189+
private void writeRagCss(File htmlDir, TestHTMLReporterSettings settings) throws IOException {
190+
try (
191+
PrintStream out = new PrintStream(new FileOutputStream(new File(htmlDir, "rag.css")));
192+
) {
193+
out.println("/*RAG status indicators*/");
194+
outputCss(out, "r", settings.getCssRed());
195+
outputCss(out, "a", settings.getCssAmber());
196+
outputCss(out, "g", settings.getCssGreen());
197+
}
198+
}
199+
200+
private void outputCss(PrintStream out, String cssClass, String colour) throws IOException {
201+
out.print(".");
202+
out.print(cssClass);
203+
out.println(" {");
204+
out.print("\tcolor: ");
205+
out.print(colour);
206+
out.println(";");
207+
out.println("\tfont-weight: bold;");
208+
out.println("}");
209+
}
210+
180211
static class SummaryBucket {
181212
public final String key;
182213
public int passed;
@@ -243,10 +274,9 @@ private String toJsNvpArray(Map<String, String> stringMap) {
243274
));
244275
if(values.hasNext()) {
245276
sb.append(",\n");
246-
} else {
247-
sb.append(" ]");
248277
}
249278
}
279+
sb.append(" ]");
250280
return sb.toString();
251281
}
252282

src/main/resources/template/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
<meta charset="UTF-8">
55
<title>Test Results</title>
66
<link rel="stylesheet" href="main.css" type="text/css" />
7+
<link rel="stylesheet" href="rag.css" type="text/css" />
78
</head>
89
<body>
910

src/main/resources/template/main.css

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,19 +30,6 @@
3030
padding-left: 100px;
3131
}
3232

33-
.r {
34-
color: red;
35-
font-weight: bold;
36-
}
37-
.a {
38-
color: orange;
39-
font-weight: bold;
40-
}
41-
.g {
42-
color: green;
43-
font-weight: bold;
44-
}
45-
4633
tr.jsonRow:hover {
4734
background-color: #EAEAEA;
4835
}

src/test/java/com/kncept/junit5/reporter/TestHTMLReporterPluginTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import static org.gradle.testfixtures.ProjectBuilder.builder;
44
import static org.junit.jupiter.api.Assertions.assertNotNull;
55

6+
import java.io.File;
7+
68
import org.gradle.api.Project;
79
import org.gradle.api.Task;
810
import org.gradle.api.plugins.JavaPlugin;
@@ -20,7 +22,7 @@ public void taskIsAppliedToProject() {
2022
project.getPlugins().apply(JavaPlugin.class);
2123
project.getPlugins().apply(TestHTMLReporterPlugin.class);
2224

23-
Task task = project.getTasks().getByName("junit5HTMLReport");
25+
Task task = project.getTasks().getByName("junitHtmlReport");
2426
assertNotNull(task);
2527
} catch (NoClassDefFoundError e) {
2628
//suppressed for Maven :(

0 commit comments

Comments
 (0)