diff --git a/testing-modules/spring-junit5-cucumber/pom.xml b/testing-modules/spring-junit5-cucumber/pom.xml new file mode 100644 index 0000000000..a1cf014d52 --- /dev/null +++ b/testing-modules/spring-junit5-cucumber/pom.xml @@ -0,0 +1,172 @@ + + + + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + + + + + 11 + 11 + 6.9.1 + 5.4.0 + 3.141.59 + 4.3.1 + 0.40 + 3.0.0 + 4.5.3 + + + 4.0.0 + spring-junit5-cucumber + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.webjars + webjars-locator + ${webjars-locator.version} + + + org.webjars.npm + jquery-slim + ${jquery.version} + + + org.webjars + bootstrap + ${bootstrap.version} + + + + + org.projectlombok + lombok + provided + + + io.cucumber + cucumber-java + ${cucumber.version} + + + io.cucumber + cucumber-junit-platform-engine + ${cucumber.version} + + + io.cucumber + cucumber-spring + ${cucumber.version} + + + org.seleniumhq.selenium + selenium-java + ${selenium.version} + + + org.seleniumhq.selenium + selenium-support + ${selenium.version} + + + io.github.bonigarcia + webdrivermanager + ${webdrivermanager.version} + test + + + io.rest-assured + spring-mock-mvc + ${rest-assured.version} + test + + + io.rest-assured + json-schema-validator + ${rest-assured.version} + test + + + + + + + + net.masterthought + maven-cucumber-reporting + ${cucumber-reporting.version} + + randomnumbergenerator + + ${project.build.directory} + + + ${project.build.directory}/cucumber + + **/*.properties + + **/*.json + + + + + + + + + + acceptance + + false + + + + + org.apache.maven.plugins + maven-failsafe-plugin + ${maven-failsafe-plugin.version} + + + **/*IT.java + + + + integration-test + verify + + + + net.masterthought + maven-cucumber-reporting + + + execution + post-integration-test + + generate + + + + + + + + + + + \ No newline at end of file diff --git a/testing-modules/spring-junit5-cucumber/src/main/java/com/baeldung/cucumber_tags/controller/UiController.java b/testing-modules/spring-junit5-cucumber/src/main/java/com/baeldung/cucumber_tags/controller/UiController.java new file mode 100644 index 0000000000..70882f89d4 --- /dev/null +++ b/testing-modules/spring-junit5-cucumber/src/main/java/com/baeldung/cucumber_tags/controller/UiController.java @@ -0,0 +1,38 @@ +package com.baeldung.cucumber_tags.controller; + +import com.baeldung.cucumber_tags.service.RandomNumberGeneratorService; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; + + +@Controller +@AllArgsConstructor +public class UiController { + + @GetMapping("/random-number-generator") + public String showForm(Model model) { + RandomNumberQuery randomNumberQuery = new RandomNumberQuery(); + model.addAttribute("randomNumberQuery", randomNumberQuery); + + return "random-number-generator"; + } + + @PostMapping(value = "/random-number-generator") + public String generateRandomNumber(@ModelAttribute("randomNumberQuery") final RandomNumberQuery randomNumberQuery) { + RandomNumberGeneratorService service = new RandomNumberGeneratorService(); + randomNumberQuery.randomNumber = service.generateRandomNumber(randomNumberQuery.min, randomNumberQuery.max); + return "random-number-generator"; +} + + @Data + private static class RandomNumberQuery { + Integer min = null; + Integer max = null; + Integer randomNumber = null; + } +} diff --git a/testing-modules/spring-junit5-cucumber/src/test/java/com/baeldung/cucumber_tags/acceptance/commonutil/ScenarioContextUI.java b/testing-modules/spring-junit5-cucumber/src/test/java/com/baeldung/cucumber_tags/acceptance/commonutil/ScenarioContextUI.java new file mode 100644 index 0000000000..3dcb2a4ed5 --- /dev/null +++ b/testing-modules/spring-junit5-cucumber/src/test/java/com/baeldung/cucumber_tags/acceptance/commonutil/ScenarioContextUI.java @@ -0,0 +1,77 @@ +package com.baeldung.cucumber_tags.acceptance.commonutil; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.net.URL; + +import static io.github.bonigarcia.wdm.WebDriverManager.getInstance; +import static io.github.bonigarcia.wdm.config.DriverManagerType.CHROME; + +@Component +@Scope(scopeName = "cucumber-glue") +public class ScenarioContextUI { + + protected static final String RANDOM_NUMBER_URL = "/random-number-generator"; + + @LocalServerPort + int port; + private WebDriver driver; + private ScenarioReport report; + + public ScenarioContextUI() { + reset(); + } + + private void reset() { + report = new ScenarioReport(); + driver = null; + } + + private static WebDriver getRemoteWebDriver(URL url) { + return new RemoteWebDriver(url, DesiredCapabilities.chrome()); + } + + private static WebDriver getLocalChromeDriver() { + getInstance(CHROME).setup(); + return new ChromeDriver(); + } + + public ScenarioReport getReport() { + return report; + } + + public String getRandomNumberUrl() { + return "http://" + getServiceBaseUrl() + RANDOM_NUMBER_URL; + } + + private String getServiceBaseUrl() { + return CucumberEnvironment.getServiceHost() + ":" + Integer.toString(port); + } + + /** + * If we are running inside docker (mostly for gitlab ci purposes), we expect a selenium grid setup. + * If that environment variable isn't set, we assume we're in "dev mode" and ChromeDriverManager will + * provide the local instance of chromedriver (no need to have chromedriver installed). + */ + public WebDriver getWebDriver() { + if (driver == null) { + return getFreshWebdriver(); + } else { + return driver; + } + } + + private WebDriver getFreshWebdriver() { + driver = CucumberEnvironment.getSeleniumGridUrl() + .map(ScenarioContextUI::getRemoteWebDriver) + .orElseGet(ScenarioContextUI::getLocalChromeDriver); + return driver; + } + +}