返回 Skill 列表
extension
分类: 开发与工程无需 API Key

cucumber-skill

生成Cucumber BDD测试,包括Gherkin特性文件和Java、JavaScript或Ruby中的步骤定义。当用户提到“Cucumber”、“Gherkin”、“Feature/Scenario”、“Given/When/Then”、“BDD”时使用。触发词为:“Cucumber”、“Gherkin”、“BDD”、“Feature file”、“Given/When/Then”、“step definitions”。

person作者: jakexiaohubgithub

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) | mvn test with cucumber-junit-platform-engine | | Run all (JS) | npx cucumber-js | | Run tagged | --tags "@smoke" | | Dry run | --dry-run | | Generate snippets | Run undefined steps |

Deep Patterns → 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 |