tddの原理 ~ スペック・ファースト

21
biac BluewaterSoft

Upload: yasuhiko-yamamoto

Post on 02-Jul-2015

931 views

Category:

Technology


0 download

DESCRIPTION

TDDBC 大阪 for C#(Visual Studioハッカソン事前勉強会) 2013/01/18 http://atnd.org/events/34775

TRANSCRIPT

Page 1: TDDの原理 ~ スペック・ファースト

biacBluewaterSoft

Page 2: TDDの原理 ~ スペック・ファースト

biac (山本 康彦)

BluewaterSoft http://www.bluewatersoft.jp/

略歴- 名古屋大学工学部(修士)- HONDA R&Dで自動車設計- 1994~ ソフトウェア業界- 2012~ BluewaterSoft

著書「速攻入門 C#」(2012/3) 技術評論社、共著「ソフトな彼女とハードな彼氏。」(2012/3) アジャイルマインドvol.1掲載

2013/1/18 Visual Studio ハッカソン事前勉強会 2

Page 3: TDDの原理 ~ スペック・ファースト

連載「C#でTDD入門」 CodeZine「WinRT/Metro Tips」 @IT .NET開発者中心

WebTDD.NET http://www.tdd-net.jp/biac の それさえもおそらくは幸せな日々@nifty

http://bluewatersoft.cocolog-nifty.com/blog/

2013/1/18 Visual Studio ハッカソン事前勉強会 3

Page 4: TDDの原理 ~ スペック・ファースト

“Test Driven Development: By Example” (2002)

We drive development with automated tests, a style of development called Test-Driven Development (TDD).

参考訳

自動化されたテストを使って、私たちは開発を駆動する。それがテスト駆動開発(TDD)と呼ばれる開発のスタイルだ。

2013/1/18 Visual Studio ハッカソン事前勉強会 4

× テスト○ 自動化されたテスト

× テストが駆動する○ 私たちが駆動する

Page 5: TDDの原理 ~ スペック・ファースト

“Test Driven Development: By Example” (2002)

In Test-Driven Development, we・Write new code only if an automated test has failed・Eliminate duplication

These are two simple rules.

参考訳

TDDでは、・自動化されたテストが失敗したときだけ、新しいコードを書く・重複を無くす

たった2つのシンプルなルール

2013/1/18 Visual Studio ハッカソン事前勉強会 5

テストファースト

リファクタリング

Page 6: TDDの原理 ~ スペック・ファースト

レッド / グリーン / リファクタ「黄金の三角形」by @t_wada

テストファースト失敗する自動化されたテスト ⇒ 新しいコードを書いてパスさせる ⇒

リファクタリングAll Greenを維持したまま改良 ⇒

2013/1/18 Visual Studio ハッカソン事前勉強会 6

Page 7: TDDの原理 ~ スペック・ファースト

プロのモノ作りとして 当たり前の手順

2013/1/18 Visual Studio ハッカソン事前勉強会 7

Page 8: TDDの原理 ~ スペック・ファースト

私の造語

あまりにも当たり前すぎて、この概念を示す言葉が無いっぽい

つまり…

なにを作るかを決めてから↓どうやって作るかを考える

2013/1/18 Visual Studio ハッカソン事前勉強会 8

Page 9: TDDの原理 ~ スペック・ファースト

スペックを決める- 外観- 性能 ex)最高速300km/h以上 etc.

作り方を考える- 構造は?- 部品は?- 製造ラインは?画像は「自動車製品開発のプロセスと組織」(藤本隆宏)より

2013/1/18 Visual Studio ハッカソン事前勉強会 9

Page 10: TDDの原理 ~ スペック・ファースト

スペックを決めてから→ 作り方を考える

ゴールを決めてから→ それをクリアすべく行動する

外部設計 (external design - 外から見た設計)→ 内部設計 (internal design - 内から見た設計)

※ 外部設計を満たすような内部構造を設計

2013/1/18 Visual Studio ハッカソン事前勉強会 10

Page 11: TDDの原理 ~ スペック・ファースト

An act of identifying something precisely or of stating a precise requirement.( Oxford Dictionaries http://oxforddictionaries.com/definition/english/specification )

何かを正確に識別するか、正確な要求を述べる行為

Could you be a little more specific?もう少し具体的に言ってください

スペック=具体的な要求製造業の製品開発においては、検証可能(合否を判断できる)であること。

2013/1/18 Visual Studio ハッカソン事前勉強会 11

Page 12: TDDの原理 ~ スペック・ファースト

an abstract idea( Oxford Dictionaries http://oxforddictionaries.com/definition/english/concept )

抽象的なアイデア

「世界一速いクルマ」 ← コンセプト、要望「2ℓエンジン市販車で最高速300km/h超」

← スペック、仕様

違いは、検証可能かどうか。

言い換えると「テスタブル」か否か。

あなたのところの要件定義書や外部設計書は、スペック? or コンセプト?

2013/1/18 Visual Studio ハッカソン事前勉強会 12

Page 13: TDDの原理 ~ スペック・ファースト

スペック ファーストしてますか?

製造業で部品の図面を描くとき。たとえば、ネジ1本1. 設計者は、ネジのスペックを設定する。

引張り強度、最大締め付けトルク、防錆性能(塩水噴霧試験時間) etc. etc.

2. 設計者は、スペックを満たす部品形状・材質etc.を決定し、ネジの図面を描く。(スペックも図面に記載することが多い)

2013/1/18 Visual Studio ハッカソン事前勉強会 13

Page 14: TDDの原理 ~ スペック・ファースト

FizzBuzzプログラムの仕様・1,2,…という整数に対し、1,2,…と答える・ただし、3の倍数のときはFizzと答える・ただし、5の倍数のときはBuzzと答える・ただし、3の倍数でかつ5の倍数のときは

Fizz Buzzと答える

いいえ、スペックではありません!これだけでは、どうやって検証すればよいか分からないから。PCの前で「いち」と言うと、プログラムが「いち」と喋るのかもしれないよ!

2013/1/18 Visual Studio ハッカソン事前勉強会 14

Page 15: TDDの原理 ~ スペック・ファースト

FizzBuzzメソッドのスペック(例)シグネチャ:

public static string FizzBuzz(int n)動作:

…あれ? ここまで明確にできたのなら、コードで表現(=自動化)できるんじゃ!?

2013/1/18 Visual Studio ハッカソン事前勉強会 15

引数nが3の倍数?

引数nが5の倍数? 返値

false false n.ToString()

true false "Fizz"

false true "Buzz"

true true "Fizz Buzz"

Page 16: TDDの原理 ~ スペック・ファースト

FizzBuzzメソッドのスペックをコード化ただし、すべてのnについて書くと多すぎるので、例示に留める。

[TestCase(1, "1")][TestCase(2, "2")][TestCase(3, "Fizz")][TestCase(5, "Buzz")][TestCase(6, "Fizz")][TestCase(10, "Buzz")][TestCase(15, "Fizz Buzz")]public void FizzBuzzTest(int n, string expected) {

string result = FizzBuzzer.FizzBuzz(n);Assert.AreEqual(expected, result);

}

2013/1/18 Visual Studio ハッカソン事前勉強会 16

Page 17: TDDの原理 ~ スペック・ファースト

あとはスペックを満たすメソッドを書くだけだ!これぞ「テスト ファースト」!?

いいえ、テスト ファーストではありません!!

スペック ファーストという当たり前のことを、ちょっと自動化してみただけです。

2013/1/18 Visual Studio ハッカソン事前勉強会 17

Page 18: TDDの原理 ~ スペック・ファースト

“Test Driven Development: By Example” (2002)

In Test-Driven Development, we・Write new code only if an automated test has failed・Eliminate duplication

These are two simple rules.

参考訳

TDDでは、・自動化されたテストが失敗したときだけ新しいコードを書く・重複を無くす

たった2つのシンプルなルール

2013/1/18 Visual Studio ハッカソン事前勉強会 18

テストファースト

リファクタリング

Page 19: TDDの原理 ~ スペック・ファースト

例示でスペックを表現する … … どれだけ例示したら完璧なのか、分からない!!

例示の仕分け:コードを育てるのに有用か否か?

例示を追加 → 検証をパスコードを直さなくてパスするなら、今追加した例示はコードを育てていない → 不要

例示を追加 → 検証失敗コードを直さねばならない = コードを育てる例示である → 有用

2013/1/18 Visual Studio ハッカソン事前勉強会 19

Page 20: TDDの原理 ~ スペック・ファースト

テスト ファースト =

スペック ファースト +(モノ作りでは当たり前の手順)

automated test +(例示によるスペック表現)

例示を最少化するテクニック

※ ただし、不安を解消するためや、ドキュメントの役割を持たせるため等で、例示を追加しても構わない。

2013/1/18 Visual Studio ハッカソン事前勉強会 20

Page 21: TDDの原理 ~ スペック・ファースト

TDDの原理 ~ スペック・ファースト ~

2013/1/18 Visual Studio ハッカソン事前勉強会 21