From d31e01267d2e3075afb2c98d715fc77343286ca9 Mon Sep 17 00:00:00 2001 From: Ivan Yatskevich Date: Sun, 6 Jan 2013 17:58:13 +0300 Subject: [PATCH] Add example of running Cucumber-JVM tests using Gradle --- examples/java-gradle/README.md | 55 +++++++++++++++++++ examples/java-gradle/build.gradle | 29 ++++++++++ .../main/java/gradle/cucumber/Production.java | 9 +++ .../java/gradle/cucumber/BasicStepdefs.java | 17 ++++++ .../java/gradle/cucumber/RunCukesTest.java | 10 ++++ .../resources/gradle/cucumber/gradle.feature | 6 ++ 6 files changed, 126 insertions(+) create mode 100644 examples/java-gradle/README.md create mode 100644 examples/java-gradle/build.gradle create mode 100644 examples/java-gradle/src/main/java/gradle/cucumber/Production.java create mode 100644 examples/java-gradle/src/test/java/gradle/cucumber/BasicStepdefs.java create mode 100644 examples/java-gradle/src/test/java/gradle/cucumber/RunCukesTest.java create mode 100644 examples/java-gradle/src/test/resources/gradle/cucumber/gradle.feature diff --git a/examples/java-gradle/README.md b/examples/java-gradle/README.md new file mode 100644 index 0000000000..108b0ed083 --- /dev/null +++ b/examples/java-gradle/README.md @@ -0,0 +1,55 @@ +# Running Cucumber-JVM with step definitions in Java using Gradle `javaexec` task + +## Credits + +This work is based on [dkowis/cucumber-jvm-groovy-example](https://github.com/dkowis/cucumber-jvm-groovy-example) + +## Motivation + +There exists [a number of issues](http://gradle.1045684.n5.nabble.com/Gradle-and-cucumber-jvm-tt5710562.html) which prevent seamless integration of Cucumber-JVM and Gradle. + +## Solution + +One possible solution is to use Cucumber's `Main` class to run your tests. You can do this by using `javaexec` task in Gradle. + +## Running + +In order to run your Cucumber tests execute: + +```sh +gradle cucumber +``` + +## Caveats + +Groovy example by [David Kowis](https://github.com/dkowis) runs perfectly, but it uses Groovy step definitions. + +If you're writing your step definitions in Java then Gradle script needs to be changed slightly. + +Here are some caveats: + + * `cucumber` task has to depend on `compileTestJava` task in order to compile test sources + + ```groovy + task cucumber() { + dependsOn assemble, compileTestJava + ... + } + ``` + + + * `javaexec` classpath should include `main` and `test` output directories. + Otherwise Cucumber-JVM will not find your production classes/resources and step definitions respectively. + + ```groovy + classpath = configurations.cucumberRuntime + sourceSets.main.output + sourceSets.test.output + ``` + + * Cucumber's `--glue` should be set to your package name (e.g. `gradle.cucumber`) and **NOT** to `src/test/java` + + ```groovy + args = ['-f', 'pretty', '--glue', 'gradle.cucumber', 'src/test/resources'] + ``` + + + diff --git a/examples/java-gradle/build.gradle b/examples/java-gradle/build.gradle new file mode 100644 index 0000000000..f90f30ba2a --- /dev/null +++ b/examples/java-gradle/build.gradle @@ -0,0 +1,29 @@ +apply plugin: 'java' + +configurations { + cucumberRuntime { + extendsFrom testRuntime + } +} + +task cucumber() { + dependsOn assemble, compileTestJava + doLast { + javaexec { + main = "cucumber.api.cli.Main" + classpath = configurations.cucumberRuntime + sourceSets.main.output + sourceSets.test.output + args = ['-f', 'pretty', '--glue', 'gradle.cucumber', 'src/test/resources'] + } + } +} + +dependencies { + testCompile 'info.cukes:cucumber-java:1.1.1' + testCompile 'info.cukes:cucumber-junit:1.1.1' + + testCompile 'junit:junit:4.11' +} + +repositories { + mavenCentral() +} \ No newline at end of file diff --git a/examples/java-gradle/src/main/java/gradle/cucumber/Production.java b/examples/java-gradle/src/main/java/gradle/cucumber/Production.java new file mode 100644 index 0000000000..ea355abade --- /dev/null +++ b/examples/java-gradle/src/main/java/gradle/cucumber/Production.java @@ -0,0 +1,9 @@ +package gradle.cucumber; + +public class Production { + + public void doWork() { + throw new RuntimeException("production failed here"); + } + +} diff --git a/examples/java-gradle/src/test/java/gradle/cucumber/BasicStepdefs.java b/examples/java-gradle/src/test/java/gradle/cucumber/BasicStepdefs.java new file mode 100644 index 0000000000..f661fc76c0 --- /dev/null +++ b/examples/java-gradle/src/test/java/gradle/cucumber/BasicStepdefs.java @@ -0,0 +1,17 @@ +package gradle.cucumber; + +import cucumber.api.java.en.Given; +import cucumber.api.java.en.When; + +public class BasicStepdefs { + + @Given("^I use Cucumber Main class to run tests$") + public void I_use_Cucumber_Main_class_to_run_tests() throws Throwable { + //do nothing + } + + @When("^I run failing test$") + public void I_run_failing_test() throws Throwable { + new Production().doWork(); + } +} diff --git a/examples/java-gradle/src/test/java/gradle/cucumber/RunCukesTest.java b/examples/java-gradle/src/test/java/gradle/cucumber/RunCukesTest.java new file mode 100644 index 0000000000..53352d9e5f --- /dev/null +++ b/examples/java-gradle/src/test/java/gradle/cucumber/RunCukesTest.java @@ -0,0 +1,10 @@ +package gradle.cucumber; + +import cucumber.api.junit.Cucumber; +import org.junit.runner.RunWith; + +@RunWith(Cucumber.class) +@Cucumber.Options(format = {"pretty", "html:build/cucumber-html-report", "json-pretty:build/cucumber-report.json"}) +public class RunCukesTest { + +} diff --git a/examples/java-gradle/src/test/resources/gradle/cucumber/gradle.feature b/examples/java-gradle/src/test/resources/gradle/cucumber/gradle.feature new file mode 100644 index 0000000000..cdb2934c73 --- /dev/null +++ b/examples/java-gradle/src/test/resources/gradle/cucumber/gradle.feature @@ -0,0 +1,6 @@ +Feature: Gradle-Cucumber integration + + Scenario: Gradle reports 'BUILD FAILED' when Cucumber test fails + Given I use Cucumber Main class to run tests + When I run failing test + Then Gradle should report "BUILD FAILED" \ No newline at end of file