アウトライン
- composer対応のライブラリとしてbehatエクステンションを作成
- behatエクステンションをbehatで自己テストするfeatureを作ると捗る
- サンプルとして下記のRestApiテスト用エクステンションを取り上げる https://github.com/hanhan1978/RestApiExtension
extensionで用意するファイル群
1 | src |
ServiceContainerbehatがエクステンションロード時に最初に読み込みに行く。Initializerbehatと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で指定可能となります。loadContextInitializerInitializerをここで指定します。
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しながら作ると捗る
- 簡単だす。