狠狠撸

狠狠撸Share a Scribd company logo
TDDワークショップ
古川 剛啓
http://www.flickr.com/photos/utest/5609991407
デバックってどうやってますか?
http://www.flickr.com/photos/porsupah/2577287047
バグ混入 バグ顕在化 バグ発見 バグFix
Td Tfind Tfix
時間
今までのプログラミング
(Debug Later Programming)
バグが混入してから顕在化するまでに時間が掛かると、バグ
がある場所を探すまでに時間が掛かる
バグ混入 バグ顕在化 バグ発見 バグFix
Td Tfind Tfix
時間
テスト駆動開発
(Test Driven Development)
バグ混入から顕在化するまでの時間を短くし、
バグがある場所を探すまでの時間を短縮する
プロジェクト終盤でありがちな状況
?単体テストを省略した
?いつの間にかテストが壊れている
?テストが直ぐ壊れるのでテストする
のをやめた
?テストに時間が掛かるのでテストし
てない
http://www.flickr.com/photos/bagger2009/3630270346
テキスト
罢诲诲ワークショップ
罢诲诲ワークショップ
罢诲诲ワークショップ
http://www.flickr.com/photos/kazk/198640938
ユニットテストフレームワークを使う
JUnit, Google Test, CppUTest???
Mockフレームワークを使う
jMock, GMock???
と言うことで???
Google Testをインストールしてみよう
http://code.google.com/p/googlemock/
? 以下のサイトからGoogle Mockのソースを
ダウンロードする(Google Testのソースも
含まれている)
? zipファイルを適当な場所に解凍する
? READMEに従って、ビルド&インストール
罢诲诲ワークショップ
テストメソッドを書く
テストをPassする最低限
のコードを実装する リファクタリング
Red ー Green ー リファクタリング サイクル
例:FizzBuzz問題を考える
FizzBuzzクラスのfizzBuzzメソッド
? 引数が3の倍数の時、”Fizz”を返す
? 引数が5の倍数の時、”Buzz”を返す
? 引数が3と5の公倍数の時、”FizzBuzz”を返す
? それ以外の時、引数の整数を文字列にして返す
例:FizzBuzz問題を考える
Step 1
テストメソッド
3の時、”Fizz”が返される事を確認する
std::string judgeFizzBuzz( int i ) {
return “Fizz”;
}
TEST_F(fizzBuzzTest, returnFizzWhenNumberIsThree_3) {
EXPECT_EQ("Fizz", sut_->judgeFizzBuzz(3));
}
例:FizzBuzz問題を考える
Step 2
テストメソッド
5の時、”Buzz”が返される事を確認する
std::string judgeFizzBuzz( int i ) {
if( i == 3 ) return “Fizz”;
if( i == 5 ) return “Buzz”;
}
TEST_F(fizzBuzzTest, returnBuzzWhenNumberIsFive_5) {
EXPECT_EQ("Buzz", sut_->judgeFizzBuzz(5));
}
例:FizzBuzz問題を考える
Step 3
テストメソッド
3の倍数の時、”Fizz”が返される事を確認する
std::string judgeFizzBuzz( int i ) {
if( i % 3 == 0 ) return “Fizz”;
if( i == 5 ) return “Buzz”;
}
TEST_F(fizzBuzzTest, returnFuzzWhenNumberIsSix_6) {
EXPECT_EQ("Fizz", sut_->judgeFizzBuzz(6));
}
例:FizzBuzz問題を考える
Step 4
リファクタリング(引数名の変更)
std::string judgeFizzBuzz( int number ) {
if( number % 3 == 0) return “Fizz”;
if( number == 5 ) return “Buzz”;
}
例:FizzBuzz問題を考える
Step n (完成)
std::string judgeFizzBuzz( int number ) {
std::stringstream returningString( "" );
if( number < 0 ) {
std::string exceptionMessage( "Number is minus." );
throw exceptionMessage;
}
else if( number == 0 ) return "";
else if( number % 15 == 0 ) return "FizzBuzz";
else if( number % 3 == 0 ) return "Fizz";
else if( number % 5 == 0 ) return "Buzz";
else {
returningString << number;
return returningString.str();
}
}
TDDの利点
? テストカバレッジが向上する
? テスタビリティが向上する
? メソッドや構造をシンプルに保つことが出来る
? 書いたコードに自信が持てる
? テストメソッドを読めばメソッドの使い方が分かる
? その他 Titter #TDDやっててよかったのまとめ
http://togetter.com/li/258537 等
継続的にTDDをやるための材料
? 単体テストは設計(実装)の一部だと理解する
? 単体テストフレームワークを使用する
? テストコードも構成管理する
? テストカバレッジを「Doneの定義」に含める
? CI (Continuous Integration)サーバを導入する
http://www.flickr.com/photos/roboppy/312248677
最後に
? TDD は簡単なプラクティスではありません。
? しかし、コード品質は確実に向上します。
? 一度や二度の失敗で諦めずに取り組みましょう。
継続は、力なり
http://www.flickr.com/photos/picsbyperi/7457301384

More Related Content

罢诲诲ワークショップ