拡張型TDD
TDD研究会 井芹 洋輝

従来のTDDについて

テスト駆動開発（TDD）• 次のサイクルを繰り返す開発手法
1.
2.
3.

失敗するテストを書く（RED）
テストをパスするコードを書く（GREEN）
リファクタリングする（REFACTOR）

RED

REFACT
ORGREEN

TDDライブ

課題分析

検討内容
• 今回の論点– 品質改善効果に優れたTDD運用ノウハウを明らかにする– TDDを拡張し、従来の単体テスト工程でのユニットテスト
設計をTDDの活動の中に取り込む
拡張型TDDの効果

TDDの効果

単体テスト工程のテストの効果単体テスト工程でのユニットテスト• 実装工程後に行うコードベースのユニットテスト• テスト対象を分析し、網羅的にプログラムの欠陥検出、仕様への適合性検証を行う

プログラム
詳細設計

仕様
単体テスト

構造実装

TDDのテスト
単体テスト工程のテスト
TDDのテスト

単体テスト工程のテスト

目的

プログラミングのサポート

欠陥検出
仕様との適合性検証

フェーズ

プログラミング中継続的に実装作業後

条件や網羅度

荒い条件や網羅度「プログラミングの効率を落とさない」を優先

細かい条件や網羅度「十分に欠陥や仕様未達を検出する」を優先

TDD拡張の目標• 相乗効果– TDD→単体テスト工程：• テスタビリティの確保、テストコードの流用– 単体テスト工程→TDD• より品質の高いプログラムの実現• 相乗効果を活かし、TDDの中で単体テスト工程でのテストを確保する

TDD拡張にあたっての課題• 課題１：網羅的なテストを構築する– 網羅的なテストを確保– テストの品質を保証する仕組みを確保• 課題２：テストの品質を維持する– 堅牢製が高くテスト対象の変更を許容するテストを確保

拡張型TDD拡張型TDDとは• TDDの運用ノウハウ– TDD＋網羅的なテストの構築＋テストの保守– 従来のTDDを否定するものでない

1. 拡張型TDDのコア
2. 製品コード/テストコードの構造
3. ユニットテストの評価・作りこみTDDのコア

Assertファーストによる追加・変更（RED→GREEN）

RED

GreenREFACTORGREEN

リファクタリング（Refactor）

拡張型TDDのコア

RED
REFACTORGREEN• TEST• PRODUCT

テストコードの設計改善（REFACTOR[TEST]）

Assertファーストによる追加・変更（RED→GREEN）

Green

VERIFY&DEBUG

リファクタリング(Refactor[PRODUCT])

テスト設計の洗練(VERIFY&DEBUG)

Verify&Debug• テスト設計を作りこむ– テストケースを追加・洗練させる（Verify）– VerifyでREDになれば修正する（Debug)• Verifyでの付属的活動– 冗長なテストの削除– 仕様の確保Refactor[Product/Test]• Refactor[Test]– テストの入力値・期待値を変更せず、テストコードの記述改善を行う• コードの記述改善でテストの堅牢製・保守性を向上させる

まとめ• 課題達成のための活動を継続的に行う– Verify&Debugで網羅的なテスト設計を確保– Refactor[Test]でテストの堅牢製を確保
テストコードの設計改善（REFACTOR[TEST]）

Assertファーストによる追加・変更（RED→GREEN）

Green

リファクタリング(Refactor[PRODUCT])

テスト設計の洗練(VERIFY&DEBUG)

1. 拡張型TDDのコア
2. 製品コード/テストコードの構造
3. ユニットテストの評価・作りこみ製品コードの構造• テスト設計のやりやすさを観点にユニット（Classや関数）を整理する• 観点は２つ• 観点にそぐわないユニットはグルーピングして粒度を調整する
機能A

機能B
機能C

Unit Set

Unit観点１：担当機能が具体的で、仕様ベースのテスト設計を一まとめにできる
仕様

テスト設計

構造

テストの入力その他

観点１：担当機能が具体的で、仕様ベースのテスト設計を一まとめにできる
詳細機能A

仕様ユニットセット
MacroFile

PreProcess
Analyzer

ユニット

テスト設計

その他
MacroData

CodeSeeker

詳細機能B
構造

テストの入力ユニットセット

テスト対象

観点２：テストが限られたインターフェースを通して全体にアクセスできる
テストコード最適化された
インターフェース

Unit

ユニットセット

変更可能テストコードの構造• 目的でテストを２つに分類する

開発者テスト

品質確保のテスト• 開発作業(テストファースト/リファクタリング/欠陥局所化等)のために記述されたテスト• 網羅的にコードを検証するテスト• 単体テスト工程のテストを指向テストコードの構造
Verify & Debugで流用品質確保のテスト

開発者テスト
Unit

テストファーストやリファクタリング
等、開発支援として記述するテスト

テスト対象

品質確保のテストは限られた
インターフェースを介して全体を網羅

全体像
unit

限られたテストで全体網羅
単体テスト工程のテストを指向

品質確保のテスト
Verify&Debug

開発者
テスト
２つの観点を満たすグループ構造をとる

開発状況に応じて実装

製品コード

テストコード1. 拡張型TDDのコア
2. 製品コード/テストコードの構造
3. ユニットテストの評価

ユニットテストの評価• 「ピンポイントの評価」「継続的な評価支援」でユニットテストの品質を確保する
プログラミング
テスト実装
テスト実行
ピンポイントの評価・作りこみ

テストの評価
継続的な評価支援ピンポイントの評価• 品質確保のテストはイテレーティブに評価・修正
開発工程 テスト工程
テストの品質ゴールとなる水準

開発時間

• 効果
• 信頼できるテストを確保。後工程の負荷を最小化• テストは継続的に自動実行。後工程の手戻りを最小化継続的な評価支援• ユニットテストの継続的な評価を行い、ピンポイントの評価を容易にする体制を整備する– 推奨例：ペアプログラミング（★）• テストエンジニアとプログラマのペアプログラミングを推奨• チェックインの時点で適切な評価がなされている状態を確保

TDDと拡張部分

Verify&Debug
Refactor[Test]

ユニットテストの評価

TDDの領域

テスト設計の作りこみ拡張
ピンポイントのイテレーティブな評価
長期サイクルでのテストの品質保証(プロセスレベル)

Verify&Debug
短期サイクルでのテスト設計作りこみ

拡張による保証（プログラミング作業レベル）

TDD
超短期サイクルでのテスト実装（プログラミング作業レベル）

TDD
テストの網羅度拡張型TDDライブ

拡張型TDDを効果的に運用するには

拡張型TDDを支える能力モデル
拡張型TDD

ユニットテストの実践

TDDの実践

経験の共有
ユニットテストの設計

ユニットテストの実装

やり方の共有ソフトウェアテストの基礎

プログラミングの基礎

コンテキストの共有

開発者

テストエンジニア

拡張型TDDを支える能力モデル
拡張型TDD

ユニットテストの実践

TDDの実践

経験の共有
ユニットテストの設計

ユニットテストの実装

やり方の共有ソフトウェアテストの基礎

プログラミングの基礎

コンテキストの共有

開発者

テストエンジニア

拡張型TDDを支える能力モデル
ペア
テスティングペア
プログラミング

拡張型TDD

ユニットテストの実践

TDDの実践

経験の共有

ユニットテストの設計

ユニットテストの実装

やり方の共有ソフトウェアテストの基礎

プログラミングの基礎

コンテキストの共有

開発者

テストエンジニア

拡張型TDDを支えるもの• 拡張型TDDの効率化はチーム文化の課題• TDDにおいてテストエンジニアと開発者のコラボレーションの相乗効果は大• テストエンジニアと開発者がコンテキスト、手法、経験を共有し、より効率的なTDDを！

ご清聴ありがとうございました• 拡張型TDD– ４つの活動– 開発者テスト/品質確保のテストの両立– ピンポイントのテストの評価・作りこみ/
継続的な底上げ