読者です 読者をやめる 読者になる 読者になる

Quality Code with Cucumber (RailsConf2009レポート)

«RailsConf2009のレポート一覧

こんばんは。ホテルの廊下にかかっている絵がみんな猥雑でRails hackerに与えられる心理的な影響の心配をしている根岸です。 本稿はCucumberのdeveloperであるAslak Hellesøyさんの講演内容のレポートです。

講演資料は下記のアドレスにアップロードされています。 [講演資料] 現在85人のコミッタがいるtesting frameworkであるCucumberの理念と概略がプレゼンされていました。

CucumberはBDD(Behavior Driven Development - ビヘイビア駆動開発)を実現するソフトウェアです。なんらかのアプリケーションを書く際にはビヘイビア、つまり要求仕様を特定してから開発することになりますが、Cucumberの実現するBDDは、その要求仕様通りにクライアントアプリケーションが動いているかどうかをチェックしながら行う開発です。 要求仕様をCucumberでは given(元々の条件は何か) -when(さらに何が行われるのか)-> then(何が起こるのか) という単純なグラフで多くのパターンを記述することにより実装可能としています。

Cucumberでは二種類のファイルで要求仕様が記述されます。 ・feature featureファイルでは振る舞いテストのシナリオを、先述したGiven, When, Thenの他に、追記を示すAndを加えて自然言語に近い形式で記述でき、また入力値の一部を動的に変更可能とすることでコードの重複を押さえることができます。 ・step stepファイルではfeatureで記述された内容の結果、アプリケーション側でどのような操作が行われるのかを正規表現ベースで記述します。ここでのアプリケーションに対するアクセスの記述方式の一部はWebratというrubygemによって実装されており、Webratの作者は今日のruby heroes awardの受賞者でもあります。

上記の内容はかなりはしょったCucumberの記述方式ですが、他にもフックが実装されていたり、また他のユニットテスト用のプラグイン(RspecやShoulda)をstep内で使うことができるなど、BDDを容易に行うための機能は揃っているように感じました。詳細仕様はdocumentを参照してほしいこと、また昨日の発表に添付されていたRailsプロジェクトで、本体のコードはともかくなかなか凝ったテストがCucumberで書かれているように思えたので参考にしてみて下さい。帰ってきたhtmlの検証をNokogiriでやるのは鉄板ぽいです。

さて最後に感想ですが、Cucumber、すげえいいと思います。今回のRailsConfは薄目で眺めるとtesting! testing! testing! refactoring! testing!と言った感じで、やはりかなりエンタープライズな用途(と、プログラマの幸せ)を意識した印象があるのですが、我々がクックパッドを開発するときの強くユーザを意識した姿勢は、outside-inな思想を持つCucumberとはかなり相性が良いと考えています。今後の開発体制作りの中でもかなり注目されるツールの一つとなるでしょう。

/* */ @import "/css/theme/report/report.css"; /* */ /* */ body{ background-image: url('http://cdn-ak.f.st-hatena.com/images/fotolife/c/cookpadtech/20140527/20140527163350.png'); background-repeat: repeat-x; background-color:transparent; background-attachment: scroll; background-position: left top;} /* */ body{ border-top: 3px solid orange; color: #3c3c3c; font-family: 'Helvetica Neue', Helvetica, 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', Meiryo, Osaka, 'MS Pゴシック', sans-serif; line-height: 1.8; font-size: 16px; } a { text-decoration: underline; color: #693e1c; } a:hover { color: #80400e; text-decoration: underline; } .entry-title a{ color: rgb(176, 108, 28); cursor: auto; display: inline; font-family: 'Helvetica Neue', Helvetica, 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', Meiryo, Osaka, 'MS Pゴシック', sans-serif; font-size: 30px; font-weight: bold; height: auto; line-height: 40.5px; text-decoration: underline solid rgb(176, 108, 28); width: auto; line-height: 1.35; } .date a { color: #9b8b6c; font-size: 14px; text-decoration: none; font-weight: normal; } .urllist-title-link { font-size: 14px; } /* Recent Entries */ .recent-entries a{ color: #693e1c; } .recent-entries a:visited { color: #4d2200; text-decoration: none; } .hatena-module-recent-entries li { padding-bottom: 8px; border-bottom-width: 0px; } /*Widget*/ .hatena-module-body li { list-style-type: circle; } .hatena-module-body a{ text-decoration: none; } .hatena-module-body a:hover{ text-decoration: underline; } /* Widget name */ .hatena-module-title, .hatena-module-title a{ color: #b06c1c; margin-top: 20px; margin-bottom: 7px; } /* work frame*/ #container { width: 970px; text-align: center; margin: 0 auto; background: transparent; padding: 0 30px; } #wrapper { float: left; overflow: hidden; width: 660px; } #box2 { width: 240px; float: right; font-size: 14px; word-wrap: break-word; } /*#blog-title-inner{*/ /*margin-top: 3px;*/ /*height: 125px;*/ /*background-position: left 0px;*/ /*}*/ /*.header-image-only #blog-title-inner {*/ /*background-repeat: no-repeat;*/ /*position: relative;*/ /*height: 200px;*/ /*display: none;*/ /*}*/ /*#blog-title {*/ /*margin-top: 3px;*/ /*height: 125px;*/ /*background-image: url('http://cdn-ak.f.st-hatena.com/images/fotolife/c/cookpadtech/20140527/20140527172848.png');*/ /*background-repeat: no-repeat;*/ /*background-position: left 0px;*/ /*}*/