Integrating Cucumber, Playwright, and TestNG in Java enables you to write BDD (Behavior Driven Development) style tests using Gherkin (.feature files), automate browser interactions using Playwright, and manage execution using TestNG.
Role of Each Component
Playwright:
A powerful automation framework that interacts with modern browsers (Chromium, Firefox, WebKit). It is mainly responsible for performing browser-based actions like navigating pages, clicking elements, validating results, handling alerts, and more. It provides the engine for execution of test steps.
Cucumber:
A BDD (Behavior-Driven Development) framework that allows writing test scenarios in Gherkin language (Given-When-Then format). Its purpose is to make test cases readable and understandable for both technical and non-technical stakeholders. It provides the structure for test scenarios and bridges the gap between business requirements and automated test scripts.
TestNG:
A test management and execution framework in Java. It provides advanced features like test configuration, grouping, parallel execution, annotations, data-driven testing, and detailed reporting. It manages how and when tests are executed, integrates with build tools (Maven/Gradle), and generates structured results.
How Integration Works
Step 1: Cucumber defines test scenarios
Business or QA teams write scenarios in Gherkin. Example:
- Given user launches the browser
- When user logs in with valid credentials
- Then homepage should be displayed
Step 2: Step Definitions in Java call Playwright
Each step in the feature file is mapped to a step definition (Java method). Inside these step definitions, Playwright APIs are used to perform browser actions like opening a page, entering data, or verifying results.
Step 3: TestNG executes scenarios
TestNG acts as the test runner. It executes Cucumber feature files (via Cucumber runner classes) and manages the lifecycle of the tests. TestNG annotations help configure test execution order, parallel runs, retries, or grouping of test suites.
Step 4: Unified Reporting and Logs
TestNG generates test execution reports (HTML/XML), while Cucumber generates BDD reports. These can also be integrated into advanced reporting dashboards like Allure or Extent Reports. This way, both the technical (developer/QA) and business teams can consume the results in formats they understand.
Benefits of Integration
Readable Scenarios: Cucumber ensures tests are described in plain English, improving collaboration.
Powerful Browser Automation: Playwright provides modern, fast, and cross-browser execution.
Robust Test Management: TestNG handles execution strategies (parallelism, suites, groups).
Scalability: The combination is suited for enterprise-level projects where test readability, execution speed, and configurability are crucial.
Flexible Reporting: Both business-friendly BDD reports and developer-focused TestNG reports are available.
Tools Used:
Cucumber for BDD feature files and step definitions
Playwright for Java for browser automation
TestNG for test execution and reporting
Maven for dependency management
pom.xml:
<project> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>cucumber-playwright-testng</artifactId> <version>1.0</version> <dependencies> <!-- Cucumber Dependencies --> <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.9.0</version> <scope>test</scope> </dependency> <!-- Playwright Java --> <dependency> <groupId>com.microsoft.playwright</groupId> <artifactId>playwright</artifactId> <version>1.44.0</version> </dependency> </dependencies> <build> <plugins> <!-- Surefire for TestNG --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.2.5</version> <configuration> <suiteXmlFiles> <suiteXmlFile>testng.xml</suiteXmlFile> </suiteXmlFiles> </configuration> </plugin> </plugins> </build> </project>
Title.feature (Gherkin feature file)
Feature: Check title Scenario: Open login page and check title Given I launch the application Then I should see the page title as "Example Domain"
package utils; import com.microsoft.playwright.*; public class PlaywrightFactory { public static Playwright playwright; public static Browser browser; public static Page page; public static void init() { playwright = Playwright.create(); browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false)); page = browser.newPage(); } public static void close() { browser.close(); playwright.close(); } }
package steps; import com.microsoft.playwright.Page; import io.cucumber.java.After; import io.cucumber.java.Before; import io.cucumber.java.en.*; import utils.PlaywrightFactory; import static org.testng.Assert.assertEquals; public class LoginSteps { Page page; @Before public void setup() { PlaywrightFactory.init(); page = PlaywrightFactory.page; } @Given("I launch the application") public void i_launch_the_application() { page.navigate("https://example.com"); } @Then("I should see the page title as {string}") public void i_should_see_the_page_title_as(String expectedTitle) { String actualTitle = page.title(); assertEquals(actualTitle, expectedTitle); } @After public void tearDown() { PlaywrightFactory.close(); } }
TestRunner.java (Cucumber TestNG runner)package runners; import io.cucumber.testng.AbstractTestNGCucumberTests; import io.cucumber.testng.CucumberOptions; import org.testng.annotations.DataProvider; @CucumberOptions( features = "src/test/resources/features", glue = "steps", plugin = {"pretty", "html:target/cucumber-reports.html"}, monochrome = true ) public class TestRunner extends AbstractTestNGCucumberTests { @Override @DataProvider(parallel = true) public Object[][] scenarios() { return super.scenarios(); } }
TestNG.xml is optional file which contains TestRunner class path represented in class tag. We can execute TestRunner class by TestNG.xml also.
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd"> <suite name="Cucumber Playwright TestNG Suite"> <test name="Cucumber Tests"> <classes> <class name="runners.TestRunner"/> </classes> </test> </suite>
Suggested Posts:
1. Playwright with TestNG Integration
2. Automate Login Page in Playwright
3. Comma Selectors in Playwright
4. Handle Alerts in Playwright
5. How to Show Visible Elements in Playwright