gotagota日記

「面白きことは良きことなり」

Test::UnitとRSpec

インターンプラクティスです。

正直まだまだ勉強不足感が否めませんが、現時点でのTest::UnitとRSpecの違いについて学習したのでメモメモ。

これからRSpecについて深く学んだ後アップデートしたい所存であります。

Test::Unit とは

Test::Unit はRuby用のテストフレームワークのこと。
Ryby1.8までは標準添付されていたが、Ruby1.9からは minitest というフレームワークが標準添付されるようになった。
Ruby本体と切り離されたことに伴い、Test::Unit自体の開発が活発になり、以前よりも使いやすくなった。

RSpec とは

同じくRuby用のテストフレームワークのことである。 公式サイトの定義によれば

RSpec とは、公式サイトの説明によれば、「プログラムの振舞 (behaviour)」を記述するためのドメイン特化言語 (DomainSpecific Language:DSL) を提供するフレームワーク

らしい。

まず「プログラムの振舞 (behaviour)」とは、まあ「実際の検証内容」ぐらいにざっくり理解しておきます。

次に、「ドメイン特化言語 (DomainSpecific Language:DSL) 」とは、特定の問題領域を記述するために設計された言語のことで、RSpecは「開発対象のプログラムの振舞を記述する」という領域に対して特化している、ということになる。

両者の違い

自然言語で書ける〜云々などは二の次であって、最も重要な違いはどうやら

テストを書くときの思考過程の違い

っぽい。

どういうことかというと、

Test::Unitの場合

テストコードを書くときの思考過程は、

① テスト対象に対してなにを検証したいのか

を考えることから始まり、

② 検証したい内容に基づき、オブジェクトがどのように振る舞うのか

に終わる。

しかし、

RSpecの場合

①テスト対象がどのように振る舞うのか(振る舞って欲しいのか)

を考えることから始まり、

②その振る舞いがどういう影響を及ぼすのか(及ぼして欲しいのか)

という思考過程を経る。

これは両者のテストの書き方を比べれば一目瞭然である。 (といっても正直testunitについてはあまり理解できていない(苦笑))

Test::Unitでは TestCasetest_xxx() によって、単にテストコードを分類していただけにすぎないが、

RSpecでは describe()it() で仕様を記述し、それに対してテストコードをつらつらと書いていく。 これはつまり、仕様書に対してテストコードを書いている、ということに他ならないし、この思考こそが両者の決定的な違いであるように思う。

参考URL

http://magazine.rubyist.net/?0021-Rspec
http://test-unit.rubyforge.org/index.html.ja
http://unknown-socialway.blogspot.jp/2012/03/rails3unitrspec.html
http://d.hatena.ne.jp/kwatch/20100619/1276905099