Beginner Chapter 2 · 11 min read

Setup & Project Structure

Configure a Cucumber project with Maven (Java) and pip (Python). Install dependencies, set up runners, and organize feature files.

Setting Up Your Cucumber Project

A well-organized BDD project separates feature files (business language) from step definitions (code). Let's set up both Java and Python with the correct dependencies and folder layouts.

Java — Cucumber-JVM with Maven

Cucumber-JVM integrates with JUnit 5 or TestNG. We'll use Maven for dependency management and the cucumber-java + cucumber-testng modules alongside Selenium for browser automation.

Python — Behave

Behave is Python's leading BDD framework. It uses the same Gherkin syntax as Cucumber and follows a simple convention: feature files in features/, step definitions in features/steps/.

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.bdd.course</groupId>
    <artifactId>cucumber-course</artifactId>
    <version>1.0.0</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <cucumber.version>7.20.1</cucumber.version>
        <selenium.version>4.27.0</selenium.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-java</artifactId>
            <version>${cucumber.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-testng</artifactId>
            <version>${cucumber.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>${selenium.version}</version>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>7.10.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.2.5</version>
            </plugin>
        </plugins>
    </build>
</project>
project-structure.txt
# Java project structure
cucumber-course/
+-- pom.xml
+-- src/test/
    +-- java/com/bdd/course/
    |   +-- runner/
    |   |   +-- TestRunner.java         # Cucumber runner
    |   +-- stepdefinitions/
    |   |   +-- LoginSteps.java         # Step implementations
    |   |   +-- CommonSteps.java
    |   +-- pages/
    |   |   +-- LoginPage.java          # Page Objects
    |   |   +-- HomePage.java
    |   +-- hooks/
    |   |   +-- Hooks.java              # Before/After hooks
    |   +-- context/
    |       +-- TestContext.java         # Shared state
    +-- resources/
        +-- features/
        |   +-- login.feature           # Gherkin scenarios
        |   +-- registration.feature
        +-- cucumber.properties
requirements.txt
# requirements.txt
behave==1.2.6
selenium==4.27.0
allure-behave==2.13.5
webdriver-manager==4.0.2
project-structure.txt
# Python/Behave project structure
cucumber-course/
+-- requirements.txt
+-- behave.ini
+-- features/
|   +-- login.feature               # Gherkin scenarios
|   +-- registration.feature
|   +-- steps/
|   |   +-- login_steps.py          # Step implementations
|   |   +-- common_steps.py
|   +-- environment.py              # Hooks (before/after)
+-- pages/
|   +-- __init__.py
|   +-- login_page.py               # Page Objects
|   +-- home_page.py
+-- config/
|   +-- settings.py                  # URLs, timeouts
+-- reports/                         # HTML/Allure reports
behave.ini
# behave.ini
[behave]
paths = features
format = pretty
stdout_capture = false
stderr_capture = false
log_capture = false

# Tags: behave --tags=@smoke
# Dry-run: behave --dry-run

Cucumber BDD Beginner Setup & Project Structure

Written by PV

© 2026 All Rights Reserved