Gherkin入門2026年7月31日 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
はじめにこのドキュメントは、Gherkin(ガーキン)の基本的な構文・キーワード・書き方を体系的に学ぶための入門書です。実際の 第1章: Gherkinとは何か1.1 Gherkinの概要Gherkin は、ソフトウェアの振る舞いを記述するための言語です。Cucumberプロジェクトによって開発され、構造化された自然言語(主に英語)を使って、テストの仕様を記述します。 Gherkinの最大の特徴は、技術的な詳細を最小限に抑え、ビジネスの文脈で仕様を記述できる点です。これにより、開発者、QA、ビジネス担当者(プロダクトオーナー等)が同じ言語で対話することができます。 1.2 振る舞い駆動開発(BDD)との関係Gherkinは、振る舞い駆動開発(Behavior-Driven Development: BDD) のための仕様記述言語です。 BDDとは、テスト駆動開発(TDD)を発展させた開発手法で、「ソフトウェアがどのような振る舞いをするべきか」に焦点を当てます。
BDDはTDDに「仕様記述の言語」と「三者協業」を加えたものです。Gherkinは、この「振る舞い」を記述するための手段を提供します。
1.3 なぜGherkinを使うのかGherkinを使う主なメリットは以下の通りです:
1.4
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| キーワード | 役割 | 備考 |
|---|---|---|
Feature: |
機能の説明 | 必須、ファイルの先頭に1つだけ |
Scenario: / Example: |
具体的なテストケース | 複数可能 |
Given |
事前条件(初期状態) | 初期状態を記述 |
When |
アクション(イベント) | ユーザー操作やシステムイベント |
Then |
結果(期待値) | 観測可能な出力を記述 |
And |
接続詞 | 直前のキーワードの継続 |
But |
接続詞 | 直前のキーワードの継続(否定や対比) |
* |
アスタリスク | Given/When/Then/And/But の代用 |
# で始まる行はコメントとして扱われます:
Feature: 単語当てゲーム
# これはコメントです。テスト実行時には無視されます。
Scenario: 作成者がゲームを始める
When 作成者がゲームを始める
# この行もコメント
Then 作成者は参加者を待つ
Gherkinでは、スペースとタブの両方がインデントに使用できますが、2スペースのインデントが推奨されます:
Feature: ブログ投稿
# 2スペースインデントが推奨
Scenario: 投稿する
When ブログに投稿する
Then 投稿が公開される
Feature:, Scenario:, Background:, Rule: の直後に、自由な説明文を書くことができます。これらの説明文はテスト実行時には無視されますが、Cucumber HTML Formatterなどのレポートツールで表示・活用されます:
Feature: 単語当てゲーム
2人のプレイヤーが参加するターン制のゲームです。
作成者が単語を選び、当てる側がそれを推測します。
当てる側が作成者の単語を当てたらゲーム終了です。
Scenario: ゲーム開始
When 作成者がゲームを始める
Then 当てる側が参加するのを待つ
説明文ではMarkdown形式もサポートされています。
Gherkinのキーワードには、コロンの後についているものとついていないものがあります。これを間違えると、テストが実行されなくなります。
コロンが必要なキーワード:
Feature:Scenario: / Example:Background:Rule:Scenario Outline: / Scenario Template:Examples: / Scenarios:コロンが不要なキーワード:
GivenWhenThenAndBut*# 正しい書き方
Feature: 単語当てゲーム
Scenario: ゲーム開始
Given ゲームが準備できている
When 作成者がゲームを開始する
Then 参加者が待機中になる
# 間違い: Given, When, Thenにはコロン不要
# Given: ゲームが準備できている ← これは無視される!
Given は、シナリオの初期状態(事前条件)を記述します。システムがどのような状態で始まるかを定義します。
Givenの役割: システムを既知の状態に配置する
Scenario: 銀行口座の残高照会
Given 口座の残高が430ポンドである
When 残高を確認する
Then 残高が430ポンドと表示される
Givenの例:
Given ユーザーAとしてログインしているGiven 商品が在庫10個あるGiven 3人のプレイヤーが参加している注意点:
Andを使うと読みやすくなるScenario: ブログ投稿
Given "ユーザーA"としてログインしている
And "ブログA"が存在する
And "ブログA"に3件の投稿がある
When "ブログA"に新しい投稿をする
Then 投稿が公開される
When は、システムに対して行われるアクション(イベント)を記述します。ユーザーの操作や、外部システムからのイベントなどを表します。
Whenの役割: システムに対するイベントやアクションを記述する
Scenario: 商品購入
Given カートに商品が3個入っている
When 購入ボタンを押す
Then 購入完了画面が表示される
Whenの例:
When 商品を検索するWhen 会員登録をするWhen 期限が過ぎる注意点:
Then は、アクション実行後に期待される結果を記述します。これは観測可能な出力であるべきです。
Thenの役割: システムの期待される振る舞いを記述する
Scenario: 商品検索
Given 商品カタログに100件の商品がある
When "ノートパソコン"を検索する
Then 関連商品が5件表示される
Thenの例:
Then 商品が5件表示されるThen エラーメッセージが表示されるThen メールが送信される注意点:
And と But は、直前のキーワードの継続を示すために使います。可読性を高める効果があります。
Scenario: 複数条件のテスト
Given 口座に1000円入っている
And 限度額が5000円である
When 3000円を引き出す
Then 残高が7000円になる
And 取引履歴に記録される
And: 直前の条件/アクション/結果の追加But: 直前の条件/アクション/結果との対比や例外Scenario: 制限のテスト
Given 年齢が18歳未満である
When 会員登録をする
Then 登録が拒否される
But 管理者は登録できる
* は、Given, When, Then, And, But のいずれのキーワードの代わりにも使えます。リスト形式の記述に便利です。
Scenario: お買い物体験
Given お出かけ中
* 卵を持っている
* 牛乳を持っている
* バターを持っている
When ショッピングリストを確認する
Then 何も買うものがない
この場合、* は Given の継続として扱われます。
各シナリオのステップ数は3-5ステップが推奨されます。
長いシナリオが必要な場合は、Background(第5章)やScenario Outline(第6章)を検討しましょう。
Gherkinで重要なのは、ドメイン言語(その業界・ドメイン特有の言葉)を使うことです。技術用語や実装の詳細ではなく、ビジネスの文脈で使われる言葉で記述します。
# 良い例: ドメイン言語
Feature: 銀行口座
Scenario: 入金
Given 口座の残高が10000円である
When 5000円を入金する
Then 残高が15000円になる
# 避けるべき: 技術用語
Feature: 銀行口座
Scenario: 入金処理
Given account.balance = 10000
When call deposit(5000)
Then assert account.balance == 15000
Gherkinの仕様には、技術的な実装の詳細は含めません。実装の詳細は、step definition(実装コード)に隠蔽します。
# 良い例: ユーザーの視点
When 商品を検索する
Then 関連商品が表示される
# 避けるべき: UIの詳細
When 検索ボックスに"ノートPC"を入力してEnterを押す
Then 検索結果リストに5件表示される
Gherkinの仕様を記述する際、「1922年にいたつもりで」と想像してみてください。1922年にはコンピュータもインターネットもありません。その前提で、どのように仕様を記述するかを考えます。
この原則により、技術に依存しない、普遍的な仕様が書けるようになります。
# 1922年想像: 手動で処理を想像
Feature: メール送信
Scenario: メールを送信する
Given 差出人と宛先が指定されている
And 本文が書かれている
When 送信を依頼する
Then 宛先にメールが届く
第2.4章で解説した通り、キーワードによるコロンの有無が異なります:
# 誤り: Givenにコロンをつけている
Given: 残高が1000円である ← 無視される!
# 正しい
Given 残高が1000円である
Gherkinでは、キーワードを除くステップのテキストが重複すると、エラーになります:
# 誤り: 重複するステップ
Given 残高が1000円である
Then 残高が1000円である ← これは重複とみなされる!
# 正しい: 明確に区別する
Given 口座に1000円が入っている
Then 残高は1000円と表示される
Gherkinの仕様を書く際、以下の点をチェックしましょう:
Background は、複数のシナリオで共通の事前条件を記述するための機能です。各シナリオの先頭に同じGivenステップを繰り返す必要がなくなります。
Feature: ブログ投稿
Background:
Given "ユーザーA"としてログインしている
And "ブログA"が存在する
Scenario: 投稿する
When "ブログA"に投稿する
Then 投稿が公開される
Scenario: 下書き保存
When "ブログA"を下書き保存する
Then 下書きが保存される
Background は、同じFeature内の全シナリオで共通の事前条件がある場合に使用します。Backgroundに記述されたGivenステップは、各シナリオの実行前に自動的に実行されます。
Background は便利な機能ですが、使いすぎには注意が必要です。
Background は共通の事前条件を記述するための機能ですが、複雑な状態のセットアップには使わないほうが良いです:
# 避けるべき: Background に複雑な状態
Background:
Given ユーザーAが作成したブログAがある
And ユーザーBが作成したブログBがある
And 管理者Cがいる
And 3件の記事がブログAにある
And 5件の記事がブログBにある
... 長くなる
# 良い: 高レベルのステップを使う
Background:
Given サイトに管理者と一般ユーザーがいる
And 各ユーザーがブログを持っている
Background は短く保つことが重要です。以下の点を意識しましょう:
Background は具体的で記憶に残る名前を使うと良いでしょう:
# 良い例: 具体的な名前
Background:
Given "Alice"という管理者がいる
And "Bob"というユーザーがいる
# 避けるべき: 抽象的な名前
Background:
Given "Admin A"がいる
And "User B"がいる
人間の脳はストーリーを覚えるのが得意です。抽象的な名前(“User A”, “Site 1”など)よりも、具体的な名前を使う方がシナリオの意味をより理解しやすくなります。
Feature: ブログ投稿
ブログ所有者のみが自分のブログに投稿できます。ただし、管理者は
すべてのブログに投稿できます。
Background:
Given グローバル管理者 "Greg" がいる
And "Greg's anti-tax rants" というブログがある
And "Dr. Bill" というユーザーがいる
And "Dr. Bill" が所有する "Expensive Therapy" というブログがある
Scenario: Dr. Bill が自分のブログに投稿
Given Dr. Bill としてログインしている
When "Expensive Therapy" に投稿する
Then "Your article was published." と表示される
Scenario: Dr. Bill が他人のブログに投稿しようとして失敗
Given Dr. Bill としてログインしている
When "Greg's anti-tax rants" に投稿する
Then "Hey! That's not your blog!" と表示される
Scenario Outline は、同じシナリオを異なるデータで複数回実行するための機能です。類似したシナリオを1つにまとめて記述できます。
Scenario Outline: きゅうりを食べる
Before <start>本あるきゅうりを食べる
When <eat>本食べる
Then <left>本残る
Examples:
| start | eat | left |
| 12 | 5 | 7 |
| 20 | 5 | 15 |
<パラメータ名> 形式でプレースホルダを記述します。このパラメータは、後続のExamplesテーブルの値で置換されます。
Scenario Outline: 商品の割引
Given 商品の価格が<price>円である
When <discount>%の割引をする
Then 最終価格が<final_price>円になる
Examples:
| price | discount | final_price |
| 1000 | 10 | 900 |
| 2000 | 20 | 1600 |
| 500 | 5 | 475 |
Examplesテーブルは、パラメータに設定する値の組み合わせを定義します。
Scenario Outline: 引き算のテスト
Given <a>がある
When <b>を引く
Then <result>が残る
Examples:
| a | b | result |
| 5 | 3 | 2 |
| 10| 4 | 6 |
| 8 | 8 | 0 |
パラメータは以下の場所で使用できます:
Scenario Outline: "<user>"のログインテスト
Given "<user>"としてログインしている
When "<page>"にアクセスする
Then "<message>"が表示される
Examples:
| user | page | message |
| admin | ダッシュボード | 管理画面が表示される |
| user1 | プロフィール | プロフィールが表示される |
Scenario Outline: eating cucumbers
Given there are <start> cucumbers
When I eat <eat> cucumbers
Then I should have <left> cucumbers
Examples:
| start | eat | left |
| 12 | 5 | 7 |
| 20 | 5 | 15 |
Data Tablesは、表形式のデータをステップに渡すための機能です。|(パイプ)でセルを区切ります。
Feature: ユーザー管理
Scenario: ユーザーを一括作成
Given 以下のユーザーが存在する:
| name | email |
| 山田 | yamada@example.com |
| 鈴木 | suzuki@example.com |
| 高橋 | takahashi@example.com |
Data Tablesのセル内で特殊文字を使う場合、以下のエスケープシーケンスを使用します:
| エスケープ | 意味 |
|---|---|
\n |
改行 |
\| |
パイプ記号 |
\\ |
バックスラッシュ |
Feature: テキスト処理
Scenario: 特殊文字のテスト
Given 以下のテキストがある:
| content |
| 複数行\nのテキスト |
| パイプ\|記号 |
| バックスラッシュ\\ |
Feature: 商品管理
Scenario: 商品を一括登録
Given 以下の商品が存在する:
| name | price | stock |
| ノートPC | 98000 | 10 |
| マウス | 3500 | 100 |
| キーボード | 8500 | 50 |
Scenario: 在庫チェック
When 各商品の在庫を確認する
Then 以下の在庫数が表示される:
| name | stock |
| ノートPC | 10 |
| マウス | 100 |
| キーボード | 50 |
Doc Stringsは、複数行のテキストをステップに渡すための機能です。"""(トリプルクォート)または ```(バックティック)で囲みます。
Feature: ブログ投稿
Scenario: Markdown投稿
Given "タイトル"という名前のブログ投稿
And 以下のMarkdown本文:
"""
# はじめに
ここに本文を書きます。
"""
Doc Stringsには、コンテンツのタイプを指定できます。""" の直後にタイプ名を記載します:
Feature: ブログ投稿
Scenario: HTML投稿
Given 以下のHTML本文:
"""html
<h1>タイトル</h1>
<p>本文の内容</p>
"""
Scenario: JSONデータ
Given 以下のJSONデータ:
"""json
{
"name": "山田",
"age": 30
}
"""
コンテンツタイプを指定することで、エディタのシンタックスハイライトが有効になる場合があります。
Feature: ブログ投稿
Scenario: Markdown投稿
Given "Random"という名前のブログ投稿
And 以下のMarkdown本文:
"""
Some Title, Eh?
===============
Here is the first paragraph of my blog post.
"""
Rule は、ビジネスルールをグループ化するための機能です。
Ruleを使うと、関連するシナリオを論理的にグループ化できます:
Feature: 高齢者割引
Rule: 65歳以上のユーザーは10%割引
Scenario: 65歳のユーザー
Given 年齢が65歳である
When 商品を購入する
Then 10%の割引が適用される
Scenario: 64歳のユーザー
Given 年齢が64歳である
When 商品を購入する
Then 割引は適用されない
Rule: 会員は5%割引
Scenario: 会員
Given 会員である
When 商品を購入する
Then 5%の割引が適用される
RuleにもBackgroundを記述できます。Rule内の全シナリオに共通の事前条件を記述します:
Feature: 期限切れタスクの通知
Rule: ユーザーは1日の最初の利用時に期限切れタスクの通知を受ける
Background:
Given 期限切れのタスクがある
Scenario: 1日の最初の利用
Given 昨日最後にアプリを使用した
When アプリを使用する
Then 期限切れタスクの通知を受ける
Scenario: 既にその日に使用済み
Given 今日既にアプリを使用した
When アプリを使用する
Then 期限切れタスクの通知を受けない
# language: ディレクティブGherkinファイルの先頭に# language: ディレクティブを記載すると、そのファイルで使用される言語を指定できます:
# language: ja
フィーチャー: 単語当てゲーム
シナリオ: 作成者がゲームを始める
もし 作成者がゲームを開始したら
ならば 作成者は参加者を待つ
Gherkinは70以上の言語に翻訳されています。日本語では以下のキーワードが使えます:
| 英語 | 日本語 |
|---|---|
| Feature | フィーチャー |
| Scenario | シナリオ |
| Given | 前提 |
| When | もし |
| Then | ならば |
| And | そして |
| But | しかし |
ただし、実務では英語キーワードを使うのが一般的です。日本語キーワードを使う場合は、チーム内で統一することが重要です。
# language: ディレクティブは不要(デフォルトが英語)# language: en
Feature: 機能の説明
機能の詳細な説明(省略可能)
Background:
Given 共通の事前条件1
And 共通の事前条件2
Scenario: シナリオ1
Given 事前条件1
And 事前条件2
When アクション
Then 結果1
And 結果2
Scenario: シナリオ2
Given 別の事前条件
When 別のアクション
Then 別の結果
Scenario Outline: パラメータ化されたシナリオ
Given <パラメータ1>がある
When <パラメータ2>をする
Then <結果>が得られる
Examples:
| パラメータ1 | パラメータ2 | 結果 |
| 値1 | 値A | 結果1 |
| 値2 | 値B | 結果2 |
| キーワード | 用途 | コロン |
|---|---|---|
Feature: |
機能の説明 | 必要 |
Scenario: |
テストケース | 必要 |
Given |
事前条件 | 不要 |
When |
アクション | 不要 |
Then |
結果 | 不要 |
And |
接続詞 | 不要 |
But |
接続詞(対比) | 不要 |
* |
任意のステップ | 不要 |
Background: |
共通事前条件 | 必要 |
Scenario Outline: |
パラメータ化シナリオ | 必要 |
Examples: |
テーブルデータ | 必要 |
Rule: |
ビジネスルール | 必要 |
データテーブルを使う場合:
Given 以下のデータがある:
| key | value |
| a | 1 |
| b | 2 |
Doc Stringsを使う場合:
Given 以下の内容:
"""
複数行のテキスト
ここに続く
"""