Slide 1

Slide 1 text

RSpec Takuya Shiotari

Slide 2

Slide 2 text

TDDとは テストの対象となるコードを書く前にテストを書く開発手法 1. 失敗するテストコードを書く 2. テストがパスする最小限のコードを書く 3. リファクタリング 開発サイクル RED/GREEN/REFACTOR ■ コードをクリーンな状態に保つことができる ■ テストの実践ではない ■ 高品質なコードをテスト担当者に引き渡すために使用する手法

Slide 3

Slide 3 text

BDDとは ■ TDDの派生 ■ 振る舞い(要求仕様)を自然言語で併記しなが らテストコードを記述 ■ テスト≒要求仕様 ■ BDDフレームワーク ○ ストーリーフレームワーク(Cucumber) ○ スペックフレームワーク(RSpec)

Slide 4

Slide 4 text

BDDの原則 ■ 十分といったら十分 ○ 必要最低限のことを行うべき ○ それ以上の労力は無駄 ■ ステークホルダーに価値をもたらす ○ 目に見える価値をもたらすためにあるべき ■ すべては振る舞いから ○ アプリケーションの振る舞いをステークホルダーの視点 に立って説明できるのと同様に、低レベルのコードの振 る舞いを、それを利用する他のコードという視点から説 明する

Slide 5

Slide 5 text

RSpec導入理由 ■ プログラムの変更によってデグレードしてないか不安 ■ コードのサイズが大きくなるとリファクタリングが難しい ■ ドキュメントをBTSやツールで管理しても他のドキュメントや ソフトウェアと一致しなくなる ■ 過度な設計をしたくない ⇒テストコードと要求仕様を併記するので常に一致 ⇒自動化したリグレッションテスト ⇒カバレッジが100%のテストがあれば安心してリファクタリング できる ⇒具象的なコードから始まり抽象化するため、適切な抽象化 で抑えられる

Slide 6

Slide 6 text

RSpec ■ 2005年にSteven Bakerによって開発 ■ 振舞を記述するためのDSLを提供するフレームワーク ■ RSpecは全てがユニットテスト TDDの場合 RSpecの場合 アサーション (コードの検証) エクスペくテーション (期待すること) テスト サンプルコード テストケース サンプルグループ

Slide 7

Slide 7 text

RSpecのインストール $ gem install rspec ■ 単独で利用する場合 ■ railsで利用する場合 group :develop, :test do gem 'rspec-rails' end RAILS_ROOT/Gemfile

Slide 8

Slide 8 text

サンプルスペックファイル describe Stack do before do @stack = Stack.new @stack.push :item end describe "#peek" do it "should return the top element" do @stack.peek.should == :item end it "should not remove the top element" do @stack.peek @stack.size.should == 1 end end end stack_spec.rb フック サンプルコード サンプルコード サンプル グループ

Slide 9

Slide 9 text

スペックファイルの構成

Slide 10

Slide 10 text

RSpecの実行 フィルタ サンプルコード サンプルコード サンプル グループ $ rspec stack_spec.rb -c .. Finished in 0.00063 seconds 2 examples, 0 failures ■ 単独で利用する場合 ■ railsで利用する場合 $ bundle exec rspec spec/views/home/index.html.erb_spec.rb .................... Finished in 10.79 seconds 20 examples, 0 failures

Slide 11

Slide 11 text

specdoc形式のフォーマット $ rspec stack_spec.rb -c -fd Stack #peek should return the top element should not remove the top element Finished in 0.00072 seconds 2 examples, 0 failures

Slide 12

Slide 12 text

考察 ■ 考え方になれるまで大変 ■ Mockの使い方が鍵 ■ RSpec単体では遅い ⇒ sporkを使って高速化 ■ RSpec on Railsでは全てを単体テストにできる ので関心が自然に分離される ■ eureeekaは英語で記述したが、日本語にしても よかったかも…

Slide 13

Slide 13 text

次回

Slide 14

Slide 14 text

RSpec gemの構成 ■ rspec-core ○ describeやitなどの実行可能なサンプルを記述できる構 造を提供 ■ rspec-expectations ○ サンプル内でオブジェクトの期待する結果を表現 ■ rspec-mocks ○ rspec-mocksはテストダブルフレームワーク ○ テストダブル、メソッドスタブ、メッセージエクスペくテー ションをサポート

Slide 15

Slide 15 text

RSpec::Core ■ describe ○ サンプルグループを宣言 ■ it ○ サンプルを宣言 ■ pending ○ サンプルを保留扱いとして宣言 ■ before、after ○ サンプルの実行前後をフック

Slide 16

Slide 16 text

RSpec::Expectations ■ should(matcher)とshould_not(matcher) ○ matcher.matches?(self)がtrueの場合:次の行へ ○ matcher.matches?(self)がfalseの場合:例外発生 ■ RSpecに組み込まれているマッチャ ○ equal、include、respond_to, raise_error ■ 述語マッチャ ○ be_empty、be_instance_of ■ 演算子を使った式 ○ result.should.==(3) → result.should == 3 ○ result.should.(be.<(7)) → result.should be < 7

Slide 17

Slide 17 text

RSpec::Mocks ■ テストダブル ○ サンプルにおいて別のオブジェクトの代役を務めるオブジェクト ■ メソッドスタブ ○ サンプルコードの実行中にあらかじめ定義されたレスポンスを返すようにプ ログラムできるメソッド ■ メッセージエクスペくテーション ○ 一度も呼び出されないとエラーになるメソッドスタブ ■ 役割に焦点を合わせる ■ やり取りに焦点を合わせる ■ インターフェースの発見 ■ 依存関係を実装せずに作業をすすめる ■ 依存関係からの分離 ■ 不確定性からの分離