アウトライン
- composer対応のライブラリとしてbehatエクステンションを作成
- behatエクステンションをbehatで自己テストするfeatureを作ると捗る
- サンプルとして下記のRestApiテスト用エクステンションを取り上げる https://github.com/hanhan1978/RestApiExtension
extensionで用意するファイル群
1 | src |
ServiceContainer
behat
がエクステンションロード時に最初に読み込みに行く。Initializer
behat
とcontext
の橋渡しをする。 エクステンションの設定情報をcontext
側に渡す処理等はココに記述。Context
具体的なbehat
のStepが記述されている。
behat実行時のエクステンションの読み込まれ方。
extensions
の設定
1 | default: |
- default->extensions ココに記述された
Behat\RestApiExtension
がエクステンション名 behatのExtensionManager
はこの名前を起点としてエクステンションのロードを行う。 - default->contexts 読み込む
context
を指定する。extensions
を指定していても、context
を指定しないと、シナリオは読み込まれない。
extensionがロードされていくイメージ
behat
が実行されて、behat.yml
に記述されたextensions
をロード開始する。 => 指定されたエクステンション名 +\ServiceContainer\エクステンション名
を読み込むServiceContainer
=>behat.yml
に記述されたextensions
の設定内容を定義 =>Initializer
を指定
ここまでで、エクステンションのロードは完了。
Initializer
は、context
のシナリオ実行時に、都度呼び出される。context
は、behat.yml
のsuites
で指定されれば、実行可能な状態になる。
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しながら作ると捗る
- 簡単だす。