まぁ、愚直にやるなら、各エディション分featureファイルを作れば良いのですが、DRYじゃないし、タイピングも怠いです。RSpecからテストを実行する時にパラメータを与えて分岐できたら幸せじゃないだろうか?とも考えたのですが、そのような方法は私は見つけられず、パラメータを覚えておかなければいけないのも考えてみると怠いです。
というわけで、featureファイルに全部テストデータを突っ込みつつ、分岐もすれば比較的怠くなくいけた感がありましたので方法を書いておきます。
まずは、サンプル。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
機能: ○○テスト | |
シナリオアウトライン: 決済ウィザードを立ち上げ、カートの決済を行う | |
前提: 決済ウィザードにアクセスする | |
もし: 決済ウィザードが表示されている | |
ならば: AAAする | |
かつ: BBBする | |
かつ: CCCする | |
かつ: <DDDする> | |
かつ: EEEする | |
例: | |
|DDDする | | |
|何もしない| | |
|何もしない| | |
|DDDする | | |
|何もしない| |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
step "何もしない" do | |
end | |
step "DDDする" do | |
click_on "カートに入れる" # DDDするの中身は適当です。この例では、例えば画面の「カートに入れる」ボタンを押します。 | |
end |
やっていることは至ってシンプルです。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ファイルにて「シナリオ」ではなく、「シナリオアウトライン」を使う必要があることに注意してください。
この様に、ステップ名全体を変数化し、"何もしない"といった様な何の処理もしない空のstepを用意することで、一部のエディションにだけ存在する画面に分岐してテストすることが一つのfeatureファイルで可能になります。殆どが同じ処理のシナリオをfeatureを分けるなどをして書く必要はないですし、テストデータ(例:の表組のデータのことです)もfeatureファイルに閉じ込めておくことができます(外部から入力を与える必要がない)。
ちなみに、例:の表組を使うためには、featureファイルにて「シナリオ」ではなく、「シナリオアウトライン」を使う必要があることに注意してください。
0 件のコメント:
コメントを投稿