• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
テスト駆動開発のはじめ方
 

テスト駆動開発のはじめ方

on

  • 18,391 views

2013.03.02 CLR/Hでの発表資料です.

2013.03.02 CLR/Hでの発表資料です.
http://clr-h.jp/Home/tabid/40/ModuleID/396/ItemID/30/mctl/EventDetails/language/en-US/Default.aspx

Statistics

Views

Total Views
18,391
Views on SlideShare
7,902
Embed Views
10,489

Actions

Likes
35
Downloads
63
Comments
0

19 Embeds 10,489

http://morizyun.github.io 9755
http://bikkuri.me 341
http://makies.hatenablog.com 186
https://twitter.com 75
http://cloud.feedly.com 48
http://s.deeeki.com 22
http://a-hum.unoke.pfu.co.jp 22
http://morizyun.github.io.dev 9
http://www.google.co.jp 7
http://feeds.feedburner.com 6
http://webcache.googleusercontent.com 4
http://summary 3
https://www.google.co.jp 2
http://translate.googleusercontent.com 2
http://reader.aol.com 2
http://digg.com 2
http://planet.ezocast.net 1
http://feedly.com 1
http://www.google.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    テスト駆動開発のはじめ方 テスト駆動開発のはじめ方 Presentation Transcript

    • テスト駆動開発の はじめ方 2013.03.2 CLR/H Shuji Watanabe (@shuji_w6e) 113年3月2日土曜日
    • 自己紹介13年3月2日土曜日
    • 渡辺 修司 / @shuji_w6e 札幌Javaコミュニティ やさしいデスマーチ(Blog) Java, Groovy, JavaScript, Ruby, TDD JUnit実践入門 https://forkwell.com/u/shuji.w6e ロードバイク, フットサル, スノーボード13年3月2日土曜日
    • テスト駆動開発とは?13年3月2日土曜日
    • テストファースト リファクタリング13年3月2日土曜日
    • テスト駆動開発とは、プロダクションコード よりも先にテストコードを書くテストファー ストを基盤とした反復的な開発手法。 先にテストを意識することにより設計を駆動 し、常にリファクタリングを行うことで動作 するきれいなコードを手に入れることができ る。13年3月2日土曜日
    • テスト駆動開発のサイクル 1.設計する 5.リファクタリング Heuristics 2.テストを書く 4.テストを成功させる 3.コードを書く13年3月2日土曜日
    • TDDはテストリストが起点 プログラムが満たすべき仕様をリスト化 最初に全てを抽出できない テストリストは随時、追加・修正 ただし、具体的な仕様(例)が必要 例:getListで1件のデータが取得できる13年3月2日土曜日
    • テスト駆動開発のFAQ 問. どのくらい事前設計すべきでしょうか? どうすれば、いつやめるかわかるのでしょうか? 答. 何を構築すべきかわかるまでです。 Derick Bailey http://www.infoq.com/jp/news/2008/03/tdd-smells13年3月2日土曜日
    • 何を構築すべきか?13年3月2日土曜日
    • 顧客が本当に必要だったもの システム開発の目的は顧客の要件の実現13年3月2日土曜日
    • 何を構築すべきか? 要件から「何を構築するか」を設計する 外部的振る舞いを設計する システムが満たすべきテストケース13年3月2日土曜日
    • 外部設計とテストリスト 外部設計 顧客の要件 テストリスト 「何を構築するか?」 プログラム13年3月2日土曜日
    • 外部設計とテストリスト 外部設計 顧客の要件 テストリスト 「何を構築するか?」 プログラム13年3月2日土曜日
    • テストリストとTDD TDD 顧客の要件 テストリスト 「何を構築するか?」 プログラム13年3月2日土曜日
    • テストリストとTDD TDD 顧客の要件 テストリスト 「何を構築するか?」 プログラム13年3月2日土曜日
    • TDDは開発手法 良いプログラムは開発できるが、良いシステ ムを開発できるわけではない 良いシステム = 顧客の要件を満たすシステム 要件を満たすテストリストを作ることが重要13年3月2日土曜日
    • 外部設計の手法 顧客のことばを使う ユースケース ユーザーストーリー 顧客が理解できるツールを使う 画面や帳票のモックアップ13年3月2日土曜日
    • 開発プロセスと外部設計13年3月2日土曜日
    • 開発プロセス ソフトウェアを作るための手順・段階 アジャイルでもWFでも基本は変わらない 要件定義 外部設計 プログラミング テスト13年3月2日土曜日
    • 外部設計 システムの外部的振る舞い 利用者視点 要件定義とのトレーサビリティ システム化するスコープ 実装とのトレーサビリティ 内部(システム化方式)に依存しない13年3月2日土曜日
    • システム境界 システムと外部との接点 どこからがシステムの機能・データなのか? ユーザーインターフェイス(画面) 外部インターフェイス システム境界 システム 機能 データ ユーザ 外部システム13年3月2日土曜日
    • トレーサビリティ 追跡(トレース)性 成果物同士が論理的に繋がっているか? 各フェイズでの成果物の整合性も必須 要件定義 外部設計 実装 比較的に保てる 保ちにくい13年3月2日土曜日
    • ユースケース駆動開発を活用した テスト駆動開発13年3月2日土曜日
    • ユースケース駆動開発 ユースケース駆動開発とは、ユースケースを開 発の基点として顧客の要件を定義し、ユースケ ースから設計・実装までのトレーサビリティを 保つ事を重視して開発を進める開発手法。 システム トレーサビリティ ユースケース System Software ユースケース アクター Heuristics13年3月2日土曜日
    • ユースケース システムの機能を表すシナリオ(使用例) 外部的な振る舞いと内部的な振る舞い システムと外部とのやり取りを記述する 要件定義フェイズで抽出され、 外部設計フェイズで詳細化する13年3月2日土曜日
    • 自動販売機でドリンクを購入する 1.ユーザは、お金を投入する 2.ユーザは、購入するドリンクのボタンを押す 3.システムは、対象のドリンクを排出する 4.ユーザは、払い出しボタンを押す 5.システムは、お釣りを払い出す システムとユーザのインタラクションを記述 1行で1つのアクションを記述 文末は「∼する」(「∼できる」は厳禁)13年3月2日土曜日
    • 参考)ユースケース図 ユースケースとアクターとの関係 構造化されたインデックス 重複を整理 関連するものをまとめる 本質はユースケース13年3月2日土曜日
    • 参考) 本質ユースケース ビジネスユースケース/ Essential Use Case 簡潔で、抽象化され、一般的なユースケース 実装に依存しない形 要求 抽象的 要求分析に適する 本質ユースケース システムユースケース 実装に結びつけにくい 具体的 実装 http://www.ogis-ri.co.jp/otc/swec/process/am-res/am/artifacts/essentialUseCase.html http://www.ogis-ri.co.jp/otc/swec/process/am-res/am/artifacts/systemUseCase.html13年3月2日土曜日
    • ユースケースから実装を導く ユースケースから実装を導く ユースケースが適切である事が前提 つまり、顧客の言葉である ユースケースからオブジェクト(名詞)を抽出 「表示する」「取得する」など動詞 アーキテクチャに依存しない13年3月2日土曜日
    • ロバストネス分析 ユースケースからオブジェクトを抽出・整理 するための分析方法 ユースケースを3つの要素に分解する バウンダリ アクター バウンダリ コントローラ コントローラ エンティティ エンティティ ユースケースに対する健全性チェック13年3月2日土曜日
    • 自動販売機でドリンクを購入する 1.ユーザは、お金を投入する 2.ユーザは、購入するドリンクのボタンを押す 3.システムは、対象のドリンクを排出する 4.ユーザは、払い出しボタンを押す メソッドの候補 クラスの候補 何を構築すべきか?13年3月2日土曜日
    • アーキテクチャの適用 言語/フレームワークの選択 Rails, JavaEE, Django, CakePHP 細かい点は異なるが骨格は変わらない ユースケース + アーキテクチャ 実装可能13年3月2日土曜日
    • ユースケースシナリオを例にする ユーザは、お金を投入する 1.ユーザは、購入するドリンクのボタンを押す 2.システムは、対象のドリンクを排出する 3.ユーザは、払い出しボタンを押す 4.システムは、お釣りを払い出す 具体的な例とすることで テストできる 問題点に気付くことができる13年3月2日土曜日
    • ユースケースシナリオを例にする 1.ユーザは、100硬貨を2枚を投入する ユーザは、お金を投入する 2.ユーザは、コーラのボタンを押す 1.ユーザは、購入するドリンクのボタンを押す 3.システムは、コーラを排出する 2.システムは、対象のドリンクを排出する 4.ユーザは、払い出しボタンを押す 3.ユーザは、払い出しボタンを押す 5.システムは、10硬貨を8枚を払い出す 4.システムは、お釣りを払い出す 具体的な例とすることで テストできる 問題点に気付くことができる13年3月2日土曜日
    • ユースケースシナリオを例にする 1.ユーザは、100硬貨を2枚を投入する ユーザは、お金を投入する 2.ユーザは、コーラのボタンを押す 受け入れテスト 1.ユーザは、購入するドリンクのボタンを押す 3.システムは、コーラを排出する 2.システムは、対象のドリンクを排出する (Cucumberなど) 4.ユーザは、払い出しボタンを押す 3.ユーザは、払い出しボタンを押す 5.システムは、10硬貨を8枚を払い出す 4.システムは、お釣りを払い出す 具体的な例とすることで テストできる 問題点に気付くことができる13年3月2日土曜日
    • ユースケースシナリオを例にする 1.ユーザは、100硬貨を2枚を投入する ユーザは、お金を投入する 2.ユーザは、コーラのボタンを押す 受け入れテスト 1.ユーザは、購入するドリンクのボタンを押す 3.システムは、コーラを排出する 2.システムは、対象のドリンクを排出する (Cucumberなど) 4.ユーザは、払い出しボタンを押す 3.ユーザは、払い出しボタンを押す 5.システムは、10硬貨を8枚を払い出す 4.システムは、お釣りを払い出す # language: ja フィーチャ: 自動販売機で飲み物を購入 具体的な例とすることで シナリオ: コーラを1本買う 前提 100円を2枚投入する テストできる もし コーラのボタンを押した ならば コーラが出力される かつ お釣りは10円が’8’枚である 問題点に気付くことができる13年3月2日土曜日
    • 各ステップをテストリストにする 1.ユーザは、お金を投入する 2.ユーザは、購入するドリンクのボタンを押す 3.システムは、対象のドリンクを排出する 4.ユーザは、払い出しボタンを押す 5.システムは、お釣りを払い出す13年3月2日土曜日
    • 各ステップをテストリストにする 1.ユーザは、お金を投入する 2.ユーザは、購入するドリンクのボタンを押す • (初期状態で)合計金額は0円である 3.システムは、対象のドリンクを排出する • 100円硬貨を投入すると、合計金額が100円である 4.ユーザは、払い出しボタンを押す • 100円硬貨を投入されている時に、 5.システムは、お釣りを払い出す  10円硬貨を投入すると、合計金額が110円である13年3月2日土曜日
    • 各ステップをテストリストにする 1.ユーザは、お金を投入する 2.ユーザは、購入するドリンクのボタンを押す • (初期状態で)合計金額は0円である 3.システムは、対象のドリンクを排出する • 100円硬貨を投入すると、合計金額が100円である 4.ユーザは、払い出しボタンを押す • 100円硬貨を投入されている時に、 5.システムは、お釣りを払い出す  10円硬貨を投入すると、合計金額が110円である { @Test public void 初期状態でgetTotalAmountは0を返す() throws Exception VendingMachine sut = new VendingMachine(); int actual = sut.getTotalAmount(); assertThat(actual, is(0)); }13年3月2日土曜日
    • ユースケース駆動開発とTDD ユースケース TDD クラス/メソッド クラス/メソッド 受入テスト クラス/メソッド クラス/メソッド (機能テスト) TDD クラス/メソッド クラス/メソッド クラス/メソッド クラス/メソッド 受入テスト ユースケース (機能テスト) ユースケース13年3月2日土曜日
    • ユースケース駆動開発の利点 受入テストが設計時に明確 自動化できればベスト 適切な粒度の「何を構築すべきか?」 システムの完成度 本来はユースケース単位で意味がある 現実として進 管理が必要13年3月2日土曜日
    • まとめ TDDだけでは良いシステムは作れない 顧客の要件からテストリストを導く ユースケースシナリオとテストリスト テストリストから実装を導く(TDD)13年3月2日土曜日
    • おすすめの書籍 ユースケース駆動開発実践ガイド 実践アジャイルテスト JUnit実践入門13年3月2日土曜日