Integration of Cucumber, TestNG, and Selenium

  

Here in below code, we are using Cucumber as BDD tool, Testng as TDD tool and selenium to automate web pages.


ComponentPurpose
CucumberBDD framework (Gherkin syntax)
TestNGTest execution and configuration (alternative to JUnit)
SeleniumAutomating browser actions

Project Setup Using Maven


Add below dependencies in pom.xml


<dependencies>
    <!-- Selenium -->
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>4.20.0</version>
    </dependency>

    <!-- Cucumber -->
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-java</artifactId>
        <version>7.14.0</version>
    </dependency>
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-testng</artifactId>
        <version>7.14.0</version>
    </dependency>

    <!-- TestNG -->
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>7.10.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>



Project Structure

src/test/java ├── features │ └── Login.feature ├── stepdefinitions │ └── LoginSteps.java ├── runners │ └── TestNGCucumberRunner.java ├── pages │ └── LoginPage.java └── testrunner └── RunCucumberTestNGTest.java


1. Login.feature : It is cucumber file to write plain english scenario using gherkin keywords under feature.


Feature: Login functionality

  Scenario: Successful login
    Given User is on the login page
    When User enters username and password
    And User clicks login
    Then User should see the home page


Below is page class which is implemented in selenium java for writing web page automation
logic.


2. LoginPage.java

package pages;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

public class LoginPage {
    WebDriver driver;

    public LoginPage(WebDriver driver) {
        this.driver = driver;
    }

    By username = By.id("username");
    By password = By.id("password");
    By loginBtn = By.id("login");

    public void enterUsername(String user) {
        driver.findElement(username).sendKeys(user);
    }

    public void enterPassword(String pass) {
        driver.findElement(password).sendKeys(pass);
    }

    public void clickLogin() {
        driver.findElement(loginBtn).click();
    }
}


Below is step definition class which is implemented in selenium java for implementing
feature file steps in the form of java codes.


3. LoginSteps.java

package stepdefinitions;

import io.cucumber.java.en.*;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import pages.LoginPage;

public class LoginSteps {
    WebDriver driver;
    LoginPage loginPage;

    @Given("User is on the login page")
    public void openLoginPage() {
        driver = new ChromeDriver();
        driver.get("https://example.com/login");
        loginPage = new LoginPage(driver);
    }

    @When("User enters username and password")
    public void enterCredentials() {
        loginPage.enterUsername("testuser");
        loginPage.enterPassword("testpass");
    }

    @When("User clicks login")
    public void clickLogin() {
        loginPage.clickLogin();
    }

    @Then("User should see the home page")
    public void verifyHomePage() {
        String title = driver.getTitle();
        assert title.contains("Home");
        driver.quit();
    }
}


Below is the Test runner java class implemented in cucumber with testng to run
the script.


4. TestNGCucumberRunner.java 


package runners;

import io.cucumber.testng.AbstractTestNGCucumberTests;
import io.cucumber.testng.CucumberOptions;

@CucumberOptions(
    features = "src/test/java/features",
    glue = "stepdefinitions",
    plugin = {"pretty", "html:target/cucumber-report.html"},
    monochrome = true
)
public class TestNGCucumberRunner extends AbstractTestNGCucumberTests {
}


5. Run the Test

Right-click on TestNGCucumberRunner.java → Run as TestNG Test


Summary

ToolRole
CucumberGherkin syntax BDD testing
TestNGAdvanced test configuration and reporting
SeleniumWeb automation