/* * 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.jupiter.engine; 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 static org.junit.jupiter.api.Assertions.fail; import static org.junit.jupiter.api.DynamicTest.dynamicTest; import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass; import static org.junit.platform.engine.test.event.ExecutionEventConditions.assertRecordedExecutionEventsContainsExactly; import static org.junit.platform.engine.test.event.ExecutionEventConditions.container; import static org.junit.platform.engine.test.event.ExecutionEventConditions.dynamicTestRegistered; import static org.junit.platform.engine.test.event.ExecutionEventConditions.engine; import static org.junit.platform.engine.test.event.ExecutionEventConditions.event; import static org.junit.platform.engine.test.event.ExecutionEventConditions.finishedSuccessfully; import static org.junit.platform.engine.test.event.ExecutionEventConditions.finishedWithFailure; import static org.junit.platform.engine.test.event.ExecutionEventConditions.started; import static org.junit.platform.engine.test.event.ExecutionEventConditions.test; import static org.junit.platform.engine.test.event.TestExecutionResultConditions.message; import static org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder.request; import java.util.Arrays; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.stream.Stream; import org.junit.jupiter.api.DynamicTest; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestFactory; import org.junit.platform.engine.TestDescriptor; import org.junit.platform.engine.discovery.DiscoverySelectors; import org.junit.platform.engine.test.event.ExecutionEventRecorder; import org.junit.platform.launcher.LauncherDiscoveryRequest; /** * Integration tests for {@link TestFactory @TestFactory} and {@link DynamicTest}. * * @since 5.0 */ class DynamicTestGenerationTests extends AbstractJupiterTestEngineTests { @Test void testFactoryMethodsAreCorrectlyDiscoveredForClassSelector() { LauncherDiscoveryRequest request = request().selectors(selectClass(MyDynamicTestCase.class)).build(); TestDescriptor engineDescriptor = discoverTests(request); assertEquals(5, engineDescriptor.getDescendants().size(), "# resolved test descriptors"); } @Test void testFactoryMethodIsCorrectlyDiscoveredForMethodSelector() { LauncherDiscoveryRequest request = request().selectors( DiscoverySelectors.selectMethod(MyDynamicTestCase.class, "dynamicStream")).build(); TestDescriptor engineDescriptor = discoverTests(request); assertEquals(2, engineDescriptor.getDescendants().size(), "# resolved test descriptors"); } @Test void dynamicTestsAreExecutedFromStream() { LauncherDiscoveryRequest request = request().selectors( DiscoverySelectors.selectMethod(MyDynamicTestCase.class, "dynamicStream")).build(); ExecutionEventRecorder eventRecorder = executeTests(request); assertRecordedExecutionEventsContainsExactly(eventRecorder.getExecutionEvents(), // event(engine(), started()), // event(container(MyDynamicTestCase.class), started()), // event(container("dynamicStream"), started()), // event(dynamicTestRegistered("dynamic-test:#1")), // event(test("dynamic-test:#1", "succeedingTest"), started()), // event(test("dynamic-test:#1", "succeedingTest"), finishedSuccessfully()), // event(dynamicTestRegistered("dynamic-test:#2")), // event(test("dynamic-test:#2", "failingTest"), started()), // event(test("dynamic-test:#2", "failingTest"), finishedWithFailure(message("failing"))), // event(container("dynamicStream"), finishedSuccessfully()), // event(container(MyDynamicTestCase.class), finishedSuccessfully()), // event(engine(), finishedSuccessfully())); } @Test void dynamicTestsAreExecutedFromCollection() { LauncherDiscoveryRequest request = request().selectors( DiscoverySelectors.selectMethod(MyDynamicTestCase.class, "dynamicCollection")).build(); ExecutionEventRecorder eventRecorder = executeTests(request); assertAll( // () -> assertEquals(3, eventRecorder.getContainerStartedCount(), "# container started"), () -> assertEquals(2, eventRecorder.getDynamicTestRegisteredCount(), "# dynamic registered"), () -> assertEquals(2, eventRecorder.getTestStartedCount(), "# tests started"), () -> assertEquals(1, eventRecorder.getTestSuccessfulCount(), "# tests succeeded"), () -> assertEquals(1, eventRecorder.getTestFailedCount(), "# tests failed"), () -> assertEquals(3, eventRecorder.getContainerFinishedCount(), "# container finished")); } @Test void dynamicTestsAreExecutedFromIterator() { LauncherDiscoveryRequest request = request().selectors( DiscoverySelectors.selectMethod(MyDynamicTestCase.class, "dynamicIterator")).build(); ExecutionEventRecorder eventRecorder = executeTests(request); assertAll( // () -> assertEquals(3, eventRecorder.getContainerStartedCount(), "# container started"), () -> assertEquals(2, eventRecorder.getDynamicTestRegisteredCount(), "# dynamic registered"), () -> assertEquals(2, eventRecorder.getTestStartedCount(), "# tests started"), () -> assertEquals(1, eventRecorder.getTestSuccessfulCount(), "# tests succeeded"), () -> assertEquals(1, eventRecorder.getTestFailedCount(), "# tests failed"), () -> assertEquals(3, eventRecorder.getContainerFinishedCount(), "# container finished")); } @Test void dynamicTestsAreExecutedFromIterable() { LauncherDiscoveryRequest request = request().selectors( DiscoverySelectors.selectMethod(MyDynamicTestCase.class, "dynamicIterable")).build(); ExecutionEventRecorder eventRecorder = executeTests(request); // @TestFactory methods are counted as both container and test assertAll( // () -> assertEquals(3, eventRecorder.getContainerStartedCount(), "# container started"), () -> assertEquals(2, eventRecorder.getDynamicTestRegisteredCount(), "# dynamic registered"), () -> assertEquals(2, eventRecorder.getTestStartedCount(), "# tests started"), () -> assertEquals(1, eventRecorder.getTestSuccessfulCount(), "# tests succeeded"), () -> assertEquals(1, eventRecorder.getTestFailedCount(), "# tests failed"), () -> assertEquals(3, eventRecorder.getContainerFinishedCount(), "# container finished")); } private static class MyDynamicTestCase { private static final List<DynamicTest> list = Arrays.asList( dynamicTest("succeedingTest", () -> assertTrue(true, "succeeding")), dynamicTest("failingTest", () -> fail("failing"))); @TestFactory Collection<DynamicTest> dynamicCollection() { return list; } @TestFactory Stream<DynamicTest> dynamicStream() { return list.stream(); } @TestFactory Iterator<DynamicTest> dynamicIterator() { return list.iterator(); } @TestFactory Iterable<DynamicTest> dynamicIterable() { return this::dynamicIterator; } } }