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

紺屋高尾

ぬしの女房はんに、わちき、なりたいんざます。来年三月十五日、年季(ねん)が明けるんざます。そのときは眉毛落として歯に鉄漿(かね)染めて、ぬしの傍に参りんすよって、お内儀(かみ)さんにしてくんなますか?

The RSpec Book 1日目

The RSpec Book (Professional Ruby Series)

The RSpec Book (Professional Ruby Series)

最近、プライベートの開発ばかりで本を読んで(写経して)勉強してないなーと思ったので、この本で勉強。
会社の同僚にお借りしました。

自分用のチラシの裏のメモ書き程度なので、読みにくいなどのツッコミはなしで。

早めに帰れた平日の夜に、1時間程度時間をとって読み終えたいなー。

メモ

BDDはTDDの工程への理解を深め、それをうまく説明しようとする試みとして始まった。
テストという言葉による障壁が大きいと考えた。
ベテランのTDDユーザーでさえ、TDDから得られたはずの利益を全て手にしていないと示唆した。

TDDはテストの対象となるコードを書く前にテストを書くという開発手法。
まだ存在しないコードのために、非常に小さなテストを書くことからはじめる。
テストを書く→実行する→失敗→テストを成功させるために必要な最低限のコードを書く→終わり

テストが成功したら、結果として得られた設計を調べて、重複していたらリファクタリングする。
必然的にこの時点では、このコードの設計は単純すぎる。

さらにコードを追加するのではなく、次のテストという形で次の責務をドキュメント化する。
新しいテストを書く→実行する→失敗→テストを成功させるために必要な最低限のコードを書く→終わり
このようにしてRed/Green/Regactorのサイクルを作る。

コードベースのサイズが大きくなるにつれ、リファクタリングステップの労力は増える。
これは創発的な設計であり、TDDの最も重要な副産物の一つ。

TDDはテストの実践ではなく、テスト担当者に高品質なコードを渡す手法と考える。
正式なテストを行うのはテスト担当者。

テストにおける些細な部分が、テストされるオブジェクトの内部構造への依存性を生み出す。
他の案件によってArrayがHashに変更された場合には、オブジェクトの振る舞いが変化していないのに、テストに失敗する。
この脆弱性によりテストスイートのメンテナンスにかかるコストが跳ね上がる。
テストスイートが無視されるようになり、最終的に放棄される主な理由。

オブジェクトが何をするかではなく、オブジェクトが何であるかをテストしているのが問題。
オブジェクトが何をするか、のほうが重要。

データがリレーショナルデータベースに保存されることではなく、一般にデータがどこかに保存され、取り出せることこそ気にかける事柄。

BDDは構造ではなく振る舞いに焦点を合わせる。
開発の全てのレベルで一貫してそうなる。
すべてが振る舞い。
オブジェクトの構造よりも、ユーザーとシステムの間でのやり取り、オブジェクト間のやりとりについて考える。

ソフトウェア開発チームが直面する問題のほとんどは、コミュニケーションの問題と考えている。
BDDの目的はそのソフトウェアの状況を説明するための言語を単純化することで、コミュニケーションを後押しすること。

あるコンテキスト(Given)で、あるイベントが発生すると(When)、ある結果が期待される(Then).
これらの単語はBDDの単純な単語で、Cucumberの言語に埋め込まれている。

itメソッドはMovieListが作成されたコンテキストにおいて、MovieListの振る舞いのサンプルを作成する。

ATPDでは顧客受け入れテストを導入し、それを主体にコードの開発を進めていきます。
それらは顧客と開発チームによる共同作業の結果であることが理想。
顧客が理解できる言語とフォーマットで表現されていなければいけない。
Cucumberを利用すれば、それが実現される。

本書では、Cucumberを使ってアプリケーションの振る舞いを表現し、RSpecを使ってオブジェクトの振る舞いを表現する。

Cucumberで失敗するステップ→成功させる→Rspecで失敗させる→成功させる

RSpecがGreenになるたびにCucumberのサイクルをチェックする。
まだRedならフィードバックに従ってRSpecのサイクルを次のアクションにすすめる。
それがGreenの場合は、Cucumberから抜けだして必要に応じてリファクタリングを行い、失敗するCucumberステップを新たに記述することでサイクルを繰り返す。

インストール

※ 下記versionだと、greeter_spec.rbが

Finished in 0.00023 seconds
1 example, 1 failure
/Users/user_name/.rvm/gems/ruby-1.9.3-head/gems/rspec-core-2.0.0/lib/rspec/core/hooks.rb:116:in `run_hook_filtered': undefined method `run_all' for []:Array (NoMethodError)

というErrorを吐いてハマった。

$gem update rspec

したら正常動作した。
なんぞ。。。

$gem install rspec --version 2.0.0
$gem install cucumber --version 0.9.2

このあとに結局updateした。

サンプルプログラム

greeter_spec.rb

class RSpecGreeter
  def greet
    "Hello RSpec!"
  end
end

describe "RSpec Greeter" do # サンプルグループの宣言。
  it "should say 'Hello Rspec!' when it receives the greet() message" do # サンプルの宣言
    greeter = RSpecGreeter.new # コンテキスト(Given)
    greeting = greeter.greet # 注目すべきアクション(When)
    greeting.should == "Hello RSpec!" # 期待される結果(Then)
  end
end
$ rspec greeter_spec.rb
.

Finished in 0.00036 seconds
1 example, 0 failures

感想

今日はなんかRSpecのエラーとかにハマったり、あと具合悪いのでここまで。

rspecの書き方、このくらいはさすがに知っていたので特に現時点では感想なし。
序盤のBDDのお話とかは興味深かったので、今後の本の展開で本当にこれらが実現出来るのか期待。
まぁ、まだ序盤なので読み進めて行こうと思う。

技術とは関係のない疑問

こうやって本を読み進めていく上で、メモをとって公開とかして良いんだろうか?
角谷さんに怒られないかしら。。。