メソッドの外部設計と テストファースト ~ 上手く TDD するために ~

Slides:



Advertisements
Similar presentations
わんくま同盟 名古屋勉強会 #3 タダで始めるテストファースト入門 C# Express + NUnit biac 機材協力 : 日本インフォメーション㈱ 2008/7/26.
Advertisements

わんくま同盟 名古屋勉強会 #2 Visual Studio 2008 でやる テスト駆動開発 2008/04/26 biac 機材協力 : 日本インフォメーション㈱ Test Driven Development.
わんくま同盟 名古屋勉強会 #17 biac
Japan Symposium on Software Testing 2004 はじめてみようテストファースト JaSST ’ 04 チュートリアル2 2004年1月28日 10:00 ~ 佐賀大学 大月 美佳 … こと、みかまま 東京コンファレンスセンター 品川.
テストについて 近畿大学大学院 田中大介 資料:
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
Visual Studio 2010 の新機能 Coded UI Test
背景 ソフトウェアの大規模化・複雑化 生産性と品質の向上 ↓ オブジェクト指向分析設計の適用 開発ツールの投入.
2008/09/20 TDD 道場 ~ みんな TDD やってみよう! ~.
1.1 C/C++言語 Hello.ccを作りコンパイルしてa.outを作り出し実行する
JSFによるWebアプリケーション開発 第9回
Applet 岡部 祐典 鈴木 敬幸.
~手続き指向からオブジェクト指向へ(Ⅰ)~
OJT研修 「テスト実施、テスト設計の技術習得」 日時: 8月22日(月)  場所: 本社5階.
Visual Studio 2008 でやる テスト駆動開発
C#によるWindowsFormApplication入門
アルゴリズムとデータ構造1 2007年6月12日
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
Biac /10/25 DI コンテナの本懐 ~ IoC の実装も楽々! biac
読んだもの1 P0145R1: Refining Expression Evaluation Order for Idiomatic C++
JavaServlet&JSP入門 01K0018 中村太一.
2008/09/20 TDD 道場 ~ ぼくと契約して TDD をやってよ! ~.
MSBuild 色々出来るよ 2011/04/02 お だ.
社会人学習講座 「Javaプログラミング概論」
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
初年次セミナー 第2回 文字の出力.
タダで始めるテストファースト入門 C# Express + NUnit
情報処理技法 (Javaプログラミング)2 第2回 前期の復習(2)
補足説明.
プログラム実行時情報を用いたトランザクションファンクション抽出手法
2016年11月25日 大阪開発センター 技術1部 深田 健太 アプライアンス&デジタルソリューション株式会社
~手続き指向からオブジェクト指向へ[Ⅱ]~
Biac /10/ /10/25 DI コンテナの本懐 ~ IoC の実装も楽々! biac
VBScriptで ユニットテストをやってみる
ペアプロ小劇場 劇団ペケぴー 天野勝 永和システムマネジメント 大熊知栄 アジアパシフィックシステム総研
Microsoft MVP for Development Tools – Visual C++
Microsoft Solutions Framework for Agile Software Development ver. 4.x
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
Microsoft MVP for Development Tools – Visual C++
TDDとメソッドの外部設計 テストファーストの秘訣 2009/08 biac.
メソッドの外部設計と テストファースト ~ 上手く TDD するために ~
Null ヤバイのでなんとかする takeshik.
Null ヤバイのでなんとかする takeshik.
C#言語ソースプログラムの原型 C言語 C#言語 Hello World! Hello Students! オマジナイ! 適当なクラス名
Limeを使ったユニットテストの実装方法
Java8について 2014/03/07.
2008/09/20 F# 入門 TDD 道場 ~ みんな TDD やってみよう! ~.
Microsoft MVP for Development Tools – Visual C++
もっと詳しくArrayクラスについて調べるには → キーワード検索
Visual Studio 2008 でやる テスト駆動開発
TDD ってどんな感じ? FizzBuzz を作ってみる 2010/01/22 biac 1.
Microsoft Solutions Framework for Agile Software Development ver. 4.x
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
★C++/オブジェクト指向実践企画★ Othelloゲーム作成
C#プログラミング実習 第3回.
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
nativeの基礎知識 「ポインタ」てなによ!?
プログラム分散化のための アスペクト指向言語
Microsoft Solutions Framework for Agile Software Development ver. 4.x
JAVA入門⑥ クラスとインスタンス.
Visual Studio 2013 の起動と プロジェクトの新規作成 (C プログラミング演習,Visual Studio 2019 対応) 金子邦彦.
How To WPF アプリケーション Part4 By 中博俊.
情報実習I (第1回) 木曜4・5限 担当:北川 晃.
ソフトウェア工学 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
アジャイル開発プロセス 森口朋広.
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
How To WPF アプリケーション Part3 By 中博俊.
Presentation transcript:

メソッドの外部設計と テストファースト ~ 上手く TDD するために ~ 2009.9.12 biac http://www.tdd-net.jp/

自己紹介 山本 康彦 ( biac ) 名古屋のとある ISV 勤務 もとは機械の設計屋さん いまだにプログラムを書きたがる 52歳 http://bluewatersoft.cocolog-nifty.com/ ※ ハンドルで ぐぐってもらえば見つかる (経済産業諮問委員会 じゃないほう ) 名古屋のとある ISV 勤務 この春まで、 WPF を使った業務アプリケーションの開発プロジェクトで品質保証を担当 MFS Agile を部分的に実施してみた もとは機械の設計屋さん ものごとの見方・考え方が、きっとズレてる

宣伝 : tdd-net.jp

Tech・Ed 2009 横浜に行ってきました …初日だけ f(^^; BoF-02: Visual Studio 2010 で進化するテスト環境 えムナウ、επιστημη、他1名 T2-305: Silverlight 3 の新機能 by MSKK 大西 彰 LT-01: TDD とメソッドの外部設計 by biac LT 登壇者7名のうち、3名が わんくま だったらしい 写真撮影: 原水 真一 (MSKK) 写真撮影: 原水 真一 (MSKK)

アジェンダ TDD のおさらい と やってみると難しい ということ メソッドの外部設計をやろう ということ Visual Studio 2010 で TDD のための機能がさらに強化されている ということ

Test Driven Development リファクタ RED GREEN TDD = テストファースト + リファクタリング 1. テストコードを書く。 (RED) 2. テストに通る製品コードを書く。 (GREEN) 3. リファクタリングする。 → 1. に戻る 1.~2. がテストファースト ※ これが出来ないと TDD にならない 6

テストファーストの効果 品質保証的に… 品質向上 (バグ減)‏ 設計書レビュー効果 単体テスト実施効果 それぞれで、バグが 3割以上減少 0.7 × 0.7 ⇒ 半分以下になる ! (結合テスト 2回分) 結合テストの半分以上はバグ対応 バグレポート・トリアージ・修正・確認テスト ⇒ この工数が半分以下に !! 7

テストファーストの効果 実装 結合テスト テスト実施 結合テスト バグ対応 8

TDD の効用 開発者的に… 安心‏ いつでもテストを実施して、 壊していないことを確認でき る ユニットテストを書き始めたら、 目の前のメソッドだけに 集中できる。 悩まなくていい。 楽しい 好きなだけ (時間さえ許せば)、 リファクタリングできる ※ 機械設計屋さん的には… テストケース ( テスト方法と合格判定値 ) 無しでは、 設計しよう がないよぉ~ (;; 9

いいことずくめの TDD …、 ところが ! 実際にやってみると…

ユニットテストを上手く書けない !! なにを書けばいいか、わからない ! テストケースが足りない ! 無駄なユニットテストを書いてしまう ! ⇒ 原因は ? いろいろ聞いてみると、 どうやら… メソッドの外部設計が上手く出来ない !! 11

アジェンダ TDD のおさらい と やってみると難しい ということ メソッドの外部設計をやろう ということ Visual Studio 2010 で TDD のための機能がさらに強化されている ということ

外部設計 external design 内部設計 internal design メソッドの設計 外部設計 external design 内部設計 internal design メソッドの外部設計 静的: シグネチャ (引数/返値) 動的: ふるまい (入力/出力) インターフェース

メソッドのふるまい (入出力) を定義するには、どうするか? メソッドのふるまいを定義する メソッドのふるまい (入出力) を定義するには、どうするか? メソッドのふるまいに対して影響を及ぼすもの (入力) をすべて見つけ出す。 引数、メンバー変数、中から呼び出したメソッドの返値… etc. メソッドのふるまいによって影響を受けるもの (出力) をすべて見つけ出す。 返値、メンバー変数、呼び出したメソッドで影響されるもの… 入出力の組み合わせパターンをすべて定義する。

外部設計の例 ~ 単純なメソッド 1入力 – 1出力 入力 string targetName 出力 返値 string null string BuildMessage(string targetName) 文字列 {foo} から、 “Hello, {foo} !” という文字列を作リ出す。 入力 string targetName 出力 返値 string null (NullReferenceException) "" (空文字) "Hello !!" "{foo}" (1文字以上) "Hello, {foo} !" http://bluewatersoft.cocolog-nifty.com/blog/2009/05/1-1f16.html

ユニットテストとして書き下す 入出力表の各行が、ひとつのテスト [TestMethod] [ExpectedException(typeof(NullReferenceException))] public void BuildMessageTest_nullを渡す() { Greeter g = new Greeter(); string dummyResult = g.BuildMessage((string)null); Assert.Fail("期待した例外が発生しませんでした。"); } public void BuildMessageTest_空文字を渡す() { Assert.AreEqual("Hello !!", g.BuildMessage(string.Empty)); public void BuildMessageTest_1文字以上の文字列を渡す() { Assert.AreEqual("Hello, NoMan !", g.BuildMessage("NoMan")); }

外部設計の例 ~ 複雑な入出力

外部設計の例 ~ 複雑な入出力 入力 ~ 引数 targetName と、システム時刻 3パターン × 6パターン ⇒ 18パターン? 出力 ~ string の返値と、 メンバー変数 AmPm string BuildMessageAndSetAmPm(string targetName) ・ 文字列 {foo} から、 “Hello, {foo} !” という文字列を作リ出す。 ・ また、 メンバ変数 AmPm に午前/午後の区別を書き込む。 ※ ただし、 targetName が空文字のときは “Hello !!” を返す。 ※ ただし、 "Hello" の部分は、 朝 (5時~10時) は "Good morning"、 昼 (10時~18時) は "Hello"、 夕方 (18時~20時) は "Good evening"、 それ以降は "Good night" とする。 http://bluewatersoft.cocolog-nifty.com/blog/2009/05/2-8801.html

外部設計の例 ~ 複雑な入出力 入力 出力 string targetName システム時刻 t メンバ変数 AmPm 返値 string null 0:00 <= t < 12:00 午前 (NullReferenceException) 12:00 <= t < 24:00 午後 "" (空文字) 0:00 <= t < 5:00 "Good night !!" 5:00 <= t < 10:00 "Good morning !!" 10:00 <= t < 12:00 "Hello !!" 12:00 <= t < 18:00 18:00 <= t < 20:00 "Good evening !!" 20:00 <= t < 24:00 "{foo}" (1文字以上) "Good night, {foo} !" "Good morning, {foo} !" "Hello, {foo} !" "Good evening, {foo} !"

組み合わせの爆発 前の例でも 14通りになった ⇒ 入力がもっと増えたらどうなる? テストケース数の爆発!! 対処は? ⇒ メソッドを分割する 例えば、「時刻を渡すと、メンバー変数 AmPm に午前/午後をセットする」メソッド SetAmPm() を切り出したら? 例えば、「時刻を渡すと、挨拶 (“Hello” とか “Good morning” とか) を返してくれる」メソッドを切り出したら?

メソッド分割で、組み合わせ爆発を防ぐ string GetGreet(DateTime t) void SetAmPm(DateTime t) 入力 DateTime t 出力 返値 string 0:00 <= t < 5:00 "Good night" 5:00 <= t < 10:00 "Good morning" 10:00 <= t < 18:00 "Hello" 18:00 <= t < 20:00 "Good evening" 20:00 <= t < 24:00 入力 DateTime t 出力 メンバー変数 AmPm 0:00 <= t < 12:00 午前 12:00 <= t < 24:00 午後

元は 14パターン ⇒ トータルで 10パターン、 個々の表は 2~5パターンに減らすことができた。 string BuildMessageAndSetAmPm(string targetName) 元は 14パターン ⇒ トータルで 10パターン、 個々の表は 2~5パターンに減らすことができた。 入力 出力 string targetName GetGreet(DateTime.Now) の返値 メンバ変数 AmPm 返値 string null "{bar}" (1文字以上) SetAmPm() 呼び出し (NullReferenceException) "" (空文字) "{bar} !!" "{foo}" (1文字以上) "{bar}, {foo} !"

メソッドの外部設計をしよう テストファーストに慣れるまでは、ふるまいを定義する入出力表を書こう 慣れてきたら、表を書かなくてもテストコードを書けるようになる さらに慣れてきたら、「TDD 三原則」

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

アジェンダ TDD のおさらい と やってみると難しい ということ メソッドの外部設計をやろう ということ Visual Studio 2010 で TDD のための機能がさらに強化されている ということ

クラスやメソッドのスケルトンを自動生成 "generate from usage" GUI の自動テスト “Coded UI Test” VS2010 の TDD 向け新機能 クラスやメソッドのスケルトンを自動生成 "generate from usage" GUI の自動テスト “Coded UI Test” (おまけ) Quick Search の camel-case match TFS (未確認) “Test Lab Manger” テスト影響分析 “Test Impact View” “Gated Check-in” (チェックインされるとビルド処理が作動) ワークフローベースのビルドエンジン