Cucumber を実際のプロダクトに入れてみた
現在開発中のネットショップのテストに Cucumber を使ってみました。やはり、実際のプロダクトに入れるとサンプルで試してみた時になかった問題が次々と発生し、楽しかったです (::) (::)
発生した問題と対応
ラベルがない!
Cucumberのシナリオは "名前"に"吉田"と入力する のように ラベルの文字列でinputタグを指定しますが、Scaffold等で作ったフォーム以外では、ラベルが付いてない場合が多々ありましたので追加しました。
inputタグの指定が難しい入力フォーム
inputタグが動的に作られ、テストで判りやすいラベル指定の出来ない入力フォームの場合は専用の steps を作るのが良いようです。
When /^"([^\"]*)"番目の注文欄に"([^\"]*)"と入力する$/ do |no, value| When %Q(I fill in "quantities_#{no}" with "#{value}") end
画像ボタン(input type="image") が上手く指定できない
input type="image" (Railsでは image_submit_tag) の指定には WebratのRDocc (Cucumberは内部でWebratを使っています)によると value=しか使えない事になっていますが、ソースを見ると id, alt 等の属性が使えます。しかし、今回のアプリでは 人間に判りやすい属性としては title= しか付けていませんでした。
いろいろと考えましたが、 今回は :title=>を指定すると :alt=>にも同じ文字列が指定されるhelperメソッドを作って対応しました。
The error occurred while evaluating nil.submitエラー発生
通常、ラベルの文字列でinputを指定した場合に対応するタグが見つからない場合は、Could not find field: "XXXX" と表示されますが、上のエラーは理由がなかなか解りませんでした。しかし、検索したら同じ間違いをしていた人の記事がありました ^^)
答えは 以下のように form と div の対応が間違っていた事でした。 ブラウザーはこういう間違いに寛容ですがWebratは厳しいようです。
<div ...> <form ....> .... </div> </form>
Cucumberの便利な使い方
steps の中でstepsを呼び出せる
シナリオには同じような記述が並びがちですが、それを1つのstepにまとめる事ができます。その際には、シナリオの記述を持ってきてWhenなどを付ければ OK です。
When /^ここで、支払い情報を入力する/ do When %!"支払い方法"から"代引き"を選択する! When %!"配達希望日"から"明後日"を選択する! When %!"配達希望時間"から"午前中"を選択する! When %!"ご要望、ご相談等がありましたらお書き下さい。"に"配送は早い時間を希望"と入力する! end
Fixture
当たり前ですが、Fixture が使えます。 ただし設定が少し必要です 詳細はこちら
Email Spec
以前も書きました が、Email Spec は便利です。 ただし、バージョンが 0.3.X になり script/generate email_specが必要になりました。
Transform
シナリオにちょっとしたマクロ(?)を埋め込める Transformを使うと気の利いたシナリオが書けます。下の例では 明後日が実際の明後日の日付に置き換わってテストされます。
シナリオ
かつ "配達希望日"から"明後日"を選択する
steps
Transform /明後日/ do |step_arg| (Time.now.since 2.day).strftime("%m月%d日") end
まとめ
CucumberはRSpecと比べると、まだ熟れてない感じをところどころで受けますが、人間の言葉でインテグレーションテストが書ける素晴らしさには換えられません。
みんなで Cucumber を育てて行きましょう (::)(::)(::)