TDD ってどんな感じ? FizzBuzz を作ってみる 2010/01/22 biac 1.

Slides:



Advertisements
Similar presentations
C 言語講座第 5 回 構造体. 構造体とは ... 異なる型の値をまとめて新しい型とする 機能がある . つまり , 複数の変数を 1 つのまとまりにできる . 配列と違って同じ型でデータをまとめるのではな く違った型のデータをまとめられる .
Advertisements

わんくま同盟 名古屋勉強会 #3 タダで始めるテストファースト入門 C# Express + NUnit biac 機材協力 : 日本インフォメーション㈱ 2008/7/26.
わんくま同盟 東京勉強会 #26 - LT 大集合 !! 派生開発プロセス XDDP のすすめ 2008/11/15( 土 ) fnya.
わんくま同盟 名古屋勉強会 #2 Visual Studio 2008 でやる テスト駆動開発 2008/04/26 biac 機材協力 : 日本インフォメーション㈱ Test Driven Development.
わんくま同盟 名古屋勉強会 #17 biac
テストについて 近畿大学大学院 田中大介 資料:
~「びっくり反応」について知りましょう~. そのとき、どこにいた? 何をしていたのかな? だれかそばにいたの? けがはなかったかな? びっくりしたよね・・・・。 いたいところがあったら、大人にいってくださ い。 なおしてあげます。 となりにいる友達、大人にお話をしましょう。
Struts VS SAStruts ・ STRUTS と SAStruts を比較します。. Struts のメリット1 STRUTS はディファクトスタンダード。 ↓ プログラマがたくさんいる。 ライブラリ、ツールがたくさんある。 ビジネス案件が豊富。 書籍などの情報元が豊富。
Visual Studio 2010 の新機能 Coded UI Test
PHP AV(Audio Visual) 拡張 クライアントサイド PHP アプリケーションPHP
プログラマのレベルアップ.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第4回 配列(2) 情報・知能工学系 山本一公
2008/09/20 TDD 道場 ~ みんな TDD やってみよう! ~.
総評 野田久順.
第2章 数値の入力と変数 scanfと変数をやります.
Visual Studio 2008 でやる テスト駆動開発
情報理工学部 情報システム工学科 ラシキアゼミ3年 H 岡田 貴大
Biac /10/25 DI コンテナの本懐 ~ IoC の実装も楽々! biac
JAVA.
RAD Studio 14/09/27 TEffectを使った綺麗なForm
2008/09/20 TDD 道場 ~ ぼくと契約して TDD をやってよ! ~.
社会人学習講座 「Javaプログラミング概論」
基礎プログラミング演習 第7回 繰り返し.
第20章 Flyweight ~同じものを共有して無駄をなくす~
タダで始めるテストファースト入門 C# Express + NUnit
情報学部 プログラミング体験教室 (中級編)
第10章 char 文字列; 文字列を入力させるよ!.
~手続き指向からオブジェクト指向へ[Ⅱ]~
Biac /10/ /10/25 DI コンテナの本懐 ~ IoC の実装も楽々! biac
VBScriptで ユニットテストをやってみる
第0章 MMC PCセクションへようこそ! ~プログラミングの準備~
ペアプロ小劇場 劇団ペケぴー 天野勝 永和システムマネジメント 大熊知栄 アジアパシフィックシステム総研
第9章 例外処理,パッケージ 9.1 例外処理 9.2 ガーベッジコレクション.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
Microsoft MVP for Development Tools – Visual C++
コードクローンの分類に基づいた メソッド引き上げ手順の提案とその有効性評価
プログラミング応用 printfと変数.
Microsoft MVP for Development Tools – Visual C++
はぐれたメルでプログラムを 担当した一人の仁藤が 授業開始前の2時間くらいで作成
TDDとメソッドの外部設計 テストファーストの秘訣 2009/08 biac.
メソッドの外部設計と テストファースト ~ 上手く TDD するために ~
オブジェクト指向の …ナニ? わんくま同盟 名古屋勉強会 #5 2008/12/6 Lightning Talk by biac
ゲームプログラミング講習  第3章 ゲーム作成 ブロック崩しを作ります ゲームプログラミング講習 第3章 ゲーム作成.
0.2 プロジェクトの準備 DXライブラリを使うための準備.
Limeを使ったユニットテストの実装方法
2008/09/20 F# 入門 TDD 道場 ~ みんな TDD やってみよう! ~.
Microsoft MVP for Development Tools – Visual C++
メソッドの外部設計と テストファースト ~ 上手く TDD するために ~
Visual Studio 2008 でやる テスト駆動開発
第1章 いよいよプログラミング!! ~文章の表示 printf~
アルゴリズムとプログラミング (Algorithms and Programming)
基礎プログラミング演習 第6回.
Boostのスマートなポインタを使ってみる
C#プログラミング実習 第3回.
vc-2. Visual Studio C++ のデバッガー (Visual Studio C++ の実用知識を学ぶシリーズ)
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
dcNavi:デバッグ支援のための グラフベース推薦システム
サブゼミ第7回 実装編① オブジェクト型とキャスト.
nativeの基礎知識 「ポインタ」てなによ!?
ウェブデザイン演習 第6回.
第0章 MMC PCセクションへようこそ! ~VC++導入~
モグラたたき.
JAVA入門⑥ クラスとインスタンス.
Visual Studio 2013 の起動と プロジェクトの新規作成 (C プログラミング演習,Visual Studio 2019 対応) 金子邦彦.
情報処理Ⅱ 2007年12月3日(月) その1.
cp-2. 属性,アクセサ (C++ オブジェクト指向プログラミング入門)
第7章 そろそろ int 以外も使ってみよう! ~データ型 double , bool~
FPS(続き).
第1章 printf(“文字の出力\n”);
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

TDD ってどんな感じ? FizzBuzz を作ってみる 2010/01/22 biac 1

自己紹介 山本康彦 / biac コミュニティ わんくま同盟に出没 もとは機械の設計屋さん いまだにプログラムを書いてる 52歳 名古屋生まれの名古屋育ち http://tdd-net.jp/ http://bluewatersoft.cocolog-nifty.com/ ※ ハンドルでぐぐってもらえば見つかる(経済産業諮問委員会じゃないほう) コミュニティ わんくま同盟に出没 もとは機械の設計屋さん – ものごとの見方・考え方が、きっとズレてる 2

Test Driven Development リファクタ RED GREEN 1. テストコードを書く。 (RED) 2. テストに通る製品コードを書く。 (GREEN) 3. リファクタリングする。 RED – GREEN をグルグルやる! 一息ついたら、リファクタする! 3

TDD 三原則 失敗するユニットテストを成功させるためにしか、 プロダクトコードを書いてはならない。 失敗するユニットテストを成功させるためにしか、 プロダクトコードを書いてはならない。 失敗させるためにしか、 ユニットテストを書いては ならない。 コンパイルエラーは失敗に数える。 ユニットテストを1つだけ成功させる以上に、 プロ ダクトコードを書いてはならない。 by Robert C. Martin (UncleBob) http://www.butunclebob.com/ArticleS.UncleBob.TheThreeRulesOfTdd

FizzBuzz 実際には、どんなふうにやってるの? ライブコーディングはムリだけど、雰囲気だけでも… 実際には、どんなふうにやってるの? ライブコーディングはムリだけど、雰囲気だけでも… FizzBuzz ゲーム 最初のプレイヤーは「1」と言う。 次のプレイヤーは直前のプレイヤーの次の数字を発言していく。 ただし、 3 で割り切れる場合は 「Fizz」、 5 で割り切れる場合は 「Buzz」、両者で割り切れる場合は 「Fizz Buzz」 と言う。 1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, Fizz Buzz, 16, 17, ...

準備 1. 考える 2. コードを書く準備 Visual Studio なら 2つプロジェクトを作り、 テストコードのソースファ イルを作る。 FizzBuzzPlayerTest.cs

TDD 開始: 1 ⇒ “1” が返る [TestMethod] public void TestSay1()‏ { FizzBuzzPlayer p = new FizzBuzzPlayer(); Assert.AreEqual<string>("1", p.Say(1)); } ⇒ コンパイルエラー! (RED) → 製品コードのソースファイル FizzBuzzPlayer.cs を作る internal class FizzBuzzPlayer { internal string Say(int number) return "1"; } "1" が返れば いいのよ~ !! internal class FizzBuzzPlayer { }

2 ⇒ “2” が返る ⇒ テスト失敗! (RED) → 2つのテストを同時に通すには? (三角測量)‏ [TestMethod] public void TestSay2()‏ { FizzBuzzPlayer p = new FizzBuzzPlayer(); Assert.AreEqual<string>("2", p.Say(2)); } ※ テスト追加時には そのテストだけ実行 ⇒ テスト失敗! (RED) → 2つのテストを同時に通すには? (三角測量)‏ internal class FizzBuzzPlayer { internal string Say(int number) //return "1"; return number.ToString(); } ※ 製品コード修正時には 全てのテストを実施 internal class FizzBuzzPlayer { internal string Say(int number) return "1"; }

コンストラクタは 1つだけ。 将来、増えることも無さそう。 ちょっとテストをリファクタ 安全索が無いので 慎重に! [TestMethod] public void TestSay1() { FizzBuzzPlayer p = new FizzBuzzPlayer(); Assert.AreEqual<string>("1", this._testTarget.Say(1)); } public void TestSay2() { FizzBuzzPlayer p = new FizzBuzzPlayer(); Assert.AreEqual<string>("2", this._testTarget.Say(2)); private FizzBuzzPlayer _testTarget; [TestInitialize] public void TestInitialize() { this._testTarget = new FizzBuzzPlayer(); } [TestMethod] public void TestSay1() { Assert.AreEqual<string>("1", this._testTarget.Say(1)); public void TestSay2() { Assert.AreEqual<string>("2", this._testTarget.Say(2)); コンストラクタは 1つだけ。 将来、増えることも無さそう。

3 ⇒ “Fizz” が返る internal class FizzBuzzPlayer { [TestMethod] public void TestSay3Fizz()‏ { Assert.AreEqual<string>("Fizz", this._testTarget.Say(3)); } internal class FizzBuzzPlayer { internal string Say(int number) if (number == 3)‏ return "Fizz"; return number.ToString(); } 3 だったら "Fizz" を返せばいいのよ~ !! internal class FizzBuzzPlayer { internal string Say(int number) ‏ return number.ToString(); }

4 ⇒ “4” が返る …でも、このテストは失敗しない (はず) なので、TDD 三原則により、テストを書 かない。

5 ⇒ “Buzz” が返る internal class FizzBuzzPlayer { [TestMethod] public void TestSay5Buzz()‏ { Assert.AreEqual<string>("Buzz", this._testTarget.Say(5)); } internal class FizzBuzzPlayer { internal string Say(int number) { if (number == 3)‏ return "Fizz"; if (number == 5)‏ return "Buzz"; return number.ToString(); } 5 だったら "Buzz" を返せばいいのよ~ !! internal class FizzBuzzPlayer { internal string Say(int number) { if (number == 3)‏ return "Fizz"; return number.ToString(); }

もう分かってるけど、 テストを通すのに関係無いから、こっちは我慢 ! 6 ⇒ “Fizz” が返る [TestMethod] public void TestSay6Fizz() { Assert.AreEqual<string>("Fizz", this._testTarget.Say(6)); } internal class FizzBuzzPlayer { internal string Say(int number) { //if (number == 3)‏ if (number % 3 == 0)‏ return "Fizz"; if (number == 5)‏ return "Buzz"; return number.ToString(); } 3 の倍数だったら "Fizz" ※ 三角測量 もう分かってるけど、 テストを通すのに関係無いから、こっちは我慢 ! internal class FizzBuzzPlayer { internal string Say(int number) { if (number == 3)‏ return "Fizz"; if (number == 5)‏ return "Buzz"; return number.ToString(); }

n = 7, 8, 9 …でも、このテストも失敗しない (はず) なので、テストを書かない。

10 ⇒ “Buzz” が返る internal class FizzBuzzPlayer { [TestMethod] public void TestSay10Buzz() { Assert.AreEqual<string>("Buzz", this._testTarget.Say(10)); } internal class FizzBuzzPlayer { internal string Say(int number) { if (number % 3 == 0)‏ return "Fizz"; //if (number == 5)‏ if (number % 5 == 0)‏ return "Buzz"; return number.ToString(); } 5 の倍数なら "Buzz" ※ 三角測量 internal class FizzBuzzPlayer { internal string Say(int number) { if (number % 3 == 0)‏ return "Fizz"; if (number == 5)‏ return "Buzz"; return number.ToString(); }

n = 11, 12, 13, 14 …でも、このテストも (以下略

いきなり書いちゃったけど。難しいときは三角測量! 15 ⇒ “Fizz Buzz” が返る [TestMethod] public void TestSay15FizzBuzz() { Assert.AreEqual<string>("Fizz Buzz", this._testTarget.Say(15)); } internal class FizzBuzzPlayer { internal string Say(int number) { if ((number % 3 == 0) && (number % 5 == 0))‏ return "Fizz Buzz"; if (number % 3 == 0)‏ return "Fizz"; if (number % 5 == 0)‏ return "Buzz"; return number.ToString(); } いきなり書いちゃったけど。難しいときは三角測量! internal class FizzBuzzPlayer { internal string Say(int number) { if (number % 3 == 0)‏ return "Fizz"; if (number % 5 == 0)‏ return "Buzz"; return number.ToString(); }

ちゃんと動いた これ以上、失敗するテストは思いつかない = テストファースト終了 !! 最後にリファクタリング

リファクタリング internal string Say(int number) { bool isMultipleOf3 = (number % 3 == 0); bool isMultipleOf5 = (number % 5 == 0); //if ((number % 3 == 0) && (number % 5 == 0))‏ if (isMultipleOf3 && isMultipleOf5)‏ return "Fizz Buzz"; //if (number % 3 == 0)‏ if (isMultipleOf3)‏ return "Fizz"; //if (number % 5 == 0)‏ if (isMultipleOf5)‏ return "Buzz"; return number.ToString(); } 重複を排除するため キャッシュ変数を導入 internal string Say(int number) { if ((number % 3 == 0) && (number % 5 == 0))‏ return "Fizz Buzz"; if (number % 3 == 0)‏ return "Fizz"; if (number % 5 == 0)‏ return "Buzz"; return number.ToString(); }

完成 ! 最後にオールグリーンを確認して、 チェックイン! internal string Say(int number) { 最後にオールグリーンを確認して、 チェックイン! internal string Say(int number) { bool isMultipleOf3 = (number % 3 == 0); bool isMultipleOf5 = (number % 5 == 0); if (isMultipleOf3 && isMultipleOf5)‏ return "Fizz Buzz"; if (isMultipleOf3)‏ return "Fizz"; if (isMultipleOf5)‏ return "Buzz"; return number.ToString(); }

プログラミングを覚えたときと同じ TDD も 練習あるのみ ! ありがとうございました

バグは付きもの しばらくして… 偉いシト 「biac くん、いつぞやのアレだ けど。 FizzBuzz って 1 から始めるもんだ ろう? 間違って 0 とか突っ込んだらエラー にしてくれないと困るよ!」 … orz

バグ対応 TDD 的には、 バグ = テストケースの不備 先にテストを直してから、 それに通るように製品コードを修正する。 バグ対応も、RED ⇒ GREEN !

0 ⇒ 例外が出る [TestMethod] [ExpectedException(typeof(ArgumentOutOfRangeException))] public void TestSay0Error() { string result = this._testTarget.Say(0); Assert.Fail("例外が発生せず、'{0}'が返りました。", result); } internal string Say(int number) { if (number < 1)‏ throw new ArgumentOutOfRangeException("number", number, "FizzBuzz ゲームは 1 から始まります。"); bool isMultipleOf3 = (number % 3 == 0); bool isMultipleOf5 = (number % 5 == 0); if (isMultipleOf3 && isMultipleOf5)‏ return "Fizz Buzz"; // … internal string Say(int number) { bool isMultipleOf3 = (number % 3 == 0); bool isMultipleOf5 = (number % 5 == 0); if (isMultipleOf3 && isMultipleOf5)‏ return "Fizz Buzz"; // …

ありがとうございました