behatエクステンション作成

2015-06-26
PHP
Behat
extension

アウトライン

  • composer対応のライブラリとしてbehatエクステンションを作成
  • behatエクステンションをbehatで自己テストするfeatureを作ると捗る
  • サンプルとして下記のRestApiテスト用エクステンションを取り上げる https://github.com/hanhan1978/RestApiExtension

extensionで用意するファイル群

1
2
3
4
5
6
7
8
9
src
├── Context
│   ├── Initializer
│   │   └── RestApiAwareInitializer.php
│   └── RestApiContext.php
└── ServiceContainer
└── RestApiExtension.php

3 directories, 3 files
  1. ServiceContainer behatがエクステンションロード時に最初に読み込みに行く。
  2. Initializer behatcontextの橋渡しをする。 エクステンションの設定情報をcontext側に渡す処理等はココに記述。
  3. Context 具体的なbehatのStepが記述されている。

behat実行時のエクステンションの読み込まれ方。

extensionsの設定

1
2
3
4
5
6
7
8
9
10
11
12
default:
extensions:
BehatRestApiExtension:
base_url: http://127.0.0.1:3000/
suites:
default:
contexts:
- 'BehatRestApiExtensionContextRestApiContext'

paths:
features: features
bootstrap: %behat.paths.features%/bootstrap
  • default->extensions ココに記述されたBehat\RestApiExtensionがエクステンション名 behatのExtensionManagerはこの名前を起点としてエクステンションのロードを行う。
  • default->contexts 読み込むcontextを指定する。 extensionsを指定していても、contextを指定しないと、シナリオは読み込まれない。

extensionがロードされていくイメージ

  1. behatが実行されて、behat.ymlに記述されたextensionsをロード開始する。 => 指定されたエクステンション名 + \ServiceContainer\エクステンション名を読み込む
  2. ServiceContainer => behat.ymlに記述されたextensionsの設定内容を定義 => Initializerを指定
    ここまでで、エクステンションのロードは完了。
  • Initializerは、contextのシナリオ実行時に、都度呼び出される。
  • contextは、behat.ymlsuitesで指定されれば、実行可能な状態になる。

extensionの作成

前提

  • composerのライブラリとして作成します。
  • エクステンションの本体コードはsrc配下です。
  • testディレクトリは、テスト用にSilexで作ったアプリが入ってます。
  • featuresには、エクステンション自体をテストするbehatのテストが入ってます。
  • psr-4に準拠します。
    以下で、それぞれのファイルの鍵となるポイントを書きます。

ServiceContainer

src/ServiceContainer/RestApiExtension

  • getConfigKey() エクステンショ毎にユニークなconfigのキー値を指定します。
  • configure() ここで指定したパラーメータが、behat.ymlで指定可能となります。
  • loadContextInitializer Initializerをここで指定します。

Context/Initializer

src/Context/Initializer/RestApiAwareInitializer

  • コンストラクタ 引数のparameters配列に、behat.ymlで指定した設定値が渡されます。
  • initializeContext 各context実行前に呼び出されるメソッドです。 このメソッドで、設定値をcontextに受け渡します。

Context/

src/Context/RestApiContext 実際のシナリオを記述したファイルです。

extension作成時のtips

エクステンション自体をテストするfeaturesを用意して、./bin/behat -dlとかやって、動作確認しながら作っていきます。 BDDでTDDしながら、エクステンションを作成するのは、すごい捗る。 実際にエクステンションを使う時は、packagistに登録するか、リポジトリ直接指定とかでcomposer経由で目的のプロジェクトにエクステンションをロードしましょう。

まとめ

  • behatのエクステンション作成は、作るファイルは最小構成で3つだけ。
  • エクステンション作成自体をBDDしながら作ると捗る
  • 簡単だす。