スはスペックのス〜RSpecによるテスト駆動開発の実演〜“S is for Spec”:Test Driven Development w/ RSpec

角谷 信太郎日本Rubyの会(株)永和システムマネジメント
s-kakutani@esm.co.jp

KAKUTANI Shintaro; Eiwa System Management,Inc.; Nihon Ruby-no-kai
JPUG北海道支部/Ruby札幌 合同セミナー;札幌エルプラザ; 2008-2-16(土)谷 信太郎角✓ (株)永和システムマネジメント✓ テスト駆動開発者✓ 日本Rubyの会理事✓ http://kakutani.com

よろしくお願いします告知

RubyKaigi2008
CFP募集は明日〆切
http://jp.rubyist.net/RubyKaigi2008/

よろしくお願いします

提供

Ruby札幌Red, Green, Refactoring

TEST CLUB
テスト・クラブ諸君

テスト・クラブへようこそテスト・クラブ

第1のルール

1. クラブのことを口外するな
2. クラブのことを口外するな
3. “ちょっといいかな”の声でドライバとナビゲータは交代
4. コーディングは1対1のペア
5. いちどに1つのテストケース
6. メッセとTwitterは切る
7. 書くテストに制限はない８番目、最後のルール

“部員は入会した初日に――”“必ずテストを書く”

Red, Green, Refactoring

TEST CLUB
テスト・クラブ本日のお品書き
1. テスト駆動開発(TDD)のポイントを知る
2. Ruby用のツールである
RSpecを簡単に紹介
3. RSpecでTDDの実演今日のまとめ✓ TDDは設計技法であり、開発の進め方である✓ いちどにひとつずつ✓ 不安をテストで表現する✓ リズムとフィードバックテスト駆動開発
Test Driven Development✓ 1つのゴール✓ 1つのテーマ✓ 2つの主張✓ 2つのルール✓ 3つのモード✓ 3つの技法✓ 4つのモード

1つのゴール

TDD by Example

偉大な書籍は偉大な1行からはじまるClean code that works, inRon Jeffries’ pithy phrase, isthe goal of Test-DrivenDevelopment(TDD).
「動作するきれいなコード」、
このRon Jefferiesの簡潔な言葉こそがTDDのゴールである。

動作するきれいなコード“Clean code that works”

1つのテーマ

“The translation of afeeling into a test is acommon theme of TDD.”
感情をテストにすることが、TDDのテーマである。

感情をテストにする

感情をテストにする✓ 不安だ✓ 何かがおかしい✓ これでいい✓ 退屈だ✓ テストを構造化する✓ 書くのを止める

2つの主張TDDは、

1. 設計の技法
2. 開発の進め方

テスト駆動開発
Test Driven Development

(1)設計の技法ソフトウェア
設計とは何か?
What is Software Design?
By Jack W. Reeves村上 雅章さんによる翻訳

http://www.biwa.ne.jp/~mmura/SoftwareDevelopment/WhatIsSoftwareDesignJ.html

ソフトウェア設計とは何か?

✓ 設計: ソースコード✓ 製造: ビルド

コーディングは設計であり、テスティングとデバッギングも設計の一部であり、私たちが一般的にソフトウェア設計と呼んでいるものもやはり設計の一部なのです。

ソフトウェア設計はコーディングが完了し、「かつ」テストされるまでは完璧にならないのです。そして、テスティングは設計の検証と洗練を行うプロセスにおける礎となるものです。

設計の技法(2)開発の進め方

テストの分類✓ Developer Testing✓ 開発者が行う、開発促進のためのテスト✓ Customer Testing✓ お客様と機能の確認のために用いる、進捗管理のためのテスト✓ QA Testing✓ 品質保証のためのテスト

Developer Testing✓ プログラマの、✓ プログラマによる、✓ プログラマのための、✓ プログラムとして書く、✓ プログラミングを進めていくための、✓ テスト

開発の進め方TDDは、

1. 設計の技法
2. 開発の進め方

テスト駆動開発
Test Driven Development

クは駆動のク
D is for Driven

2つのルール

1. テストに失敗したときだけコードを書く
2. 重複を取り除く

3つのモード2つのルールが導くもの✓ Red✓ テストに失敗している状態✓ Green✓ コードが動作している状態✓ Refactoring✓ コードの意味を変えずにきれいにする

花畑理想
D
E
R

汚ない

GREEN 現実
終了

Refactoringきれい

動かない動くいま、どのモードなのかを意識するのが大事3つの技法3つの技法✓ Fake It✓ いんちき✓ Triangulate✓ 三角測量。二方向から挟み撃ちに✓ Obvious Implementation✓ ふつうに実装する

Triangulate4つのモード3つのモードREDGREEN
Refactoring3つのモードで明示されていないモードを追加

The Art of Agile Development

ThinkRED
GREEN
Refactoring

TDDのマントラシンクレッドグリーンリファ
クタシンクレッドグリーンリ
ファクタシンクレッドグリー
ンリファクタシンクレッドグ
リーンリファクタシンクレッ
ドグリーンリファクタシンク
レッドグリーンリファクタシ✓ 1つのゴール✓ 1つのテーマ✓ 2つの主張✓ 2つのルール✓ 3つのモード✓ 3つの技法✓ 4つのモード

今日のまとめ✓ TDDは設計技法であり、開発の進め方である✓ いちどにひとつずつ✓ 不安をテストで表現する✓ リズムとフィードバックRSpecRSpecとは✓「テスト」が設計であることを強調するテスティング
フレームワーク✓ Rubyを使って、プログラムの振舞の本質に集中できる書き方を可能にしているhttp://rspec.info

Rubyist Magazine 0021号“スはスペックのス”(第1回)

http://jp.rubyist.net/magazine/?0021-Rspec

RSpecのインストール$ gem install rspec

スペックファイルの構造
describe Class, "コンテキスト" dobefore(:each) do# コンテキストのお膳立て
endit "期待する振舞いの名前" do# ここに期待する振舞いを書く
endend簡単な例
describe Array, "with some entries" dobefore(:each) do@array = %w(A B C)
end
it "should not be nil" do@array.should_not be_nil
end
it "should last element is 'C'" do@array.last.should == 'C'
end
end実行(-cオプション)$ spec -c array_spec.rb..
Finished in 0.00812 seconds
2 examples, 0 failures期待する振舞の書き方✓ Object#should(matcher)@array.last.should == 'C'# @array.last が 'C' と等しいことを期待✓ Object#should̲not(matcher)@array.should_not be_nil# @array.nil? がfalseであることを期待さまざまなマッチャ✓ 演算子マッチャ✓ ==, ===, <, <=, =~, >, >=✓ ビルトインのマッチャ✓ change,raise̲error, satisfy, be̲close...
✓ be̲xxxマッチャ✓ be̲true / be̲false✓ have̲xxx マッチャ
✓ ユーザ定義のマッチャ

続きはRubyist Magazine 0021号“スはスペックのス”(第1回)

http://jp.rubyist.net/magazine/?0021-Rspec

実演ボウリングのスコア算出

The Bowling Game Kataby Robert C.Martin(Uncle Bob)
Bowling Game Kata

Object Mentor, Inc.
www.objectmentor.com
blog.objectmentor.com

fitnesse.org

www.junit.org

Copyright 2005 by Object Mentor, Inc
All copies must retain this page unchanged.

http://butunclebob.com/ArticleS.UncleBob.TheBowlingGameKata

コード=カタhttp://codekata.pragprog.com/

コード=カタ✓ 空手の「型」✓ 単純な定型を反復✓ 素振り✓ カラダでおぼえる
http://codekata.pragprog.com/

ボウリングのスコア✓ 1フレームで2投するのが基本✓ 1ゲームは10フレーム✓ ストライクは、次の2投をボーナス加算✓ スペアは、次の1投をボーナス加算✓ 10フレーム目で10ピン倒せば合計で3投できる

今回の仕様✓ 1ゲーム(10フレーム、最大21投)の投球をすべて記録してから、✓ 最後にまとめてスコアを算出する

受入テストケース
1 4 4 5 65549

1429600 1 7

661

97 117 133

77

2 6

1,4,4,5,6,4,5,5, 10, 0,1,7,3,6,4,10,2,8,6

使用するツール✓ Ruby 1.8.6 p111
✓ RSpec 1.1.3✓ CarbonEmacs 22.1.50.1✓ ZenTest 3.9.1✓ AutoTestを使いたい✓ autotest.el

作戦
1. スコアを集計する
2. ストライクの場合のボーナス
3. スペアの場合のボーナス
4. 受入テスト今日のまとめ✓ TDDは設計技法であり、開発の進め方である✓ いちどにひとつずつ✓ 不安をテストで表現する✓ リズムとフィードバック

参考文献

参考文献

1. テスト駆動開発
2. リファクタリング
3. オブジェクト設計
4. デザインパターン

テスト駆動開発

リファクタリングオブジェクト設計

デザインパターンご清聴
ありがとうございました

Tyler Durden says...
use Rspec.