From a55d0495c80ce04537a5f0edc45d562b1a7a6d12 Mon Sep 17 00:00:00 2001 From: Adrian Baker Date: Sat, 9 Sep 2017 13:32:30 +1200 Subject: [PATCH 1/3] Skip test step execution if --dry-run is specified (#1219) --- core/src/main/java/cucumber/api/TestCase.java | 4 +-- .../src/main/java/cucumber/runner/Runner.java | 2 +- .../test/java/cucumber/api/TestCaseTest.java | 6 ++--- .../test/java/cucumber/runner/RunnerTest.java | 25 ++++++++++++++++--- 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/cucumber/api/TestCase.java b/core/src/main/java/cucumber/api/TestCase.java index ba9386f779..ca3dfaf574 100644 --- a/core/src/main/java/cucumber/api/TestCase.java +++ b/core/src/main/java/cucumber/api/TestCase.java @@ -19,8 +19,8 @@ public TestCase(List testSteps, PickleEvent pickleEvent) { this.pickleEvent = pickleEvent; } - public void run(EventBus bus) { - boolean skipNextStep = false; + public void run(EventBus bus, boolean dryRun) { + boolean skipNextStep = dryRun; Long startTime = bus.getTime(); bus.send(new TestCaseStarted(startTime, this)); ScenarioImpl scenarioResult = new ScenarioImpl(bus, pickleEvent); diff --git a/core/src/main/java/cucumber/runner/Runner.java b/core/src/main/java/cucumber/runner/Runner.java index b016554083..714f33e8a8 100644 --- a/core/src/main/java/cucumber/runner/Runner.java +++ b/core/src/main/java/cucumber/runner/Runner.java @@ -77,7 +77,7 @@ public void runUnreportedStep(String featurePath, String language, String stepNa public void runPickle(PickleEvent pickle) { buildBackendWorlds(); // Java8 step definitions will be added to the glue here TestCase testCase = createTestCaseForPickle(pickle); - testCase.run(bus); + testCase.run(bus, runtimeOptions.isDryRun()); disposeBackendWorlds(); } diff --git a/core/src/test/java/cucumber/api/TestCaseTest.java b/core/src/test/java/cucumber/api/TestCaseTest.java index b7fc26bd58..435a1d7394 100644 --- a/core/src/test/java/cucumber/api/TestCaseTest.java +++ b/core/src/test/java/cucumber/api/TestCaseTest.java @@ -33,7 +33,7 @@ public void run_wraps_execute_in_test_case_started_and_finished_events() throws when(testStep.run(eq(bus), eq(language), isA(Scenario.class), anyBoolean())).thenReturn(resultWithStatus(Result.Type.UNDEFINED)); TestCase testCase = new TestCase(Arrays.asList(testStep), pickleEvent()); - testCase.run(bus); + testCase.run(bus, false); InOrder order = inOrder(bus, testStep); order.verify(bus).send(isA(TestCaseStarted.class)); @@ -51,7 +51,7 @@ public void run_all_steps() throws Throwable { when(testStep2.run(eq(bus), eq(language), isA(Scenario.class), anyBoolean())).thenReturn(resultWithStatus(Result.Type.PASSED)); TestCase testCase = new TestCase(Arrays.asList(testStep1, testStep2), pickleEvent()); - testCase.run(bus); + testCase.run(bus, false); InOrder order = inOrder(testStep1, testStep2); order.verify(testStep1).run(eq(bus), eq(language), isA(Scenario.class), eq(false)); @@ -68,7 +68,7 @@ public void skip_steps_after_the_first_non_passed_result() throws Throwable { when(testStep2.run(eq(bus), eq(language), isA(Scenario.class), anyBoolean())).thenReturn(resultWithStatus(Result.Type.SKIPPED)); TestCase testCase = new TestCase(Arrays.asList(testStep1, testStep2), pickleEvent()); - testCase.run(bus); + testCase.run(bus, false); InOrder order = inOrder(testStep1, testStep2); order.verify(testStep1).run(eq(bus), eq(language), isA(Scenario.class), eq(false)); diff --git a/core/src/test/java/cucumber/runner/RunnerTest.java b/core/src/test/java/cucumber/runner/RunnerTest.java index 4a38ac8de9..1fde1c72b0 100644 --- a/core/src/test/java/cucumber/runner/RunnerTest.java +++ b/core/src/test/java/cucumber/runner/RunnerTest.java @@ -40,7 +40,7 @@ public class RunnerTest { private final Backend backend = mock(Backend.class); private final Runtime runtime = createRuntime(backend); private final Runner runner = runtime.getRunner(); - + @Test public void hooks_execute_when_world_exist() throws Throwable { HookDefinition beforeHook = addBeforeHook(runtime); @@ -61,7 +61,7 @@ public void steps_are_skipped_after_failure() throws Throwable { doThrow(RuntimeException.class).when(failingBeforeHook).execute(Matchers.any()); StepDefinition stepDefinition = mock(StepDefinition.class); - runner.runPickle(createPickleEventMatchingStepDefinitions(asList(stepDefinition))); + runner.runPickle(createPickleEventMatchingStepDefinitions(asList(stepDefinition), runtime)); InOrder inOrder = inOrder(failingBeforeHook, stepDefinition); inOrder.verify(failingBeforeHook).execute(Matchers.any()); @@ -83,6 +83,25 @@ public void hooks_execute_also_after_failure() throws Throwable { inOrder.verify(afterHook).execute(Matchers.any()); } + @Test + public void steps_are_not_executed_on_dry_run() throws Throwable { + // Step without dry-run flag should be executed once + { + StepDefinition stepDefinition = mock(StepDefinition.class); + Runtime runtime = createRuntime(backend); + runtime.getRunner().runPickle(createPickleEventMatchingStepDefinitions(asList(stepDefinition), runtime)); + verify(stepDefinition).execute(Matchers.anyString(), Matchers.any()); + } + + // Same step with dry-run flag should not be executred + { + StepDefinition stepDefinition = mock(StepDefinition.class); + Runtime dryRuntime = createRuntime(backend, "--dry-run"); + dryRuntime.getRunner().runPickle(createPickleEventMatchingStepDefinitions(asList(stepDefinition), dryRuntime)); + verify(stepDefinition, never()).execute(Matchers.anyString(), Matchers.any()); + } + } + @Test public void hooks_not_executed_in_dry_run_mode() throws Throwable { Runtime runtime = createRuntime(backend, "--dry-run"); @@ -141,7 +160,7 @@ private PickleEvent createEmptyPickleEvent() { return new PickleEvent("uri", new Pickle(NAME, ENGLISH, NO_STEPS, NO_TAGS, MOCK_LOCATIONS)); } - private PickleEvent createPickleEventMatchingStepDefinitions(List stepDefinitions) { + private PickleEvent createPickleEventMatchingStepDefinitions(List stepDefinitions, Runtime runtime) { List steps = new ArrayList(stepDefinitions.size()); int i = 0; for (StepDefinition stepDefinition : stepDefinitions) { From 5078bbbfc7d5517e90232b856f281836c139d5b6 Mon Sep 17 00:00:00 2001 From: Adrian Baker Date: Tue, 12 Sep 2017 21:01:00 +1200 Subject: [PATCH 2/3] Pass in dry run flag at step construction rather than runtime. --- core/src/main/java/cucumber/api/TestCase.java | 8 +++++--- core/src/main/java/cucumber/runner/Runner.java | 4 ++-- core/src/test/java/cucumber/api/TestCaseTest.java | 12 ++++++------ 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/cucumber/api/TestCase.java b/core/src/main/java/cucumber/api/TestCase.java index ca3dfaf574..0faadf9603 100644 --- a/core/src/main/java/cucumber/api/TestCase.java +++ b/core/src/main/java/cucumber/api/TestCase.java @@ -13,14 +13,16 @@ public class TestCase { private final PickleEvent pickleEvent; private final List testSteps; + private final boolean dryRun; - public TestCase(List testSteps, PickleEvent pickleEvent) { + public TestCase(List testSteps, PickleEvent pickleEvent, boolean dryRun) { this.testSteps = testSteps; this.pickleEvent = pickleEvent; + this.dryRun = dryRun; } - public void run(EventBus bus, boolean dryRun) { - boolean skipNextStep = dryRun; + public void run(EventBus bus) { + boolean skipNextStep = this.dryRun; Long startTime = bus.getTime(); bus.send(new TestCaseStarted(startTime, this)); ScenarioImpl scenarioResult = new ScenarioImpl(bus, pickleEvent); diff --git a/core/src/main/java/cucumber/runner/Runner.java b/core/src/main/java/cucumber/runner/Runner.java index 714f33e8a8..cfe75879fa 100644 --- a/core/src/main/java/cucumber/runner/Runner.java +++ b/core/src/main/java/cucumber/runner/Runner.java @@ -77,7 +77,7 @@ public void runUnreportedStep(String featurePath, String language, String stepNa public void runPickle(PickleEvent pickle) { buildBackendWorlds(); // Java8 step definitions will be added to the glue here TestCase testCase = createTestCaseForPickle(pickle); - testCase.run(bus, runtimeOptions.isDryRun()); + testCase.run(bus); disposeBackendWorlds(); } @@ -99,7 +99,7 @@ private TestCase createTestCaseForPickle(PickleEvent pickleEvent) { if (!runtimeOptions.isDryRun()) { addTestStepsForAfterHooks(testSteps, pickleEvent.pickle.getTags()); } - return new TestCase(testSteps, pickleEvent); + return new TestCase(testSteps, pickleEvent, runtimeOptions.isDryRun()); } private void addTestStepsForPickleSteps(List testSteps, PickleEvent pickleEvent) { diff --git a/core/src/test/java/cucumber/api/TestCaseTest.java b/core/src/test/java/cucumber/api/TestCaseTest.java index 435a1d7394..b148bd2914 100644 --- a/core/src/test/java/cucumber/api/TestCaseTest.java +++ b/core/src/test/java/cucumber/api/TestCaseTest.java @@ -32,8 +32,8 @@ public void run_wraps_execute_in_test_case_started_and_finished_events() throws TestStep testStep = mock(TestStep.class); when(testStep.run(eq(bus), eq(language), isA(Scenario.class), anyBoolean())).thenReturn(resultWithStatus(Result.Type.UNDEFINED)); - TestCase testCase = new TestCase(Arrays.asList(testStep), pickleEvent()); - testCase.run(bus, false); + TestCase testCase = new TestCase(Arrays.asList(testStep), pickleEvent(), false); + testCase.run(bus); InOrder order = inOrder(bus, testStep); order.verify(bus).send(isA(TestCaseStarted.class)); @@ -50,8 +50,8 @@ public void run_all_steps() throws Throwable { TestStep testStep2 = mock(TestStep.class); when(testStep2.run(eq(bus), eq(language), isA(Scenario.class), anyBoolean())).thenReturn(resultWithStatus(Result.Type.PASSED)); - TestCase testCase = new TestCase(Arrays.asList(testStep1, testStep2), pickleEvent()); - testCase.run(bus, false); + TestCase testCase = new TestCase(Arrays.asList(testStep1, testStep2), pickleEvent(), false); + testCase.run(bus); InOrder order = inOrder(testStep1, testStep2); order.verify(testStep1).run(eq(bus), eq(language), isA(Scenario.class), eq(false)); @@ -67,8 +67,8 @@ public void skip_steps_after_the_first_non_passed_result() throws Throwable { TestStep testStep2 = mock(TestStep.class); when(testStep2.run(eq(bus), eq(language), isA(Scenario.class), anyBoolean())).thenReturn(resultWithStatus(Result.Type.SKIPPED)); - TestCase testCase = new TestCase(Arrays.asList(testStep1, testStep2), pickleEvent()); - testCase.run(bus, false); + TestCase testCase = new TestCase(Arrays.asList(testStep1, testStep2), pickleEvent(), false); + testCase.run(bus); InOrder order = inOrder(testStep1, testStep2); order.verify(testStep1).run(eq(bus), eq(language), isA(Scenario.class), eq(false)); From a412da3d961a31bf5bdd57fe64ab6258831b8638 Mon Sep 17 00:00:00 2001 From: Adrian Baker Date: Tue, 12 Sep 2017 21:01:27 +1200 Subject: [PATCH 3/3] Split test in two. --- .../test/java/cucumber/runner/RunnerTest.java | 26 ++++++++----------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/core/src/test/java/cucumber/runner/RunnerTest.java b/core/src/test/java/cucumber/runner/RunnerTest.java index 1fde1c72b0..8bd36d57d3 100644 --- a/core/src/test/java/cucumber/runner/RunnerTest.java +++ b/core/src/test/java/cucumber/runner/RunnerTest.java @@ -82,24 +82,20 @@ public void hooks_execute_also_after_failure() throws Throwable { inOrder.verify(beforeHook).execute(Matchers.any()); inOrder.verify(afterHook).execute(Matchers.any()); } + + @Test + public void steps_are_executed() throws Throwable { + final StepDefinition stepDefinition = mock(StepDefinition.class); + runtime.getRunner().runPickle(createPickleEventMatchingStepDefinitions(asList(stepDefinition), runtime)); + verify(stepDefinition).execute(Matchers.anyString(), Matchers.any()); + } @Test public void steps_are_not_executed_on_dry_run() throws Throwable { - // Step without dry-run flag should be executed once - { - StepDefinition stepDefinition = mock(StepDefinition.class); - Runtime runtime = createRuntime(backend); - runtime.getRunner().runPickle(createPickleEventMatchingStepDefinitions(asList(stepDefinition), runtime)); - verify(stepDefinition).execute(Matchers.anyString(), Matchers.any()); - } - - // Same step with dry-run flag should not be executred - { - StepDefinition stepDefinition = mock(StepDefinition.class); - Runtime dryRuntime = createRuntime(backend, "--dry-run"); - dryRuntime.getRunner().runPickle(createPickleEventMatchingStepDefinitions(asList(stepDefinition), dryRuntime)); - verify(stepDefinition, never()).execute(Matchers.anyString(), Matchers.any()); - } + final StepDefinition stepDefinition = mock(StepDefinition.class); + final Runtime dryRuntime = createRuntime(backend, "--dry-run"); + dryRuntime.getRunner().runPickle(createPickleEventMatchingStepDefinitions(asList(stepDefinition), dryRuntime)); + verify(stepDefinition, never()).execute(Matchers.anyString(), Matchers.any()); } @Test