cucumber-skill について
cucumber-skillは、振る舞い駆動テストを作成するチーム向けのCucumber資料です。Gherkin、JavaとJavaScriptのステップ定義、フック、タグ、実行方法を扱います。
主な機能
- 01Gherkinフィーチャーファイルのパターン
- 02JavaとJavaScriptのステップ定義
- 03フックとシナリオタグ
- 04タグによるテストの実行と絞り込み
活用シーン
- 01業務用語で振る舞いを記述
- 02Javaまたは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 スキル
基本パターン
フィーチャーファイル(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 の詳細を書く | ビジネス用語を使う | 読みやすさ |
| コードの各行に 1 つのステップを割り当てる | 意味のあるビジネスステップにする | 抽象化 |
| 共通ステップに Background を使わない | Background を使う | DRY |
| 命令型のステップ | 宣言型のステップ | 保守性 |
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 | フィーチャー作成のパターン | 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 対応