BDDテストのためのCucumberの使い方

Ashley Goolam

Ashley Goolam

23 12月 2025

BDDテストのためのCucumberの使い方

Behavior-Driven Development は、テストを誰もが読み書きできるようにすることで、チームのソフトウェア品質に対する考え方を根本的に変えました。BDD テストに Cucumber を使用するスキルは、ビジネス要件と技術的な実装の間のギャップを埋め、実際に実行される「生きたドキュメント」を作成します。もし、書いた瞬間に古くなってしまうテストケースに苦労しているなら、このガイドがより良い方法を示します。

ボタン

Cucumber と BDD とは?

Cucumber は、平易な言葉で書かれた自動テストを実行するオープンソースツールです。これは Behavior-Driven Development (BDD) を実装しており、開発者、テスター、ビジネス関係者が具体的な例を用いてソフトウェアの動作を定義するために協力する手法です。

BDD は、「どのようにテストすべきか?」ではなく「システムは何をすべきか?」という一つの問いに焦点を当てます。その結果、誤解を解消し、仕様と実行可能な検証の両方として機能するテストを作成する共通言語が生まれます。

Cucumber は Gherkin 構文で書かれたシナリオを含む .feature ファイルを読み込み、ステップ定義(実際の自動化を実行するコード)に対してそれらを実行します。この分離により、ビジネス関係者はコードを読むことなくテストシナリオを確認でき、開発者は技術的な詳細を別途実装できます。

Cucumber

JavaScript 向け Cucumber のインストール

Node.js プロジェクトに Cucumber を設定するには、いくつかのコマンドを実行するだけです。

前提条件:

npmとnodeがローカルマシンにインストールされているか確認
# 新しいプロジェクトディレクトリを作成
mkdir cucumber-bdd-demo && cd cucumber-bdd-demo

# npm を初期化
npm init -y

# Cucumber とテスト関連の依存関係をインストール
npm install --save-dev @cucumber/cucumber chai axios
プロジェクトにCucumberをセットアップ

package.json にはテストスクリプトが含まれている必要があります。

{
  "scripts": {
    "test": "cucumber-js"
  }
}

このディレクトリ構造を作成してください。

project/
├── features/
│   └── user-management.feature
├── step-definitions/
│   └── user-steps.js
├── package.json
└── cucumber.json

実践ガイド:初めての BDD テストの書き方

BDD テストに Cucumber を使用する方法 を実践するために、ユーザー管理 API のテストを作成してみましょう。

ステップ 1: Feature ファイルを作成する

features/user-management.feature を作成します。

Feature: User Management API
  As an API client
  I want to manage users
  So that I can integrate user functionality into my application

  Scenario: Create a new user successfully
    Given I have a valid user payload
    When I send a POST request to "/api/users"
    Then the response status should be 201
    And the response should contain a user ID

  Scenario: Attempt to create user with invalid email
    Given I have a user payload with invalid email
    When I send a POST request to "/api/users"
    Then the response status should be 400
    And the response should contain "Invalid email format"

ステップ 2: ステップ定義を実装する

step-definitions/user-steps.js を作成します。

const { Given, When, Then } = require('@cucumber/cucumber');
const { expect } = require('chai');
const axios = require('axios');

let requestPayload;
let response;

Given('I have a valid user payload', function() {
  requestPayload = {
    name: 'Test User',
    email: 'test@example.com',
    password: 'ValidPass123'
  };
});

Given('I have a user payload with invalid email', function() {
  requestPayload = {
    name: 'Test User',
    email: 'invalid-email',
    password: 'ValidPass123'
  };
});

When('I send a POST request to {string}', async function(endpoint) {
  try {
    response = await axios.post(`http://localhost:3000${endpoint}`, requestPayload);
  } catch (error) {
    response = error.response;
  }
});

Then('the response status should be {int}', function(statusCode) {
  expect(response.status).to.equal(statusCode);
});

Then('the response should contain a user ID', function() {
  expect(response.data).to.have.property('userId');
  expect(response.data.userId).to.match(/^[0-9a-fA-F]{24}$/);
});

Then('the response should contain {string}', function(message) {
  expect(response.data.message).to.include(message);
});

ステップ 3: cucumber.json ファイルを編集する

プロジェクトのルートディレクトリに "cucumber.json" ファイルを作成し、以下のコードを追加します。

{
    "default": {
        "formatOptions": {
            "snippetInterface": "synchronous"
        }
    }
}

ステップ 4: テストを実行する

以下のコマンドでテストを実行します。

npm test

Cucumber は、合格、未定義、失敗したステップを示す詳細な結果を出力します。

良い BDD シナリオを作成するためのルール

BDD テストに Cucumber を効果的に使用する方法 を学ぶには、以下の実証済みのルールに従う必要があります。

1. Given-When-Then 構造

すべてのシナリオには、次の 3 つの要素がこの順序で含まれている必要があります。

2. 命令的ではなく宣言的に記述する

悪い例:

Given I open the browser
And I navigate to "/login"
And I type "test@example.com" in the email field
And I type "password" in the password field
And I click the login button

良い例:

Given I am on the login page
When I log in with valid credentials
Then I should see the dashboard

どのようにテストするかではなく、何をテストするかに焦点を当ててください。

3. 一つのシナリオ、一つの目的

各シナリオは、単一の動作をテストする必要があります。複合的なシナリオは失敗を隠し、デバッグを困難にします。

4. ビジネス言語を使用する

ビジネス関係者が理解できるシナリオを記述します。専門用語や実装の詳細を避けてください。

5. シナリオを独立させる

シナリオは互いに依存しないようにしてください。それぞれが独自のデータを設定し、後でクリーンアップする必要があります。

高度な Cucumber 機能: データテーブルとシナリオアウトライン

複雑な入力のためのデータテーブル

複数のデータポイントでテストする必要がある場合は、テーブルを使用します。

Scenario: Create users with different roles
  Given I have the following user data:
    | name     | email             | role    |
    | Alice    | alice@example.com | admin   |
    | Bob      | bob@example.com   | user    |
  When I send a POST request to "/api/users"
  Then all users should be created successfully

ステップ定義:

Given('I have the following user data:', function(dataTable) {
  requestPayload = dataTable.hashes();
});

データ駆動テストのためのシナリオアウトライン

同じシナリオを異なるデータで実行したい場合は、アウトラインを使用します。

Scenario Outline: Login with various credentials
  Given I am on the login page
  When I enter "<email>" and "<password>"
  Then I should see "<result>"

  Examples:
    | email             | password   | result          |
    | test@example.com  | validPass  | Dashboard       |
    | test@example.com  | wrongPass  | Invalid password|
    | invalid@email.com | validPass  | Invalid email   |

これにより、3つの異なるテストシナリオが自動的に作成されます。

タグを使用したテストの整理

タグはシナリオを分類し、フィルタリングするのに役立ちます。

@smoke @regression
Scenario: User login
  Given I am on the login page
  When I log in with valid credentials
  Then I should see the dashboard

@api @critical
Scenario: API health check
  Given the API is running
  When I request "/health"
  Then the response status should be 200

特定のタグのみを実行します。

npm test -- --tags "@smoke"

BDD ワークフローにおける API テストで Apidog がどのように役立つか

Cucumber は振る舞いを定義するのに優れていますが、Apidog は API テストの作成と実行における面倒な作業を自動化し、BDD テストのための Cucumber をはるかに効率的にします。

AI を活用した API テストケースの生成

API 呼び出しのためのステップ定義を手動で書く代わりに、Apidog は OpenAPI 仕様から AI を使用してそれらを生成します。

# あなたの API 仕様
paths:
  /api/users:
    post:
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name: string
                email: string
      responses:
        '201':
          description: User created

Apidog はテスト準備が整ったシナリオを自動的に作成します。

ボタン
Apidogでのテストケース生成

よくある質問

Q1: Cucumber テストを書くためにプログラミングの知識は必要ですか?

A: Gherkin シナリオを書くのにコーディングは必要ありません。振る舞いについて明確に考えるだけです。ただし、ステップ定義を実装するには JavaScript (または他の言語) の知識が必要です。Apidog のようなツールは、ステップ定義コードを自動生成することでこの負担を軽減します。

Q2: Cucumber は従来のテストフレームワークとどう違うのですか?

A: 従来のフレームワーク (Jest、Mocha) は技術的な実装に焦点を当てています。Cucumber はビジネスの振る舞いに焦点を当てています。同じ Cucumber シナリオで、Gherkin テキストを変更することなく、Web UI テスト (Selenium)、API テスト (Axios)、モバイルテスト (Appium) を駆動できます。

Q3: Cucumber は API テストツールを置き換えられますか?

A: Cucumber はテスト構造を提供しますが、API 呼び出し (Axios、Supertest) を実行し、レスポンスを検証するためのツールは依然として必要です。Apidog は、API 実行レイヤーを処理することで Cucumber を補完し、Cucumber は BDD ワークフローを管理します。

Q4: 良い Cucumber シナリオとはどのようなものですか?

A: 良いシナリオは、独立しており、ビジネス言語を使用し、Given-When-Then 構造に従い、それぞれが単一の振る舞いをテストします。非技術的な関係者でも読めるようにし、システムが何をするか(how ではなく what)に焦点を当てるべきです。

Q5: Apidog は BDD テストで認証をどのように処理しますか?

A: Apidog は認証トークンを自動的に管理します。「Given I am authenticated」のようなステップを定義でき、Apidog の認証情報管理を使用して有効なトークンを取得することで、ステップ定義での手動によるトークン処理を排除できます。

結論

BDD テストに Cucumber を効果的に使用することは、技術チームとビジネスチームの間で共通理解を生み出すことで、開発プロセスを変革します。Gherkin 構文は明確さを強制し、シナリオとステップ定義の分離により、アプリケーションの進化に合わせてテストを保守しやすくなります。

真の力は、Cucumber を最新の自動化ツールと統合することから生まれます。Apidog は、API テストコードの作成という面倒な手作業を排除し、意味のある振る舞いの定義に集中できるようにすると同時に、実行を処理します。この組み合わせは、人間が読める仕様が「生きたドキュメント」として機能し、堅牢な自動テストが継続的に実行されるという、両方の長所をもたらします。

小さく始めてください。API エンドポイントを一つ選び、成功、失敗、エッジケースの3つのシナリオを作成します。ステップ定義を実装し、実行します。その結果をプロダクトオーナーに見せましょう。ビジネス要件がテストとして実行されるのを見れば、プロジェクト全体に BDD を展開することへの賛同を得られるでしょう。そのとき、BDD テストに Cucumber を使用することは、単なる技術的な実践ではなく、チーム全体の品質向上運動となるのです。

ボタン

ApidogでAPIデザイン中心のアプローチを取る

APIの開発と利用をよりシンプルなことにする方法を発見できる