RSpec and Cucumber での Outside-In 開発

Written by @dr_taka_n at 2009/04/22 00:18 [, ]

The RSpec Book

海外では多くなってきているベータ版ブック。まだ完成していない本なのだが、ベータ版ということで購入できる。流石に紙ではやらない(紙のベータ本をやっているところがあるにはあるらしい)が、章が埋まる度に電子媒体がアップデートされ、販売元にあるフォーラムに読者からの声、著者からの返答が書き込まれる。本の正式出版までの間に読者にお金を払わせた上で、レビューまでさせるという、なんともうまい商法だ。。

RSpec、Cucumberを手探り状態で試していたのだが、まとまった情報が欲しく、先月 RSpec の開発/メンテナンスのリーダーである David Chelimsky を始めとした凄腕スタッフによって書かれている RSpec Book のベータ版を購入し読んでいた。

The Rspec Book
The Rspec Book
posted with amazlet at 09.04.21
D Chelimsky
Pragma
売り上げランキング: 22862

上記はアマゾンのサイトへのリンクなので、もしベータ版を購入したい場合は、出版元の

からになる。2009年8月が完成予定となっている。

上記の本の中で、これまでの Inside-Out での開発はやめて、Outside-In で開発しようよ!と誘っている。

Inside-Out での開発は、

Building from the models out to the views means writing code based on assumptions of what think you’ll need. Ironically, it’s when you focus on the UI that you discover what is really needed from the models, and at that point there’s already a bunch of supporting code developed, refactored, and well tested - ready to be used.

だと述べられ、Outside-In での開発は、

Outside-in Rails development is like standing the traditional inside-out approach on its head. Insted of working from the models out to views, you work from the views in toward the models.

を行うということだ。

実際はこれが自然で、顧客にもわかり易い。

しかし、これはこれまで開発の現場では実現できていない。

確かに理想的だと思えるが、理想論であって、果たして現場で実現できるものか?

Cucumber (with Webrat) と RSpec を使った開発が、それを可能にしてくれる可能性をこの本は感じさせてくれる。当初、RSpec、BDD の考え方を学びたくて購入したのだが、その外側を取り巻く役目の Cucumber には正直びっくりした。

以前から設計ドキュメント、実装、そしてテストを如何に無理無く、無駄無く繋げられるのか、ということを考えていたが、これで行けるか?と期待を持たせてくれる。

現実の現場において、これをうまくずっぽり嵌め込むには、それなりの経験、ノウハウを必要とするだろうが、結構いいところいけるのではないかと思う。

BDD のスタイルとそのサイクルの回し方に久々に感動しつつ、まだ埋まっていない章が早く埋まってくれることを心待ちにしている今日この頃。

xUnit 系が駄目だと言うつもりは全く無いが、Rails で用意されているテスティングフレームワークは少々使い辛かった。各レイヤーの分離がうまくできず依存性が高くなり、また、書く人にも依るとは思うが、構造のテストに入っていってしまい、振る舞いのテストでは無くなってしまう。それが結局、Test Suite のメンテナンス負荷を高くし、負荷が上るだけならまだ何とか(精神衛生上よくないのでやっぱり駄目か。。)なのだが、最悪、テストが無視されてれしまい、書かれなくなり、捨てられる、という最悪の結果を招いてしまう。

RSpec、Cucumber を使用した BDD での開発では、

  • 各レイヤー(Model、View、Controller など)が正しく結合され、顧客の要求通り動作し ていることは、Cucumber で確認する。
  • 各レイヤーがそれぞれ単体で正しく動作していることは、RSpec で確認する。
    ここではレイヤー間の結合は破棄する。
  • Ajax など、ブラウザ側で動作する JavaScript 部分にカバーしきれない部分を残すが、 そこは、 Selenium などを使うことになるのだろう。
    (ベータ版では章立てとしてはあるが、現在この部分の本文は記載されていない)

となるのだろう。

ちなみに、RSpec、Cucumber は Rails 固有のものではない。他のアプリケーションの開発でも使用できる。Cucumber に至っては、アプリケーションの開発言語が Ruby である必要もないだろう。Java で書いた Web アプリケーションも、Cucumber でテストできる。

モックとスタブ

Outside-in の開発を実施する上で欠かせないのがモックとスタブの存在。 RSpec ではそのフレームワークの中にモックとスタブを利用可能とする仕組みを用意している。

モックとスタブを利用することで、各レイヤをきれいに分離させることができ、また、テストを書く際に、単にテストを書くという意味だけでは無く、同時に Outside からの設計を可能とさせる。

Outside-In なので、View からテストを書くだが、モックとスタブ無くしてそれはできない。 これがこれまで Model から入っていた自分にとってはなかなかピンとこなかった。 目から鱗的な衝撃。

このモックとスタブだが、よく同じ意味で混同して使われることがあるが、その意味合いは異っている。

その違いが語られた有名な文書として、Martin Fowler の文書がある。

さらにその用語だけを整理した

があり、それをさらに日本語で書いてくれている、下記のサイトがある。

上記のサイトの文書が一番わかり易く感じたので引用しておく。

スタブについて。

スタブは、テスト時の呼び出しに対して、あらかじめ用意された結果を返す。通常、テスト用にプログラムされたところ以外には応答しない。スタブは呼び出しの情報を記録することもある。例えば、Eメールゲートウェイスタブは「送られた」メッセージを記録するような場合だ。単に「送られた」メールの数を記録する場合もあるだろう。

モックについて。

モックは、エクスペクテーションが事前にプログラムされたものである。エクスペクテーションとは、受信する一連の呼び出しの仕様を表わしたものである。期待されない呼び出しが行なわれた場合は例外をスローする。また、テスト実行後の検証(verification)で、期待された呼び出しがすべてきちんと行われたかどうかを確認する。

関連するサイト

blog comments powered by Disqus