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
Selenium: Automates web browsers to test web applications.
Cucumber: Enables writing tests in plain English (Gherkin syntax).
Java: Programming language for writing test automation scripts.
JUnit/TestNG: Test framework to execute Cucumber tests.
Setting Up Your Project
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>
Directory Structure:
src/test/java
: For step definitions.
src/test/resources
: For feature files.
Writing a Feature File
Save this file as
login.feature
insrc/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
insrc/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
insrc/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
Open a terminal.
Navigate to your project directory.
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
Keep Scenarios Simple: Use concise and descriptive steps in Gherkin.
Reuse Step Definitions: Avoid duplicating code by reusing steps where possible.
Parameterize Steps: Handle multiple inputs by parameterizing your Gherkin steps.
Organize Files: Maintain a clear structure for features, steps, and configurations.
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.
Source: Read More