More Related Content More from hiroyuki Yamamoto
More from hiroyuki Yamamoto (20) テスト駆動開発のエッセンス2. アジェンダ
テスト駆動開発とはどんなものか
●
自動テストセット
●
ユニットテストの書き方
●
テスト駆動開発のテストはテストじゃない
●
プログラミングと洞察
●
おまけ:C言語版ユニットテストセットの例
●
3. 典型的なテスト駆動開発
単体テストフレームワーク(xUnit)の利用
●
開発者自身によるユニットテストの作成
●
ユニットテストセットの常時再実行
●
(まずテストケースを書き、それにパスするよ
●
うにコードを書く)
4. テスト駆動開発はどこから来たか
テストファースト(Test-First)
●
アジャイルソフトウェア開発手法eXtreme
–
Programming(XP, 1999)のプラクティスのひとつ
「コードを変更する前に、失敗する自動テストを作
–
成する」
後にテスト駆動開発Test-Driven
●
Development(TDD, 2002)という名前で開発手
法としてXPから独立
自動テストセットを用いる開発方法
–
XP/アジャイルに限定しない
–
6. テスト駆動開発のコンセプト
目標:動作するきれいなコード
●
開発を予測可能にする
–
コードからノウハウを得る機会をつくる
–
ソフトウェアのユーザーの生活を向上させる
–
開発チームメンバー同士の信頼を築く
–
コードを書くのが心地よい
–
7. テスト駆動開発の構成要素
自動テストセット
●
ソフトウェアの振舞いを自動検証する
–
テストプログラム(群)
–
開発手順
●
レッド・グリーン・リファクタリングのリズム
–
テストを少し、コードを少し
–
自動テストセットこそ重要
●
開発方法は手段
●
8. 自動テストセットこそ重要
自動テストセットは何の役にたつか
●
デグレード検出
–
ドキュメント
–
デバッグツール
–
進捗の指標
–
安心、勇気、スピード、積極性、等々、を与え
●
てくれる
とはいえ、タダではない
●
9. 自動テストセットの収支
作成にはコストがかかる
●
メンテナンスにもコストがかかる
●
価値を高め、コストを下げる工夫が必要
●
10. 自動テストセットの価値を高める
早く使い始める
●
プログラマ自身が自分でテストを書く
–
繰り返し利用する
●
コンパイルするたびに実行する
–
継続的にビルドして常時実行する
–
インクリメンタル・イテレーティブな開発
–
11. 自動テストセットのコストを下げる
作成コストを下げる
●
テストを書きやすい設計
–
結合度を下げ凝集度を上げる
●
テストを書きながらコードを書く
–
メンテナンス性を上げる
●
壊れにくくする
–
依存性を減らす
●
単体テストを自動化する
–
ひとつのテストはひとつのことしかテストしない
–
モックオブジェクトの使用
–
12. テスト駆動開発の前提
有機的(進化的)設計
●
プログラマがテストも書く
●
迅速なビルドを可能とする開発環境
●
テスト可能な設計
●
いずれも、自動テストセットの利益を高める
●
か、あるいはコストを下げるために必要なこと
13. ユニットテストの書き方
厳格なテストファーストでなくてもよいと思い
●
ます
クライアントコード例を書くつもりで
●
クライアントコードをユニットテストとして
–
書いてみる
実装する
–
必要に応じてテストを足す
–
プログラミングインタフェースさえ明確に
●
できていれば、後からなんとかできる
14. 全肯定テストセット作成術
既存コードの振舞い(インプットとアウトプッ
●
ト、状態の変化)を、デバッガで調べて、ユ
ニットテストとして記述する
テストセットができてしまえばこちらのもの
●
デグレード検出できるので、リファクタリン
–
グだってできる
15. テスト駆動開発の手順のねらい
テストをすこし、コードをすこし
●
作りすぎを防ぐ
–
構造化を促す
–
安心感を得る
–
レッド・グリーン・リファクタリング
●
リズムを与える
–
手順はオプションですが、理に適っていると思
●
います
16. ユニットテストフレームワーク孝
シンプルなもので十分
●
MinUnit(C言語用)はたった3行
–
僕が普段使っている自作ライブラリはマクロ2個だ
–
けです
Makefileとサンプルといつでも相談にのる姿勢
●
が重要
17. 自動テストセットが満たすべき性質
テストの自動化を考えるときの参考に
簡単実行
●
言うまでもなく...
–
自己検証
●
OK/NGまでプログラムに判断させる
–
繰り返し可能
●
何度実行しても同じ結果が得られること
–
独立性
●
(なるべく)環境や外部のコンポーネントに依存しない
–
テストケースの実行順に依存しない
–
18. いまどきのフレームワークに
求められるもの
アプリケーションをテストしにくいフレーム
●
ワークは困る
ユニットテストをいかにサポートするか
●
デプロイしなくても単体でテストしたい
●
xUnitなどデファクトの単体テストフレーム
●
ワークに載せたい
ドライバやモックの機構を提供する
●
19. テスト駆動開発のテストは
テストじゃない?
テスト駆動開発のテストは仕様記述
●
プログラムが仕様に適合していることを示す
–
実行すればただちに示される
●
デバッグ(バグ探し)ではない
●
20. 機能テストについて
機能テストがあってのユニットテスト
●
ダブルチェック
–
テストビューからコントローラとモデルへのテストを
●
自動化するのが基本
UIのテストやDBMSまで結合したテストはコストが高
●
いので、すべてをやろうとせず(単体テストや機能テ
ストで補間して)、観点を絞って行うとよいのでは
21. テスト駆動開発が合う開発
合わない開発
探索的な開発とは相性が良くない?
●
割り切って、後からテストを書く
–
あるいは、後からテスト駆動で書き直す
–
制約を課すことで洞察を得るのが、手法として
●
の目的
アジャイル/リーン(トヨタ式)に共通する特徴
–
23. 参考文献
XPエクストリーム・プログラミング入門 第二
●
版
テスト駆動開発入門
●
ケント・ベック著+長瀬嘉秀訳...かなり厳しいです
–
が、原典なので。よく読むと、すべて書いてありま
す。
xUnit Test Patterns - Gerard Meszaros
●
テスト駆動開発の考え方とパターンを網羅した決定
–
版。900ページ位ある。翻訳中との噂。
25. 付録:C言語ユニットテストセット例1/3
テスト呼出しヘルパマクロ
/* unit_test.h */
#ifndef UNIT_TEST_H
#define UNIT_TEST_H
#include <stddef.h>
#include <stdio.h>
extern size_t unit_test_count;
#define RUN_TEST(test) do { printf(#test quot;tquot;); fflush(stdout);
test(); printf(quot;OKnquot;); ++unit_test_count; } while(0)
#define RUN_SUITE(suite) do { void suite(void); suite(); } while(0)
#endif