Behavior-Driven Development (BDD) with Selenium and Cucumber

Behavior-Driven Development (BDD) is a methodology that bridges the gap between business and technical teams by emphasizing collaboration. It uses plain language to define application behavior, making it easier for non-technical stakeholders to contribute to the development process. Selenium and Cucumber are widely used together in BDD to automate web application testing.

This blog provides a detailed guide to implementing BDD using Selenium and Cucumber, including coding examples to help you get started.


What is BDD?

BDD focuses on the behavior of an application from the end user's perspective. It uses scenarios written in Gherkin, a domain-specific language with a simple syntax:

  • Given: Precondition or context.

  • When: Action or event.

  • Then: Outcome or result.

Example:

Feature: Login Functionality
  Scenario: Valid user logs in successfully
    Given the user is on the login page
    When the user enters valid credentials
    Then the user is redirected to the dashboard

Tools Used

  1. Selenium: Automates web browsers to test web applications.

  2. Cucumber: Enables writing tests in plain English (Gherkin syntax).

  3. Java: Programming language for writing test automation scripts.

  4. JUnit/TestNG: Test framework to execute Cucumber tests.


Setting Up Your Project

  1. Create a Maven Project:

    • Add dependencies in pom.xml:

<dependencies>
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-java</artifactId>
        <version>7.11.0</version>
    </dependency>
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-junit</artifactId>
        <version>7.11.0</version>
    </dependency>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>4.10.0</version>
    </dependency>
</dependencies>
  1. Directory Structure:

    • src/test/java: For step definitions.

    • src/test/resources: For feature files.


Writing a Feature File

Save this file as login.feature in src/test/resources/features:

Feature: Login Functionality

  Scenario: Valid user logs in successfully
    Given the user is on the login page
    When the user enters valid credentials
    Then the user is redirected to the dashboard

  Scenario: Invalid user cannot log in
    Given the user is on the login page
    When the user enters invalid credentials
    Then an error message is displayed

Creating Step Definitions

Create a Java file LoginSteps.java in src/test/java/stepdefinitions:

package stepdefinitions;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import io.cucumber.java.en.*;

public class LoginSteps {
    WebDriver driver;

    @Given("the user is on the login page")
    public void userIsOnLoginPage() {
        System.setProperty("webdriver.chrome.driver", "path_to_chromedriver");
        driver = new ChromeDriver();
        driver.get("https://example.com/login");
    }

    @When("the user enters valid credentials")
    public void userEntersValidCredentials() {
        WebElement username = driver.findElement(By.id("username"));
        WebElement password = driver.findElement(By.id("password"));
        WebElement loginButton = driver.findElement(By.id("login"));

        username.sendKeys("validUser");
        password.sendKeys("validPassword");
        loginButton.click();
    }

    @Then("the user is redirected to the dashboard")
    public void userIsRedirectedToDashboard() {
        String expectedUrl = "https://example.com/dashboard";
        assert driver.getCurrentUrl().equals(expectedUrl);
        driver.quit();
    }

    @When("the user enters invalid credentials")
    public void userEntersInvalidCredentials() {
        WebElement username = driver.findElement(By.id("username"));
        WebElement password = driver.findElement(By.id("password"));
        WebElement loginButton = driver.findElement(By.id("login"));

        username.sendKeys("invalidUser");
        password.sendKeys("invalidPassword");
        loginButton.click();
    }

    @Then("an error message is displayed")
    public void errorMessageIsDisplayed() {
        WebElement error = driver.findElement(By.id("error"));
        assert error.isDisplayed();
        driver.quit();
    }
}

Configuring the Runner Class

Create a Java file TestRunner.java in src/test/java/runners:

package runners;

import org.junit.runner.RunWith;
import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;

@RunWith(Cucumber.class)
@CucumberOptions(
    features = "src/test/resources/features",
    glue = "stepdefinitions",
    plugin = {"pretty", "html:target/cucumber-reports"},
    monochrome = true
)
public class TestRunner {
}

Running Your Tests

  1. Open a terminal.

  2. Navigate to your project directory.

  3. Run the following command:

mvn test

This will execute all scenarios defined in the login.feature file.


Best Practices for BDD with Selenium and Cucumber

  1. Keep Scenarios Simple: Use concise and descriptive steps in Gherkin.

  2. Reuse Step Definitions: Avoid duplicating code by reusing steps where possible.

  3. Parameterize Steps: Handle multiple inputs by parameterizing your Gherkin steps.

  4. Organize Files: Maintain a clear structure for features, steps, and configurations.

  5. Continuous Integration: Integrate Cucumber tests with CI/CD pipelines for automated execution.


Conclusion

BDD with Selenium and Cucumber is a powerful combination for creating readable, maintainable, and effective test automation suites. By leveraging this approach, teams can foster collaboration, improve test coverage, and ensure high-quality software delivery. Start implementing BDD in your projects today and experience its benefits firsthand!


Keywords: BDD, Selenium, Cucumber, Automation Testing, Behavior-Driven Development, Gherkin, Step Definitions, Test Automation Framework.

Comments

Popular posts from this blog

Mastering Selenium Practice: Automating Web Tables with Demo Examples

Top 10 Demo Websites for Selenium Automation Practice

Selenium Automation for E-commerce Websites

14 Best Selenium Practice Exercises for Automation Practice

AI and Machine Learning in Selenium Testing: Revolutionizing Test Automation

Top 10 Highly Paid Indian CEOs in the USA

Tosca Automation Testing Tool: A Comprehensive Guide for Testers

Automate GoDaddy.com Features with Selenium WebDriver

Prompt Engineering 101: Master LLMs Like ChatGPT & Claude

Automating REST APIs with Selenium and Postman