nigoblog

暫定無職のブログ

BDD(ビヘイビア駆動開発)でハノイの塔の実装をしてみる~BDD超入門~

今回はBDD(Behavior Driven Development: ビヘイビア駆動開発)でハノイの塔の実装をします。

  1. TDDとの違い
  2. BDDフレームワークのインストール
  3. スペック(BDDのテストコード)を書く
  4. スペックの実行

以上の流れで説明します。今回も参考文献は

たのしい開発 スタートアップRuby

たのしい開発 スタートアップRuby


で行います。(p205~)

TDDとの違い

TDDの場合 assert という記述で「この時の値は~かどうかを検証する」
という意味をもっています。
一方BDDの場合
「この時の値は~である」
という意味の言葉を返します。
TDDは結果がどうなるかを考えてコーディングするのに対し、
BDDは設定がこうであるからこのようにコーディングする
というようなイメージがあります(個人的にですが)。
TDDはウォーターフォールを逆から検証していくのに対し、
BDDはウォーターフォールをそのまま行く。
みたいなことも感じます。
早速具体例を検証考えます。

BDDフレームワークのインストール

コマンドラインに

> gem install rspec

と打ち込みます。
これで数分後にインストールされます。

スペック(BDDのテストコード)を書く

次のように書きます。
hanoi_spec.rb

  1 # -*- coding: utf-8 -*-
  2 
  3 require './hanoi'
  4 
  5 describe Hanoi do
  6   describe "#disc" do
  7     let(:hanoi) {Hanoi.new}
  8 
  9     context "with 1" do
 10       it {hanoi.disc(1).should == 1}
 11     end
 12 
 13     context "with 3" do
 14       it {hanoi.disc(3).should == 7}
 15     end
 16 
 17     context "with 0" do
 18       it {expect {hanoi.disc(0)}.to raise_error(RuntimeError)}
 19     end
 20   end
 21 end

順に説明すると、
1行目では前回作成した hanoi.rbを読み込みます
5行目からこのHanoiは何をするかを書いていきます。
Hanoi do (ハノイは~をする)
#disc do (ハノイのメソッドのdiscは~をする)
with 1 (引数が1の時に)
should == 1 (1となる)
with 3 (引数が3の時に)
should == 7 (7となる)
with 0 (引数が0の時に)
raise_error(RuntimeError) (例外エラーとなる)
全て正しく動作されれば上記の様な出力が得られます。

実際に実行してみます。

スペックの実行

スペックの実行はコマンドラインに次のように打ち込みます。

> rspec -f d hanoi_spec.rb

すると結果が次のようになりました。

Hanoi
  #disc
    with 1
      should == 1
    with 3
      should == 7
    with 0
      should raise RuntimeError

Finished in 0.02544 seconds
3 examples, 0 failures

というわけで先に示した期待していた文と同じような出力となりました。


以上BDDのコードから実行まで書きました。
しかし個人的にはTDDの方が良いような気もします。
こちらもまだまだ色々やって有用性を検証したいと思います。