/* * Copyright 2015-2017 the original author or authors. * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which * accompanies this distribution and is available at * * http://www.eclipse.org/legal/epl-v10.html */ package org.junit.platform.launcher.listener; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Collections; import java.util.List; import java.util.Optional; import org.junit.jupiter.api.Test; import org.junit.platform.engine.TestExecutionResult; import org.junit.platform.engine.TestSource; import org.junit.platform.engine.UniqueId; import org.junit.platform.engine.support.descriptor.ClassSource; import org.junit.platform.engine.test.TestDescriptorStub; import org.junit.platform.launcher.TestIdentifier; import org.junit.platform.launcher.TestPlan; import org.junit.platform.launcher.listeners.SummaryGeneratingListener; import org.junit.platform.launcher.listeners.TestExecutionSummary; /** * @since 1.0 */ class SummaryGenerationTests { SummaryGeneratingListener listener = new SummaryGeneratingListener(); TestPlan testPlan = TestPlan.from(Collections.emptyList()); @Test void emptyReport() throws Exception { listener.testPlanExecutionStarted(testPlan); listener.testPlanExecutionFinished(testPlan); assertEquals(0, listener.getSummary().getTestsFailedCount()); String summaryString = summaryAsString(); assertAll("summary", // () -> assertTrue(summaryString.contains("Test run finished after"), "test run"), // () -> assertTrue(summaryString.contains("0 containers found"), "containers found"), // () -> assertTrue(summaryString.contains("0 containers skipped"), "containers skipped"), // () -> assertTrue(summaryString.contains("0 containers started"), "containers started"), // () -> assertTrue(summaryString.contains("0 containers aborted"), "containers aborted"), // () -> assertTrue(summaryString.contains("0 containers successful"), "containers successful"), // () -> assertTrue(summaryString.contains("0 containers failed"), "containers failed"), // () -> assertTrue(summaryString.contains("0 tests found"), "tests found"), // () -> assertTrue(summaryString.contains("0 tests skipped"), "tests skipped"), // () -> assertTrue(summaryString.contains("0 tests started"), "tests started"), // () -> assertTrue(summaryString.contains("0 tests aborted"), "tests aborted"), // () -> assertTrue(summaryString.contains("0 tests successful"), "tests successful"), // () -> assertTrue(summaryString.contains("0 tests failed"), "tests failed") // ); assertEquals("", failuresAsString()); } @Test void reportingCorrectCounts() throws Exception { TestIdentifier successfulContainer = createContainerIdentifier("c1"); TestIdentifier failedContainer = createContainerIdentifier("c2"); TestIdentifier abortedContainer = createContainerIdentifier("c3"); TestIdentifier skippedContainer = createContainerIdentifier("c4"); TestIdentifier successfulTest = createTestIdentifier("t1"); TestIdentifier failedTest = createTestIdentifier("t2"); TestIdentifier abortedTest = createTestIdentifier("t3"); TestIdentifier skippedTest = createTestIdentifier("t4"); listener.testPlanExecutionStarted(testPlan); listener.executionSkipped(skippedContainer, "skipped"); listener.executionSkipped(skippedTest, "skipped"); listener.executionStarted(successfulContainer); listener.executionFinished(successfulContainer, TestExecutionResult.successful()); listener.executionStarted(successfulTest); listener.executionFinished(successfulTest, TestExecutionResult.successful()); listener.executionStarted(failedContainer); listener.executionFinished(failedContainer, TestExecutionResult.failed(new RuntimeException("failed"))); listener.executionStarted(failedTest); listener.executionFinished(failedTest, TestExecutionResult.failed(new RuntimeException("failed"))); listener.executionStarted(abortedContainer); listener.executionFinished(abortedContainer, TestExecutionResult.aborted(new RuntimeException("aborted"))); listener.executionStarted(abortedTest); listener.executionFinished(abortedTest, TestExecutionResult.aborted(new RuntimeException("aborted"))); listener.testPlanExecutionFinished(testPlan); String summaryString = summaryAsString(); try { assertAll("summary", // () -> assertTrue(summaryString.contains("4 containers found"), "containers found"), // () -> assertTrue(summaryString.contains("1 containers skipped"), "containers skipped"), // () -> assertTrue(summaryString.contains("3 containers started"), "containers started"), // () -> assertTrue(summaryString.contains("1 containers aborted"), "containers aborted"), // () -> assertTrue(summaryString.contains("1 containers successful"), "containers successful"), // () -> assertTrue(summaryString.contains("1 containers failed"), "containers failed"), // () -> assertTrue(summaryString.contains("4 tests found"), "tests found"), // () -> assertTrue(summaryString.contains("1 tests skipped"), "tests skipped"), // () -> assertTrue(summaryString.contains("3 tests started"), "tests started"), // () -> assertTrue(summaryString.contains("1 tests aborted"), "tests aborted"), // () -> assertTrue(summaryString.contains("1 tests successful"), "tests successful"), // () -> assertTrue(summaryString.contains("1 tests failed"), "tests failed") // ); } catch (AssertionError error) { System.err.println(summaryString); throw error; } } @Test void canGetListOfFailures() { RuntimeException failedException = new RuntimeException("Pow!"); TestDescriptorStub testDescriptor = new TestDescriptorStub(UniqueId.root("root", "1"), "failingTest") { @Override public Optional<TestSource> getSource() { return Optional.of(new ClassSource(Object.class)); } }; TestIdentifier failingTest = TestIdentifier.from(testDescriptor); listener.testPlanExecutionStarted(testPlan); listener.executionStarted(failingTest); listener.executionFinished(failingTest, TestExecutionResult.failed(failedException)); listener.testPlanExecutionFinished(testPlan); final List<TestExecutionSummary.Failure> failures = listener.getSummary().getFailures(); assertThat(failures).hasSize(1); assertThat(failures.get(0).getException()).isEqualTo(failedException); assertThat(failures.get(0).getTestIdentifier()).isEqualTo(failingTest); } @Test void reportingCorrectFailures() throws Exception { RuntimeException failedException = new RuntimeException("failed"); TestDescriptorStub testDescriptor = new TestDescriptorStub(UniqueId.root("root", "2"), "failingTest") { @Override public Optional<TestSource> getSource() { return Optional.of(new ClassSource(Object.class)); } }; TestIdentifier failed = TestIdentifier.from(testDescriptor); TestIdentifier aborted = TestIdentifier.from(new TestDescriptorStub(UniqueId.root("root", "3"), "abortedTest")); listener.testPlanExecutionStarted(testPlan); listener.executionStarted(failed); listener.executionFinished(failed, TestExecutionResult.failed(failedException)); listener.executionStarted(aborted); listener.executionFinished(aborted, TestExecutionResult.aborted(new RuntimeException("aborted"))); listener.testPlanExecutionFinished(testPlan); // An aborted test is not a failure assertEquals(1, listener.getSummary().getTestsFailedCount()); String failuresString = failuresAsString(); assertAll("failures", // () -> assertTrue(failuresString.contains("Failures (1)"), "test failures"), // () -> assertTrue(failuresString.contains(Object.class.getName()), "source"), // () -> assertTrue(failuresString.contains("failingTest"), "display name"), // () -> assertTrue(failuresString.contains("=> " + failedException), "exception") // ); } private TestIdentifier createTestIdentifier(String uniqueId) { TestIdentifier identifier = TestIdentifier.from( new TestDescriptorStub(UniqueId.root("test", uniqueId), uniqueId)); testPlan.add(identifier); return identifier; } private TestIdentifier createContainerIdentifier(String uniqueId) { TestIdentifier identifier = TestIdentifier.from( new TestDescriptorStub(UniqueId.root("container", uniqueId), uniqueId) { @Override public Type getType() { return Type.CONTAINER; } }); testPlan.add(identifier); return identifier; } private String summaryAsString() { StringWriter summaryWriter = new StringWriter(); listener.getSummary().printTo(new PrintWriter(summaryWriter)); return summaryWriter.toString(); } private String failuresAsString() { StringWriter failuresWriter = new StringWriter(); listener.getSummary().printFailuresTo(new PrintWriter(failuresWriter)); return failuresWriter.toString(); } }