Skip to content
This repository was archived by the owner on Nov 10, 2023. It is now read-only.

Commit ea66748

Browse files
authored
Use original JUnit test class name instead of suite class in test XML report (#2625)
* Use original JUnit test class name instead of suite class in test XML report * Correct expected/actual assertion order
1 parent 577c273 commit ea66748

6 files changed

Lines changed: 79 additions & 28 deletions

File tree

src/com/facebook/buck/jvm/java/JavaTest.java

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
import java.util.SortedSet;
8484
import java.util.concurrent.Callable;
8585
import java.util.logging.Level;
86+
import java.util.stream.Collectors;
8687
import java.util.stream.Stream;
8788
import javax.annotation.Nullable;
8889

@@ -393,10 +394,11 @@ public Path getPathToTestOutputDirectory() {
393394
/** @return a test case result, named "main", signifying a failure of the entire test class. */
394395
private TestCaseSummary getTestClassFailedSummary(String testClass, String message, long time) {
395396
return new TestCaseSummary(
396-
testClass,
397-
ImmutableList.of(
398-
new TestResultSummary(
399-
testClass, "main", ResultType.FAILURE, time, message, "", "", "")));
397+
testClass,
398+
false,
399+
ImmutableList.of(
400+
new TestResultSummary(
401+
testClass, "main", ResultType.FAILURE, time, message, "", "", "")));
400402
}
401403

402404
@Override
@@ -444,7 +446,12 @@ public Callable<TestResults> interpretTestResults(
444446
// definitively say whether or not a class should be run. It's not possible, for example,
445447
// to filter testClassNames here at the buck end.
446448
} else if (Files.isRegularFile(testResultFile)) {
447-
summaries.add(XmlTestResultParser.parse(testResultFile));
449+
TestCaseSummary summary = XmlTestResultParser.parse(testResultFile);
450+
if (summary.isTestSuite()) {
451+
summaries.addAll(unrollTestSuiteSummary(summary));
452+
} else {
453+
summaries.add(summary);
454+
}
448455
}
449456
}
450457

@@ -615,6 +622,15 @@ protected ImmutableSet<Path> getRuntimeClasspath(BuildContext buildContext) {
615622
.build();
616623
}
617624

625+
private List<TestCaseSummary> unrollTestSuiteSummary(TestCaseSummary summary) {
626+
Map<String, List<TestResultSummary>> summariesByActualTestCase = summary.getTestResults()
627+
.stream().collect(Collectors.groupingBy(TestResultSummary::getTestCaseName));
628+
629+
return summariesByActualTestCase.entrySet().stream()
630+
.map(entry -> new TestCaseSummary(entry.getKey(), false, entry.getValue()))
631+
.collect(Collectors.toList());
632+
}
633+
618634
public interface AdditionalClasspathEntriesProvider {
619635
ImmutableList<Path> getAdditionalClasspathEntries(SourcePathResolverAdapter resolver);
620636
}

src/com/facebook/buck/test/TestCaseSummary.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public class TestCaseSummary implements TestCaseSummaryExternalInterface<TestRes
2929
private static final int MAX_STATUS_WIDTH = 7;
3030

3131
private final String testCaseName;
32+
private final boolean testSuite;
3233
private final ImmutableList<TestResultSummary> testResults;
3334
private final boolean isDryRun;
3435
private final boolean hasAssumptionViolations;
@@ -38,7 +39,15 @@ public class TestCaseSummary implements TestCaseSummaryExternalInterface<TestRes
3839
private final long totalTime;
3940

4041
public TestCaseSummary(String testCaseName, List<TestResultSummary> testResults) {
42+
this(testCaseName, false, testResults);
43+
}
44+
45+
public TestCaseSummary(
46+
String testCaseName,
47+
boolean testSuite,
48+
List<TestResultSummary> testResults) {
4149
this.testCaseName = testCaseName;
50+
this.testSuite = testSuite;
4251
this.testResults = ImmutableList.copyOf(testResults);
4352

4453
boolean isDryRun = false;
@@ -110,6 +119,11 @@ public long getTotalTime() {
110119
return totalTime;
111120
}
112121

122+
/** @return whether this summary represents a suite of tests or a single class */
123+
public boolean isTestSuite() {
124+
return testSuite;
125+
}
126+
113127
/** @return a one-line, printable summary */
114128
public String getOneLineSummary(Locale locale, boolean hasPassingDependencies, Ansi ansi) {
115129
String statusText;

src/com/facebook/buck/test/XmlTestResultParser.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ private static TestCaseSummary doParse(String xml) throws IOException, SAXExcept
139139
Element root = doc.getDocumentElement();
140140
Preconditions.checkState("testcase".equals(root.getTagName()));
141141
String testCaseName = root.getAttribute("name");
142+
boolean testSuite = false;
142143

143144
NodeList testElements = doc.getElementsByTagName("test");
144145
List<TestResultSummary> testResults = Lists.newArrayListWithCapacity(testElements.getLength());
@@ -176,13 +177,20 @@ private static TestCaseSummary doParse(String xml) throws IOException, SAXExcept
176177
stdErr = null;
177178
}
178179

180+
String actualTestCaseName = node.getAttribute("suite");
181+
if (actualTestCaseName != null && !actualTestCaseName.isEmpty()) {
182+
testSuite |= !actualTestCaseName.equals(testCaseName);
183+
} else {
184+
actualTestCaseName = testCaseName;
185+
}
186+
179187
TestResultSummary testResult =
180188
new TestResultSummary(
181-
testCaseName, testName, type, time, message, stacktrace, stdOut, stdErr);
189+
actualTestCaseName, testName, type, time, message, stacktrace, stdOut, stdErr);
182190
testResults.add(testResult);
183191
}
184192

185-
return new TestCaseSummary(testCaseName, testResults);
193+
return new TestCaseSummary(testCaseName, testSuite, testResults);
186194
}
187195

188196
private static String createDetailedExceptionMessage(Path xmlFile, String xmlFileContents) {

test/com/facebook/buck/cli/TestRunningTest.java

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -312,44 +312,45 @@ public void testXmlGeneration() throws Exception {
312312

313313
// Check for exactly one <tests> tag.
314314
NodeList testsList = doc.getElementsByTagName("tests");
315-
assertEquals(testsList.getLength(), 1);
315+
assertEquals(1, testsList.getLength());
316316

317317
// Check for exactly one <test> tag.
318318
Element testsEl = (Element) testsList.item(0);
319319
NodeList testList = testsEl.getElementsByTagName("test");
320-
assertEquals(testList.getLength(), 1);
320+
assertEquals(1, testList.getLength());
321321

322322
// Check the target has been set
323323
Element testEl = (Element) testList.item(0);
324-
assertEquals(testEl.getAttribute("target"), "//foo/bar:baz");
324+
assertEquals("//foo/bar:baz", testEl.getAttribute("target"));
325+
326+
assertEquals("TestCase", testEl.getAttribute("name"));
325327

326328
// Check for exactly three <testresult> tags.
327329
// There should be two failures and one success.
328330
NodeList resultsList = testEl.getElementsByTagName("testresult");
329-
assertEquals(resultsList.getLength(), 3);
331+
assertEquals(3, resultsList.getLength());
330332

331333
// Verify the text elements of the first <testresult> tag.
332334
Element passResultEl = (Element) resultsList.item(0);
333-
assertEquals(passResultEl.getAttribute("name"), "passTest");
334-
assertEquals(passResultEl.getAttribute("time"), "5000");
335-
assertEquals(passResultEl.getAttribute("status"), "PASS");
335+
assertEquals("passTest", passResultEl.getAttribute("name"));
336+
assertEquals("5000", passResultEl.getAttribute("time"));
337+
assertEquals("PASS", passResultEl.getAttribute("status"));
336338
checkXmlTextContents(passResultEl, "message", "");
337339
checkXmlTextContents(passResultEl, "stacktrace", "");
338340

339341
// Verify the text elements of the second <testresult> tag.
340-
assertEquals(testEl.getAttribute("name"), "TestCase");
341342
Element failResultEl1 = (Element) resultsList.item(1);
342-
assertEquals(failResultEl1.getAttribute("name"), "failWithMsg");
343-
assertEquals(failResultEl1.getAttribute("time"), "7000");
344-
assertEquals(failResultEl1.getAttribute("status"), "FAIL");
343+
assertEquals("failWithMsg", failResultEl1.getAttribute("name"));
344+
assertEquals("7000", failResultEl1.getAttribute("time"));
345+
assertEquals("FAIL", failResultEl1.getAttribute("status"));
345346
checkXmlTextContents(failResultEl1, "message", "Index out of bounds!");
346347
checkXmlTextContents(failResultEl1, "stacktrace", "Stacktrace");
347348

348349
// Verify the text elements of the third <testresult> tag.
349350
Element failResultEl2 = (Element) resultsList.item(2);
350-
assertEquals(failResultEl2.getAttribute("name"), "failNoMsg");
351-
assertEquals(failResultEl2.getAttribute("time"), "4000");
352-
assertEquals(failResultEl2.getAttribute("status"), "PASS");
351+
assertEquals("failNoMsg", failResultEl2.getAttribute("name"));
352+
assertEquals("4000", failResultEl2.getAttribute("time"));
353+
assertEquals("PASS", failResultEl2.getAttribute("status"));
353354
checkXmlTextContents(failResultEl2, "message", "");
354355
checkXmlTextContents(failResultEl2, "stacktrace", "");
355356
}

test/com/facebook/buck/event/EventSerializationTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -237,8 +237,8 @@ public void testTestRunEventFinished() throws IOException {
237237
String message = ObjectMappers.WRITER.writeValueAsString(event);
238238
assertJsonEquals(
239239
"{%s,"
240-
+ "\"results\":[{\"testCases\":[{\"testCaseName\":\"Test1\",\"testResults\":[{"
241-
+ "\"testCaseName\":\"Test1\",\"type\":\"FAILURE\",\"time\":0}],"
240+
+ "\"results\":[{\"testCases\":[{\"testCaseName\":\"Test1\",\"testSuite\":false,"
241+
+ "\"testResults\":[{\"testCaseName\":\"Test1\",\"type\":\"FAILURE\",\"time\":0}],"
242242
+ "\"failureCount\":1,\"skippedCount\":0,\"totalTime\":0,"
243243
+ "\"success\":false}],"
244244
+ "\"failureCount\":1,\"contacts\":[],\"labels\":[],"
@@ -324,8 +324,8 @@ public void testIndividualTestEventFinished() throws IOException {
324324
String message = ObjectMappers.WRITER.writeValueAsString(event);
325325
assertJsonEquals(
326326
"{%s,\"eventKey\":{\"value\":-594614477},"
327-
+ "\"results\":{\"testCases\":[{\"testCaseName\":\"Test1\",\"testResults\":[{"
328-
+ "\"testCaseName\":\"Test1\",\"type\":\"FAILURE\",\"time\":0}],"
327+
+ "\"results\":{\"testCases\":[{\"testCaseName\":\"Test1\",\"testSuite\":false,"
328+
+ "\"testResults\":[{\"testCaseName\":\"Test1\",\"type\":\"FAILURE\",\"time\":0}],"
329329
+ "\"failureCount\":1,\"skippedCount\":0,\"totalTime\":0,"
330330
+ "\"success\":false}],"
331331
+ "\"failureCount\":1,\"contacts\":[],\"labels\":[],"

test/com/facebook/buck/testrunner/RunWithAnnotationIntegrationTest.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,12 @@ public void testSimpleSuiteRun2TestCases() throws IOException {
5151

5252
ProcessResult suiteTestResult = workspace.runBuckCommand("test", "//:SimpleSuiteTest");
5353
suiteTestResult.assertSuccess("Test should pass");
54-
assertThat(suiteTestResult.getStderr(), containsString("2 Passed"));
54+
assertThat(
55+
suiteTestResult.getStderr(),
56+
containsString("1 Passed 0 Skipped 0 Failed com.example.Subtest1"));
57+
assertThat(
58+
suiteTestResult.getStderr(),
59+
containsString("1 Passed 0 Skipped 0 Failed com.example.Subtest2"));
5560
}
5661

5762
@Test
@@ -62,8 +67,15 @@ public void testFailingSuiteRun3TestCasesWith1Failure() throws IOException {
6267

6368
ProcessResult suiteTestResult = workspace.runBuckCommand("test", "//:FailingSuiteTest");
6469
suiteTestResult.assertTestFailure("Test should fail because of one of subtests failure");
65-
assertThat(suiteTestResult.getStderr(), containsString("2 Passed"));
66-
assertThat(suiteTestResult.getStderr(), containsString("1 Failed"));
70+
assertThat(
71+
suiteTestResult.getStderr(),
72+
containsString("1 Passed 0 Skipped 0 Failed com.example.Subtest1"));
73+
assertThat(
74+
suiteTestResult.getStderr(),
75+
containsString("1 Passed 0 Skipped 0 Failed com.example.Subtest2"));
76+
assertThat(
77+
suiteTestResult.getStderr(),
78+
containsString("0 Passed 0 Skipped 1 Failed com.example.FailingSubtest"));
6779
}
6880

6981
@Test

0 commit comments

Comments
 (0)