Cucumberでテストを書くときのポイント

More than 3 years have passed since last update.


はじめに


  • Cucumberでテストを書く場合、featureファイルとstepファイルをそれぞれ工夫する必要がある

  • ここではこんな風に工夫して書いたらいいよと思うものを書き残していく


featureファイルの工夫


  • ①同じようなシナリオを複数書くような場合、シナリオアウトラインを使う

# シナリオだけで書く場合

シナリオ: Facebookにログインする
 前提 "Facebook"にログインできるアカウントを用意する
 もし "Facebook"のログインページを表示する
 かつ ログインする
ならば "Facebook"にログインできる

シナリオ: Twitterにログインする
 前提 Twitterにログインできるアカウントを用意する
 もし "Twitter"のログインページを表示する
 かつ ログインする
ならば "Twitter"にログインできる

-------------------------------------------------------

# シナリオアウトラインで書く場合
シナリオアウトライン: SNSにログインする
 前提 "<SNS>"にログインできるアカウントを用意する
 もし "<SNS>"のログインページを表示する
 かつ ログインする
ならば "<SNS>"にログインできる

 例:
  |SNS |
  |Facebook|
  |Twitter |


  • ②表(table)を使う


    • featureファイルの見易さをあげるワザの1つ

    • 受け取ったtableはstepファイルからtable.hashesで取り出せる



# 表を使わないで書く場合

もし 某サービスに"1MB"の"PNG"ファイルを"2"つアップロードする
かつ 某サービスに"5KB"の"JPG"ファイルを"3"つアップロードする

# 表を使って書く場合
もし 某サービスにファイルをアップロードする:
 | ファイルサイズ | ファイルの種類 | アップロード数 |
 | 1MB      | PNG      | 2       |
 | 5KB      | JPG      | 5       |


stepファイルの工夫


  • ①キーワードだけ違う似たようなステップを定義する場合は、正規表現のマッチングを使う


    • 1つのステップで書ける



# (例1)

# 正規表現を使わずベタに書く場合
When /^Facebookにログインする$/ do
end

When /^twitterにログインする$/ do
end

# 正規表現でのマッチングで書く場合
When /^"([^\"]*)"にログインする$/ do |sns|
end

-------------------------------------------------------

# (例2)
# 正規表現を使わずベタに書く場合
When /^Facebookにアカウント登録されているユーザを準備する$/ do
end

When /^Facebookにアカウント登録されていないユーザを準備する$/ do
end

-------------------------------------------------------

# 正規表現でのマッチングで書く場合
When /^Facebookにアカウント登録されてい(る|ない)ユーザを準備する$/ do |regist|
end


  • ②50音順で定義する


    • どこに書いたか迷子にならなくて済む

    • 似たようなキーワードを使って書いたステップが近くにあるとステップの追加/変更も楽チン



  • ③hookを利用する


    • hookは以下のように書くとシナリオやステップの前後に処理を挟める

    • hookはfeatures配下ならどこでも定義できるけど、features/support/hooks.rbに書くのがおすすめらしい



# Before : シナリオの前

# After : シナリオの後
# AfterStep : ステップの後

Before do
puts "シナリオの前にする処理"
end

Before("@hoge") do # タグ指定もできる
puts "指定したタグがついたシナリオの前にする処理"
end


  • ④できるだけ小さなステップを作る


    • ボリュームのあるステップ作ってしまうと手を加えないとこのままでは使えないという事態が発生する

    • 小さなステップにしておけば、そのまま使いたい時も新たなステップを定義したい時もコピペだけで済む

    • 再利用性が高いという特性を活かす最大のポイント




~ただの宣伝~


  • 全国のSeleniumer必読

  • Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください