Agent-skills cucumber-skill
install
source · Clone the upstream repo
git clone https://github.com/LambdaTest/agent-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/LambdaTest/agent-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/cucumber-skill" ~/.claude/skills/lambdatest-agent-skills-cucumber-skill && rm -rf "$T"
manifest:
cucumber-skill/SKILL.mdsource content
Cucumber BDD Skill
Core Patterns
Feature File (Gherkin)
Feature: User Login As a registered user I want to log into the application So that I can access my dashboard Background: Given I am on the login page Scenario: Successful login When I enter "user@test.com" in the email field And I enter "password123" in the password field And I click the login button Then I should be redirected to the dashboard And I should see "Welcome" on the page Scenario: Invalid credentials When I enter "wrong@test.com" in the email field And I enter "wrongpass" in the password field And I click the login button Then I should see an error message "Invalid credentials" Scenario Outline: Login with various users When I enter "<email>" in the email field And I enter "<password>" in the password field And I click the login button Then I should see "<result>" Examples: | email | password | result | | admin@test.com | admin123 | Dashboard | | user@test.com | password | Dashboard | | bad@test.com | wrong | Error |
Step Definitions — Java
import io.cucumber.java.en.*; import static org.junit.jupiter.api.Assertions.*; public class LoginSteps { private LoginPage loginPage; private DashboardPage dashboardPage; @Given("I am on the login page") public void iAmOnTheLoginPage() { loginPage = new LoginPage(driver); loginPage.navigate(); } @When("I enter {string} in the email field") public void iEnterEmail(String email) { loginPage.enterEmail(email); } @When("I enter {string} in the password field") public void iEnterPassword(String password) { loginPage.enterPassword(password); } @When("I click the login button") public void iClickLogin() { dashboardPage = loginPage.clickLogin(); } @Then("I should be redirected to the dashboard") public void iShouldBeOnDashboard() { assertTrue(driver.getCurrentUrl().contains("/dashboard")); } @Then("I should see {string} on the page") public void iShouldSeeText(String text) { assertTrue(dashboardPage.getPageSource().contains(text)); } }
Step Definitions — JavaScript
const { Given, When, Then } = require('@cucumber/cucumber'); const { expect } = require('chai'); Given('I am on the login page', async function() { await this.page.goto('/login'); }); When('I enter {string} in the email field', async function(email) { await this.page.fill('#email', email); }); When('I click the login button', async function() { await this.page.click('button[type="submit"]'); }); Then('I should see {string} on the page', async function(text) { const content = await this.page.textContent('body'); expect(content).to.include(text); });
Hooks
import io.cucumber.java.*; public class Hooks { @Before public void setUp(Scenario scenario) { driver = new ChromeDriver(); } @After public void tearDown(Scenario scenario) { if (scenario.isFailed()) { byte[] screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES); scenario.attach(screenshot, "image/png", "failure-screenshot"); } driver.quit(); } }
Tags
@smoke Feature: Login @critical @fast Scenario: Quick login ... @slow @regression Scenario: Full login flow ...
# Run by tag mvn test -Dcucumber.filter.tags="@smoke" mvn test -Dcucumber.filter.tags="@smoke and not @slow"
Anti-Patterns
| Bad | Good | Why |
|---|---|---|
| UI details in Gherkin | Business language | Readability |
| One step per line of code | Meaningful business steps | Abstraction |
| No Background for shared steps | Use Background | DRY |
| Imperative steps | Declarative steps | Maintainable |
Cloud Execution on TestMu AI
Set environment variables:
LT_USERNAME, LT_ACCESS_KEY
Java:
// CucumberHooks.java ChromeOptions browserOptions = new ChromeOptions(); HashMap<String, Object> ltOptions = new HashMap<>(); ltOptions.put("user", System.getenv("LT_USERNAME")); ltOptions.put("accessKey", System.getenv("LT_ACCESS_KEY")); ltOptions.put("build", "Cucumber Build"); ltOptions.put("name", scenario.getName()); ltOptions.put("platformName", "Windows 11"); ltOptions.put("video", true); browserOptions.setCapability("LT:Options", ltOptions); driver = new RemoteWebDriver(new URL("https://hub.lambdatest.com/wd/hub"), browserOptions);
JavaScript:
const driver = new Builder() .usingServer(`https://${process.env.LT_USERNAME}:${process.env.LT_ACCESS_KEY}@hub.lambdatest.com/wd/hub`) .withCapabilities({ browserName: 'chrome', 'LT:Options': { user: process.env.LT_USERNAME, accessKey: process.env.LT_ACCESS_KEY, build: 'Cucumber Build', platformName: 'Windows 11', video: true }}).build();
Quick Reference
| Task | Command |
|---|---|
| Run all (Java) | with cucumber-junit-platform-engine |
| Run all (JS) | |
| Run tagged | |
| Dry run | |
| Generate snippets | Run undefined steps |
Deep Patterns → reference/playbook.md
reference/playbook.md| § | Section | Lines |
|---|---|---|
| 1 | Project Setup & Configuration | Maven, runner, rerun |
| 2 | Feature Writing Patterns | Background, outlines, DataTable |
| 3 | Step Definitions | Typed steps, DI injection |
| 4 | Dependency Injection & Shared State | PicoContainer, ScenarioContext |
| 5 | Hooks (Lifecycle Management) | Before/After ordering, screenshots |
| 6 | Custom Parameter Types | Transformers, DocString |
| 7 | Parallel Execution | Thread-safe, TestNG parallel |
| 8 | Reporting | Allure, masterthought, JSON |
| 9 | CI/CD Integration | GitHub Actions, tag matrix |
| 10 | Debugging Quick-Reference | 10 common problems |
| 11 | Best Practices Checklist | 13 items |