关于 cucumber-skill
cucumber-skill 为编写行为驱动测试的团队提供 Cucumber 参考,涵盖 Gherkin 功能文件、Java 和 JavaScript 步骤定义、钩子、标签及执行方法。
主要功能
- 01Gherkin 功能文件模式
- 02Java 和 JavaScript 步骤定义
- 03钩子与场景标签
- 04按标签运行和筛选测试
适用场景
- 01用业务语言描述行为
- 02实现 Java 或 JavaScript 步骤
- 03运行指定的冒烟或回归场景
- 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、运行器、重新运行 |
| 2 | Feature 编写模式 | Background、场景大纲、DataTable |
| 3 | 步骤定义 | 类型化步骤、DI 注入 |
| 4 | 依赖注入与共享状态 | PicoContainer、ScenarioContext |
| 5 | 钩子(生命周期管理) | Before/After 顺序、截图 |
| 6 | 自定义参数类型 | 转换器、DocString |
| 7 | 并行执行 | 线程安全、TestNG 并行 |
| 8 | 报告 | Allure、masterthought、JSON |
| 9 | CI/CD 集成 | GitHub Actions、标签矩阵 |
| 10 | 调试速查 | 10 个常见问题 |
| 11 | 最佳实践清单 | 13 项 |
评论
支持 Markdown