15分で作れるbehatテスト - e2e編

2015-06-26
PHP
Behat

15分で完成します。

出来るんです!むしろお釣りが来ます!

準備

  • PHP(5.3.1以降) よく訓練されたペチパーであれば5.6を使っているはずなので、問題ない。
  • composer よく訓練されたペチry)
  • テスト対象のWebアプリ 既存Webアプリでテストが無いやつをご用意下さい。いっぱいあるでしry)

オーバービュー

E2Eテストを別プロジェクトとして、作成する想定。 練習なので、まずはbehatが利用する最低限のファイル群について、知ってほしい。 Behatは3系を使います。

ファイル構成

1
2
3
4
5
6
7
8
9
10
11
12
.
├── behat.yml
├── bin
│   └── behat -> ../vendor/behat/behat/bin/behat
├── composer.json
├── composer.lock
└── features
├── bootstrap
│   └── FeatureContext.php
└── sample.feature

3 directories, 6 files

この中で、自分で編集作業を行うファイルは、以下の3つ

  1. composer.json
  2. behat.yml
  3. features/sample.feature

ざっくりとした説明

  1. composer.json
    behatMinkExtentioncomposer経由でダウンロードします。
    MinkExtentionはウェブのE2Eテスト用のextensionです。
  2. behat.yml
    いわゆるbehatの設定ファイルです。
    behatコマンド実行時に引数で指定しない場合は、デフォルトでこのファイルが読み込まれます。
  3. features/sample.feature
    テスト用のシナリオをGherkin発音(gˈɚːkɪn)形式で記述します。

編集はしないけど、知っておいてほしいファイル

  • features/bootstrap/FeatureContext.php
    テスト用のシナリオ実行用関数は、ここに記述します。
    今回は、MinkExtentionのものをそのまま使うので、デフォルトのままです。

テスト作成への道のり

上記3ファイルを手順に沿って、機械的に編集していけばOK。 細かい注意事項については、本ポストの最後にリストアップしておきます。

実作業

最初にsampleとか何でもいいのですが、プロジェクトのルートディレクトリを作成して下さい。
以下の手順は、そのルートディレクトリ内で行います。

1. composer.jsonの作成とcomposerの実行

composer.json

1
2
3
4
5
6
7
8
9
10
11
{
"require": {
"behat/behat": "~3.0.15",
"behat/mink": "*",
"behat/mink-extension": "*",
"behat/mink-goutte-driver": "*"
},
"config": {
"bin-dir": "bin/"
}
}

下記のコマンドで、ライブラリー群をインストール

1
composer install

composerが分からない人は、反省する。
実行後は、binディレクトリ内にbehatコマンドのシンボリックリンクが出来ていることを確認して下さい。

2. behat.ymlを作成し、initコマンドを実行する。

behat.yml

1
2
3
4
5
6
7
8
default:
extensions:
Behat\MinkExtension:
base_url: http://www.yahoo.co.jp/
goutte: ~
paths:
features: features
bootstrap: %behat.paths.features%/bootstrap

今回は最小限で、かつ基本に忠実な内容です。 featuresのpathはデフォルトと同じでfeaturesです。
bootstrapのディレクトリ指定時に%%で囲まれている部分は、動的にbehatの設定内容を参照しています。

今回の場合は、すぐ上で定義されているfeaturesの内容を指しています。
behat.ymlを作ったら、下記のコマンドを実行して、基本的なfeaturesの雛形を作ります。

1
./bin/behat --init

コマンド実行後は、features,features/bootstrapというディレクトリが作成されていて、bootstrapディレクトリ内にFeatureContext.phpが出来ていることを確認して下さい。

3. behat.ymlにextensionの読み込みを追記する。

まず、試しに以下のコマンドを実行して下さい。

1
./bin/behat -dl

これは、behatで使えるStepを一覧表示するコマンドです。 何も表示されないはずです。

自動生成されたFeatureContextは、空の状態です。 MinkExtensionについても、Contextの利用をbehat.ymlに記述していないので、表示されません。 MinkExtensionのE2Eテスト用Stepを利用するために、behat.ymlを少し修正します。 修正後のbehat.yml

1
2
3
4
5
6
7
8
9
10
11
12
default:
extensions:
Behat\MinkExtension:
base_url: http://www.yahoo.co.jp/
goutte: ~
suites:
default:
contexts:
- 'Behat\MinkExtension\Context\MinkContext'
paths:
features: features
bootstrap: %behat.paths.features%/bootstrap

もう一度、下記のコマンドを実行して下さい。

1
./bin/behat -dl

ずらずら〜っと、Stepが出てきたと思います。 この時、もしStepが日本語で表示されている場合は、言語のオプションを付けて下さい。

1
behat -dl --lang en

※個人的な好みですが、英語でシナリオ書くほうが見通しが良くて好きです・・・。

4. features/sample.feature

sample.featureは適当な命名に変更して構いません。拡張子が.featureであれば問題ないです。
今回は、サンプルとしてyahooファイナンスにアクセスして、銘柄コードを確認するテストを書きます。

※Yahooの人怒ったら、教えて下さい。違うのに変えます・・・。

1
2
3
4
5
6
7
8
9
10
# language : en

Feature: stock code check

Scenario: check stock code
Given I am on the homepage
When I follow "ファイナンス"
When I fill in "searchText" with "九州電力"
When I press "searchButton"
Then I should see "9508"

Featureは.featureファイルに一度だけです。
テストケースを増やす時は、Scenarioを増やして下さい。 Gherkinの文法は下記の本家docを参照下さい。

Gherkin

behatコマンドを実行します。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ ./bin/behat
Feature: stock search

Scenario: get stock code # features/sample.feature:5
Given I am on the homepage # BehatMinkExtensionContextMinkContext::iAmOnHomepage()
When I follow "ファイナンス" # BehatMinkExtensionContextMinkContext::clickLink()
When I fill in "searchText" with "九州電力" # BehatMinkExtensionContextMinkContext::fillField()
When I press "searchButton" # BehatMinkExtensionContextMinkContext::pressButton()
Then I should see "9508" # BehatMinkExtensionContextMinkContext::assertPageContainsText()

1 scenario (1 passed)
5 steps (5 passed)
0m0.87s (13.76Mb)

上手くいっていれば、このように実行結果が表示されます。
後は、同じ要領でシナリオを追加すれば、テストが増やせます。簡単ですね!

まとめ

E2Eテストが、PHPのみをつかって、こんなにも簡単に、スピーディにつくれてしまいました。
こんなに簡単だと、もはや使わない理由が見当たらないですね。