はじめてのBehat

2015-06-26
PHP
Behat

behat3系の使い方の流れです。

基礎知識

  • behatはあくまで、BDDのフレームワーク
  • behatそのものはテストメソッドは持ってません
  • テストメソッドは、自分で実装するか、エクステンションで導入します。
    今回は、はじめてのbehatなので、自分でテストメソッドを実装する場合を解説します。 ちなみに一番情報が詳しいのは本家サイトです。 http://docs.behat.org/en/latest/ ※ 日本語の公式ドキュメントは無いです。何もかもわからなくなったら、ソースを読みましょう。

インストール

composerでインストールします。composer.jsonは↓です。

1
2
3
4
5
6
7
8
{
"require": {
"behat/behat": "~3.0.15"
},
"config": {
"bin-dir": "bin/"
}
}

一発簡単

1
$ composer install

雛形作成

1
$ ./bin/behat --init

こんなディレクトリとファイルが出来てるはず。

1
2
3
4
5
features/
└── bootstrap
└── FeatureContext.php

1 directory, 1 file

behatはデフォルトでは実行ディレクトリ直下のfeaturesディレクトリ内の%.featureファイルを読み込みます。 features/bootstrap/FeatureContextには具体的なテストコードを書きます。

テストシナリオを書く。

featuresディレクトリ直下に、.featureという拡張子で、ファイルを作成します。

1
$ vi features/sample.feature

中身

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

Feature: Do Some Sample Testing

Scenario: ls
Given I am in the "directory"
When I execute "command"
Then I should get "file1,file2"

シナリオのポイント

  • Gherkin形式なんだということを心に刻む。
  • Featureは一つ
  • Scenarioという単位でテストを書いていく。
  • Scenario配下の3行は、Stepと呼びます。BehatはStepを実行します。
  • Step先頭のGiven, When, Thenなどは決まり文句なので、おとなしく従いましょう。
  • 動的項目はクォートで囲んでおきます。
  • 英語推奨です。

behatコマンドを実行する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
$ ./bin/behat
Feature: Do Some Sample Testing

Scenario: ls
Given I am in the "directory"
When I execute "command"
Then I should get "file1,file2"

1 scenario (1 undefined)
3 steps (3 undefined)
0m0.02s (9.13Mb)

--- FeatureContext has missing steps. Define them with these snippets:

/**
* @Given I am in the :arg1
*/
public function iAmInThe($arg1)
{
throw new PendingException();
}

/**
* @When I execute :arg1
*/
public function iExecute($arg1)
{
throw new PendingException();
}

/**
* @Then I should get :arg1
*/
public function iShouldGet($arg1)
{
throw new PendingException();
}

シナリオはあるけど、中身がないので、behatが足りないテストメソッドの雛形を出力してくれる。

FeatureContextを編集する。

1
vi features/bootstrap/FeatureContext.php

足りないと言われたメソッドを、そのままコピペ ついでに、これも追記しとく。

1
use BehatBehatTesterExceptionPendingException;

もう一回 behatコマンドを実行

1
2
3
4
5
6
7
8
9
10
11
12
$ ./bin/behat
Feature: Do Some Sample Testing

Scenario: ls # features/sample.feature:5
Given I am in the "directory" # FeatureContext::iAmInThe()
TODO: write pending definition
When I execute "command" # FeatureContext::iExecute()
Then I should get "file1,file2" # FeatureContext::iShouldGet()

1 scenario (1 pending)
3 steps (1 pending, 2 skipped)
0m0.02s (9.25Mb)

今度は、シナリオが実行されるが、最初のシナリオ(Givenのところ)で実行が止まっている。 TODO: write pending definitionというコメントが出力されていますが、これはメソッド内でPendingExceptionをスローすると表示されます。 ようするに、さっきコピペした雛形のメソッドをちゃんと実装して、テストを書いてねということです。 テストを書いて、Pendingのテストを一個ずつ実装すると、テストが完成していきます。

まとめ

駆け足で、behatのテスト作成の進め方を書きました。 behatテスト作成の流れは、以上の通りです。

  1. featureを書く
  2. behatを実行する
  3. stepのテストを実装する
    この3つの流れを繰返し、行っていくイメージです。 大したことない内容ですが、一応上記のコードはgithubに上げときます。 https://github.com/hanhan1978/behat-sample0