mcpField
C
cucumber-skill

cucumber-skill

github.com/lambdatest测试与质量384267 次安装2 周前更新
代码仓库

关于 cucumber-skill

cucumber-skill 为编写行为驱动测试的团队提供 Cucumber 参考,涵盖 Gherkin 功能文件、Java 和 JavaScript 步骤定义、钩子、标签及执行方法。

主要功能

  1. 01Gherkin 功能文件模式
  2. 02Java 和 JavaScript 步骤定义
  3. 03钩子与场景标签
  4. 04按标签运行和筛选测试

适用场景

  1. 01用业务语言描述行为
  2. 02实现 Java 或 JavaScript 步骤
  3. 03运行指定的冒烟或回归场景
  4. 04配置云端测试执行

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/lambdatest/agent-skills --skill cucumber-skill

安装后在 Claude Code 中输入/cucumber-skill确认已加载。

附带文件reference/advanced-patterns.mdreference/playbook.md

详细介绍

Cucumber BDD 技能

核心模式

Feature 文件(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 "[email protected]" 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 "[email protected]" 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     |
      | [email protected]  | admin123    | Dashboard  |
      | [email protected]   | password    | Dashboard  |
      | [email protected]    | wrong       | Error      |
步骤定义 — 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));
    }
}
步骤定义 — 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);
});
钩子
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();
    }
}
标签
@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"
反模式
不佳做法推荐做法原因
在 Gherkin 中描述 UI 细节使用业务语言易于阅读
每行代码对应一个步骤使用有意义的业务步骤抽象
未为共享步骤使用 Background使用 Background避免重复
使用命令式步骤使用声明式步骤易于维护
在 TestMu AI 上云端执行

设置环境变量: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();

快速参考

任务命令
运行全部(Java)使用 cucumber-junit-platform-engine 执行 mvn test
运行全部(JS)npx cucumber-js
按标签运行--tags "@smoke"
试运行--dry-run
生成代码片段运行未定义的步骤

深入模式 → reference/playbook.md

§章节内容
1项目设置与配置Maven、运行器、重新运行
2Feature 编写模式Background、场景大纲、DataTable
3步骤定义类型化步骤、DI 注入
4依赖注入与共享状态PicoContainer、ScenarioContext
5钩子(生命周期管理)Before/After 顺序、截图
6自定义参数类型转换器、DocString
7并行执行线程安全、TestNG 并行
8报告Allure、masterthought、JSON
9CI/CD 集成GitHub Actions、标签矩阵
10调试速查10 个常见问题
11最佳实践清单13 项

评论

支持 Markdown