2015年11月27日金曜日

[Capybara] [Turnip] 複数のエディションのテストで分岐がある場合の対応方法

Capybara + Turnipを使ってE2E(End-to-End)テストをする時に、テスト対象のサービスや製品に複数のエディションがあり、画面遷移は殆ど共通なのですが、あるエディションにだけに他のエディションにはない画面(遷移)がある場合のノウハウ。

まぁ、愚直にやるなら、各エディション分featureファイルを作れば良いのですが、DRYじゃないし、タイピングも怠いです。RSpecからテストを実行する時にパラメータを与えて分岐できたら幸せじゃないだろうか?とも考えたのですが、そのような方法は私は見つけられず、パラメータを覚えておかなければいけないのも考えてみると怠いです。

というわけで、featureファイルに全部テストデータを突っ込みつつ、分岐もすれば比較的怠くなくいけた感がありましたので方法を書いておきます。

まずは、サンプル。

やっていることは至ってシンプルです。Capybara + Turnipでは<>でシナリオ内に変数を埋め込むことができます(例で言うと<DDDする>が変数です)。この変数にfeatureファイルの最下部に記載した「例:」の各値を当てはめて逐次実行することをCapybara + Turnipは行ってくれます。例では、5行の定義がありますが、最初の一行はヘッダで変数名と同じにする必要があります。残り4行がデータになり、Capybara + Turnipは各行から値を取り出しては変数にその値を代入し、代入した結果と一致するstepを実行します。

例では上から順に「何もしない」、「何もしない」、「DDDする」、「何もしない」と定義していますので、1番目、2番目、4番目は<DDDする>というstepが"何もしない"になります。そして、3番目だけが、"DDDする"というstepになります。

stepsファイルを見ると、二つのstepだけ定義しています。"何もしない"と"DDDする"の二つです(もちろん略しているだけで、他にも"AAAする"、"BBBする"などが定義されていなければいけません)。step "何もしない"は見てのとおり何もしません。step "DDDする"は何か仕事をしています。

この様に、ステップ名全体を変数化し、"何もしない"といった様な何の処理もしない空のstepを用意することで、一部のエディションにだけ存在する画面に分岐してテストすることが一つのfeatureファイルで可能になります。殆どが同じ処理のシナリオをfeatureを分けるなどをして書く必要はないですし、テストデータ(例:の表組のデータのことです)もfeatureファイルに閉じ込めておくことができます(外部から入力を与える必要がない)。

ちなみに、例:の表組を使うためには、featureファイルにて「シナリオ」ではなく、「シナリオアウトライン」を使う必要があることに注意してください。

0 件のコメント:

コメントを投稿