Rails3.0 + Cucumber 0.9.1 + cucumber-rails 0.3.2 の優しい育て方

ちょっと先日人前で話す機会があり、調べていたのですが

日本語でかかれた情報がない
日本語でのfeatureの書き方が本家にmergeされた

みたいなのですが、どこにも情報がなかったのでまとめておきます。

Rails用のセットアップ

Rails3.0以降からgemファイルのセットアップはRAILS_ROOT/Gemfileに必要とするgemを記述してインストールします。特に本番環境を複数用意した時に、gemのインストールミスを防ぐという意味合いもあるとのことです。rails-cucumberのREADMEだけでは実行時にエラーがでたので、ramazeとwebratを増やしてあります。*1

:RAILS_ROOT/Gemfile
group :cucumber do
gem 'rspec-rails', '>= 2.0.0.beta.10'
gem 'capybara'
gem 'database_cleaner'
gem 'cucumber-rails'
gem 'cucumber'
gem 'spork'
gem 'launchy' # So you can do Then show me the page
gem 'ramaze'
gem 'webrat'
end

と記述した後に以下のコマンドを実行します

$ bundle install

ただし、この場合にはsystem側のgemsにはいってしまうので、環境が汚染されてしまいます。Railsの推奨の設定では、RAILS_ROOT/vendor/bundleにいれることを推奨しています。

$ bundle install vendor/bundle

以降再度実行の際には、引数でインストール先の指定がいらなくなります。RAILS_ROOT/.bundle/configにインストール先が記述されています。

cucumberのRails Projectへのインストール

cucumberのRails Projectへのインストールは、script/railsのgeneratorをつかってインストールします。日本語のfeatureを利用する場合にはこの段階で引数で言語を指定します。また、rpsecを利用する時には--rspecを指定し、webアクセス時のjavascriptの解釈のためにcapybaraを使うので--capybaraを指定します。

$ ruby script/rails generate cucumber:install ja --rspec --capybara

cucumber-rails-0.3.2/generators/cucumber/USAGEにしか言語オプションについて書いていませんので注意。generatorのソース直でよんでも分かりますけどね。*2

featureのgenerate

次にやっとfeatureをインストールします。

$ ruby script/rails generate cucumber:feature user

これで一通りは動きます。実際にはdbのsetupをしてない場合には

$ rake db:migrate

などとしないと動きませんが……。

featureを作るときにmodelのcolumnを指定する

featureを作るときにmodelのcolumnを指定すると、自動的にそのcolumn用のtestingのシナリオを書いてくれます。

$ ruby script/rails generate cucumber:feature user name:string mailaddress:string

こんな感じです。

日本語のシナリオの作成

jaを指定することで日本語のシナリオを作成できますが、普通にかくと動きません。ソースを追っておくと、言語指定をシナリオファイルの最初にかかないといけないっぽいです。

$cat features/manage_posts.feature
# language: ja
フィーチャ: 新規登録
シナリオ: 新規登録
...

と一行目に

# language: ja

と記述する必要があります。これで他のサンプルをみながら日本語のシナリオをかけばOKです。

cucumberの実行方法

script/cucumberなどというファイルができますが、rakeの中にタスクとして登録されています。

$ rake cucumber

とすればOKです。

path.rbでエラーがおきる時

シナリオを日本語で記述した時に、path.rbでエラーがでます。

$ rake cucumber
(in /Users/yuunyan/work/cuke-test)
bundle exec /Users/yuunyan/work/.rvm/rubies/ruby-1.9.2-p0/bin/ruby -I "/Users/yuunyan/work/.rvm/gems/ruby-1.9.2-p0/gems/cucumber-0.9.1/lib:lib" "/Users/yuunyan/work/.rvm/gems/ruby-1.9.2-p0/gems/cucumber-0.9.1/bin/cucumber" --profile default
Using the default profile...
/Users/yuunyan/work/cuke-test/features/support/paths.rb:10: invalid multibyte char (US-ASCII)
/Users/yuunyan/work/cuke-test/features/support/paths.rb:10: invalid multibyte char (US-ASCII)
/Users/yuunyan/work/cuke-test/features/support/paths.rb:10: syntax error, unexpected $end, expecting keyword_then or ',' or ';' or '\n'
when /新規登録/
^ (SyntaxError)

という場合にはおきまりの

features/support/path.rb
#encoding: utf-8

をつければ解決します。単に文字コードが解釈できないだけですねw

とりあえずこれで優しくBDDなりTDDがはじめることができます。是非みなさまもチャレンジしてみてね!

これよんでるよ

The RSpec Book: Behaviour Driven Development with RSpec, Cucumber, and Friends

Rspecの本!英語しかないけどebookでもあるのでオススメですよ〜。

*1:もしかしたらwebratはいらないかも

*2:当然、helpにはでるけどどういう値あたえたらいいのかわからない脆弱性

#phpcon2010 お疲れ様でした

id:ku-ma-meに捧ぐ。

遅くなりましたが。。。
当日やっぱり小さいスクリーンでライブコーディングは無理でした。

本番まで何回もリハーサルやったのですが、そこで100%成功していたのに本番で失敗するというドジぷりでした。

動くサイト用意しました。
ただしgoogle chromeのみで表示を確認しています。
Firefoxなどではきちんと表示できません。


http://59.106.179.174/misc/ethnyan/index.php

スライドなどはこちらに。

ソースコードgithubにあがっています。
facebox1.2が現状必須となっているので厳密な意味でのQuineではないかも。

http://github.com/yuuna/EthnyanAbout/

MessagePack Hackathon

MessagePackハッカソン 第2回 : ATND
に参加してきました。
MessagePack RPCのRubyの手直しをしてきました。


  • Test::UnitからRspecへの変更(いまやってる)
  • Rakefileに手を入れて、テストなどをRake化
  • Kernel Moduleに対するMonkeyPatchな部分を修正
  • StringをSymbolにかえてパフォーマンスをよくしてみたり。


    と地味に役に立つんだか立たない修正をしてきました。
    テストをRspecにMigrateをやってるのですが、自分のコードが地味に腐ったコード*1なのでがんばってやっていきます!

    今後は、RPCをDRY化してみてパフォーマンスがどのくらい変わるかをテストしてみたいとおもいます。
    最後はネイティブRubyまでいきたいです……がいけるかな……。

    成果はgithubにあるので興味のある方はどうぞ。

    *1:語弊のある日本語でした。腐ってるのはどーかんがえても自分のコードです。

  • jpmobile hacks その2

    テストコードかいて、気がついた部分を修正してpushした。

    jpmobileがtestを走らすと、「rspec」をいれてといわれるんだが、すでにはいっているのでなんでだろうとおもったらrspec-coreというライブラリーをいれないといけなかったみたい。statusがpreなのでかなりはまったけど。


    前回のエントリのディレクトリ構成はrailsっぽくないという指摘と「規約より制限」ということによりそのままいってみることにしました。
    githubのyuuna/jpmobileにあるのはDoCoMoのみ、"モデル名_docomo"という名前のテンプレートがあると機種固有のページが表示することができます。

    次はchtml/ihtmlバージョンごとのテンプレート検索ができるようにするのが目標。

    jpmobile hack その3

    chtmlごとにテンプレートを準備して、かつ、ないときは古い方向にテンプレートを探すようにした。
    これで一段落かな。

    余談だけど……
    SH-06Aとかのuser-agentがSH-06A3となってて偉い気持ち悪い。

    あと寝ぼけて#String.downcase()なところをunderscoreつかっていてはまってしまっていた。
    バカも休み休みやれってことですね。分かります。

    jpmobile Hacks

    rubykaigi2010 に参加したのをいいことにgithub側に自分の作業をばんばんしている。
    いまさらだけどbranch切れば良かったかなぁ。

    http://github.com/yuuna/jpmobile

    やりたいことは以下の二つ
    ・テンプレートの切替を「機種別→htmlバージョン別→キャリア別→共通」にしたい
    ・絵文字のPC側でのマッピング

    最初についてはある程度見通しがたったので実装しています。
    templateの置き方が今のjpmobileこんな感じにテンプレートを配置しています。

    app/view/user/index.tpl
           /index_p904_mobile.rb
           /index_chtml7.0_mobile.rb                        
           /index_docomo_mobile.rb

    これだとかなり見にくいのでできればこうしたい*1

    app/view/user/index.rb←共通
    app/view/docomo/user/index.rb←docomo共通
    app/view/p904/user/index.rb←p904用
    app/view/chtml7.0/user/index.rb←cHTML7.0用

    としたい。

    理由としては、機種が増えたときにp904をコピーしてp905とかできるし、
    大概機種別にページを管理するケースが多いので。

    後者については昔つくったのをがりがりリファクタリングするのでもう少しかかるかな。
    というわけでご意見などありましたらどうぞ。

    *1:寝ぼけてtplになってた。