アンケートご協力のお願いgihyo.jpでは,2010年度に向けて豪華プレゼントが当たる読者属性アンケートを実施しております。ご協力ください。

gihyo.jp » DEVELOPER STAGE » 連載 » Ruby Freaks Lounge » 第22回 Railsアプリの受け入れテストをCucumberで書こう

Ruby Freaks Lounge

第22回 Railsアプリの受け入れテストをCucumberで書こう

前回のおさらい

前回はCucumberの仕組みと概要について説明しました。

今回の記事では,実際にRailsアプリケーションに対してCucumberでテストを書いてみたいと思います。かなり基本的な説明になってしまいますが,手始めとしては十分だと思います。

準備

なにはともあれ,CucumberとRailsをインストールする必要があります。Cucumberはgemで公開されているのでgemコマンドを使ってインストールしましょう。cucumberは内部でWebratを使用しているのでこちらも合わせてインストールしましょう。

gem install cucumber webrat

次にRailsアプリケーションを作成し,cucumberでテストする準備を行います。script/generate cucumberを実行するといくつかファイルが作成されます。

rails cuke
cd cuke
ruby script/generate cucumber

作成されたファイルのうち,features/step_definitions/webrat_steps.rbというものがあるかと思います。これが前回説明したstepの定義が書かれているファイルです。基本的にstep_definitions以下にあるファイルはstep定義として読み込まれます。新しく自分でstepファイルを作成した場合もこのディレクトリ以下に保存します。

webrat_steps.rbは当然と言えば当然ですが日本語化されていません。せっかくのCucumberなのに,テストコードが英語では読む人も大変です。

ありがたいことに,諸橋氏が日本語のstepファイルを用意してくれるgem,misoを使用させて頂きましょう。

これで新たにfeatures/step_definitions以下にstepファイルが作成されたと思います。

実際に書く

あらかた準備が整ったところで,実際にテストコードをCucumberで書いてみたいと思います。ところで今までずっとテストコードと言ってきました。ですが,Cucumberではテストの単位にシナリオという言葉を使っています。そのため今後はテストコードではなく,テストシナリオと言っていきたいと思います。

当然ですが,Cucumberでテストシナリオを書くにあたって,どのようなアプリケーションを作るかを決めなくてはなりません。今回はあくまでCucumberのテストシナリオのサンプルとなればいいのでScaffoldで生成されるデータの入力部分をテストしてみましょう。入力するデータは「名前」「メールアドレス」「年齢」にしましょう。

では,まずはこれらの要件をテストシナリオに落しこみましょう。目指すべきゴールを最初にハッキリさせておくことはとても大事なことです。

ruby script/generate feature users

このコマンドでfeatures/manage_users.featureというファイルが作成されています。ここにテストシナリオを記述していきます。拡張子のfeatureはいくつかのテストシナリオを1つにまとめた単位のことです。例えば「ユーザを管理したい」がフィーチャとなり,その下に「ユーザの登録」や「ユーザの削除」といったテストシナリオがあるわけです。

ではさっそくmanage_users.featureにテストシナリオを記述していきましょう。ジェネレータで作成した場合,既にシナリオのサンプルが記述されていますが丸ごと消して新しく書き直してしまいましょう。サンプルは英語で記述されていましたが,全て日本語で問題ありません。

フィーチャ: ユーザを管理したい
  シナリオ: ユーザの登録
    前提 "ユーザ登録"ページを表示している
    もし "email"に"example@example.com"と入力する
    かつ "name"に"赤松 祐希"と入力する
    かつ "age"に"22"と入力する
    かつ "Create"ボタンをクリックする
    ならば "User was successfully created."と表示されていること
    かつ "example@example.com"と表示されていること
    かつ "赤松 祐希"と表示されていること
    かつ "22"と表示されていること

「前提」「もし」「ならば」はそれぞれ英語「Given」「When」「Then」と対応しています。「かつ」は「And」に対応しており,1つ前のstepと同じ扱いになります。この辺りの対応は以下の表のようになっています。

英語日本語
Featureフィーチャ
Given前提
Whenもし
Thenならば
Andかつ
Butしかし
Examples

では,先程のテストシナリオを実行してみましょう。

ruby script/cucumber -l ja

オプションは日本語を指定するためのものです。このオプションを指定しないと「前提」「もし」などが認識されず,テストシナリオが実行されません。

実行すると,まず1つ目のstepで「Can't find mapping from "ユーザ登録" to a path.」と言ったエラーが発生していると思います。これはCucumberが「ユーザ登録」が具体的にどこか判断できないために発生しているエラーです。まず,このエラーを発生させないために「ユーザ登録」がどこか設定する必要があります。

これらを設定するにはfeatures/support/paths.rbを編集する必要があります。ここではある文字列(ここでいうユーザ登録)がどのルーティングに対応するのかcase文で記述しています。

def path_to(page_name)
  case page_name
  when /ユーザ登録/
    new_user_path
  else
    raise "Can't find mapping from \"#{page_name}\" to a path.\n" +
      "Now, go and add a mapping in #{__FILE__}"
  end
end

現時点ではアプリケーションの作成を行なっていませんので,ここで指定したnew_user_pathというルーティングは存在しません。テストシナリオも書いたことなので,アプリケーションの作成にうつりましょう。とは言っても,今回はScaffoldを用いるため,簡単に終わらせてしまいます。

ruby script/generate scaffold user email:string name:string age:integer
rake db:migrate
rake db:test:prepare

今回作るアプリケーションはこれだけですので,この状態でテストシナリオを実行すれば全てグリーンになると思います。今回はScaffold前提になってしまったので,全てのstepがまとめてグリーンになりましたが,大抵は上から順に1つずつレッドからグリーンにしていく形になるはずです。

Ajaxのテスト

Cucumberは慣れてしまえば,フォームの入力や画面遷移程度であればテストシナリオを書くのは難しくありません。ですが,Ajaxで実装されているものは基本的にテストできないと思っていた方がよいでしょう。その場合は,適宜Seleniumを用いるか,JsonやXMLデータを出力するControllerのactionをRSpecでテストするなどの対応が求められます。

まとめ

今回,Cucumberのテストシナリオを書き,それらが正しく実行されるアプリケーション(Scaffoldですが)を作成しました。細かい部分は省いていますが,筆者が実際に仕事でアプリケーションを開発する流れとほぼ同じになっています。その一連の流れをなんとなくでも掴んで頂けたなら幸いです。

著者プロフィール

赤松祐希(あかまつゆうき)

株式会社RAWHIDE.所属。主にRuby及びRuby on Railsプログラマとしてアプリケーション開発を担当。

URLhttp://ukstudio.jp/
twitter:http://twitter.com/ukstudio

コメント

コメントの記入

パスサポ

多数の情報処理技術者試験対策書籍の発行実績を誇る技術評論社がお届けする,資格試験合格サイト「めざせ! 情報処理試験 パスサポ」が開設されました。

ピックアップ

サクセスストーリーに続く,快適サーバー運用管理のヒント!

データの増大,煩雑な管理,システムダウン,セキュリティなど,迫りくる課題からシステム管理者の負担を軽くするポイントを解説します。

gihyo.jp インフラエンジニア情報局

ネットワークやITにかかわるあらゆる業種で必要とされるインフラエンジニアに向けた技術情報や心構え,その魅力について多角的に紹介。

テストエンジニア ステーション

いま,ITに関わるあらゆる開発業務で注目されつつあるテスト系エンジニアをターゲットにしたコンテンツサイトを展開します。

一行クイックアンケート

gihyo.jpで取り上げてほしいネタは?

※検索はページ右上の検索ボックスをご利用ください。

その他の連載

読むウェブ ~本とインタラクション

ディスプレイで読む活字とそのインタラクション(interaction:相互作用)について,最新Webを紹介しながら読み解いていく。

いま,見ておきたいウェブサイト

この連載では,国内外の最新のウェブサイトを隔週更新で取り上げ,これら最新サイトの特徴や素晴らしい部分を,さまざまな角度から解説していきます。

Windows phoneアプリケーション開発入門

Windows Marcketplace for Mobileがサービス開始され,作成したアプリケーションを個人でも世界をターゲットに公開できる環境が整ってきました。これを機にWindows phoneアプリケーションの開発をしてみませんか?

ここは知っておくべき!Windows Server 2008技術TIPS

5年ぶりのサーバOSとなったWindows Server 2008が出荷されて早2年。2009年にはR2が出荷され,再び注目を集めています。発売前から実施したトレーニングによって感じた,インフラエンジニアの方々に知っておいていただきたい機能を中心にご紹介します。

キーパーソンが見るWeb業界

本連載はWeb Site Expert/gihyo.jpとの連動企画です。阿部淳也, 長谷川敦士, 森田雄のお三方による,Web業界をテーマにした座談会です。

きたみりゅうじの聞かせて珍プレー

ソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。みなさんからの投稿もお待ちしてます!

ActionScript 3.0で始めるオブジェクト指向スクリプティング

野中文雄氏が,簡単なスクリプトは書いたことがあるという初級者を対象に,ActionScript 3.0の基本からクラス定義までを解説します。

まだ間に合う「ITパスポート」受験対策 原山先生の短期合格塾

この連載では,4月18日のITパスポート試験の受験に向けて,短い期間で効率良く受験対策を行う方法や,確実に得点するための裏ワザなどを伝授していきます。

連載一覧

gihyo.jp

  • DEVELOPER STAGE
  • ADMINISTRATOR STAGE
  • WEB+DESIGN STAGE
  • LIFESTYLE STAGE
  • SCIENCE STAGE
  • NEWS & REPORT

書籍案内

  • 新刊書籍
  • 書籍ジャンル一覧
  • 書籍シリーズ一覧
  • 新刊ピックアップ
  • ロングセラー
  • 電脳会議

定期刊行物一覧

  • Software Design
  • WEB+DB PRESS
  • Web Site Expert
  • 組込みプレス