SlideShare a Scribd company logo
1 of 27
Download to read offline
テスト駆動開発のエッセンス

  自動テストセットは欲しいけれど
 テストファーストが嫌いな人のための

       2009-03-22
 山本 博之@名古屋アジャイル勉強会
アジェンダ
    テスト駆動開発とはどんなものか
●



    自動テストセット
●



    ユニットテストの書き方
●



    テスト駆動開発のテストはテストじゃない
●



    プログラミングと洞察
●



    おまけ:C言語版ユニットテストセットの例
●
典型的なテスト駆動開発
    単体テストフレームワーク(xUnit)の利用
●



    開発者自身によるユニットテストの作成
●



    ユニットテストセットの常時再実行
●



    (まずテストケースを書き、それにパスするよ
●


    うにコードを書く)
テスト駆動開発はどこから来たか
    テストファースト(Test-First)
●



        アジャイルソフトウェア開発手法eXtreme
    –
        Programming(XP, 1999)のプラクティスのひとつ
        「コードを変更する前に、失敗する自動テストを作
    –
        成する」
    後にテスト駆動開発Test-Driven
●


    Development(TDD, 2002)という名前で開発手
    法としてXPから独立
        自動テストセットを用いる開発方法
    –

        XP/アジャイルに限定しない
    –
テスト駆動開発の起源?
(著者ケント・ベックが12歳の時に読んだ)
 「この書籍には、実際に入力したテープから想
 定される出力テープを打ち込み、実際の結果が
 予想された結果と一致するまでコーディングす
 ることが提唱されていた。」
           「テスト駆動開発入門」
テスト駆動開発のコンセプト
    目標:動作するきれいなコード
●



        開発を予測可能にする
    –

        コードからノウハウを得る機会をつくる
    –

        ソフトウェアのユーザーの生活を向上させる
    –

        開発チームメンバー同士の信頼を築く
    –

        コードを書くのが心地よい
    –
テスト駆動開発の構成要素
    自動テストセット
●



        ソフトウェアの振舞いを自動検証する
    –

        テストプログラム(群)
    –

    開発手順
●



        レッド・グリーン・リファクタリングのリズム
    –

        テストを少し、コードを少し
    –

    自動テストセットこそ重要
●



    開発方法は手段
●
自動テストセットこそ重要
    自動テストセットは何の役にたつか
●



        デグレード検出
    –

        ドキュメント
    –

        デバッグツール
    –

        進捗の指標
    –

    安心、勇気、スピード、積極性、等々、を与え
●


    てくれる
    とはいえ、タダではない
●
自動テストセットの収支
    作成にはコストがかかる
●



    メンテナンスにもコストがかかる
●



    価値を高め、コストを下げる工夫が必要
●
自動テストセットの価値を高める
    早く使い始める
●



        プログラマ自身が自分でテストを書く
    –

    繰り返し利用する
●



        コンパイルするたびに実行する
    –

        継続的にビルドして常時実行する
    –

        インクリメンタル・イテレーティブな開発
    –
自動テストセットのコストを下げる
    作成コストを下げる
●



        テストを書きやすい設計
    –

            結合度を下げ凝集度を上げる
        ●


                テストを書きながらコードを書く
            –


    メンテナンス性を上げる
●



        壊れにくくする
    –

            依存性を減らす
        ●


                単体テストを自動化する
            –

                ひとつのテストはひとつのことしかテストしない
            –

                モックオブジェクトの使用
            –
テスト駆動開発の前提
    有機的(進化的)設計
●



    プログラマがテストも書く
●



    迅速なビルドを可能とする開発環境
●



    テスト可能な設計
●



    いずれも、自動テストセットの利益を高める
●


    か、あるいはコストを下げるために必要なこと
ユニットテストの書き方
    厳格なテストファーストでなくてもよいと思い
●


    ます
    クライアントコード例を書くつもりで
●



        クライアントコードをユニットテストとして
    –
        書いてみる
        実装する
    –

        必要に応じてテストを足す
    –

            プログラミングインタフェースさえ明確に
        ●


            できていれば、後からなんとかできる
全肯定テストセット作成術
    既存コードの振舞い(インプットとアウトプッ
●


    ト、状態の変化)を、デバッガで調べて、ユ
    ニットテストとして記述する
    テストセットができてしまえばこちらのもの
●



        デグレード検出できるので、リファクタリン
    –
        グだってできる
テスト駆動開発の手順のねらい
    テストをすこし、コードをすこし
●



        作りすぎを防ぐ
    –

        構造化を促す
    –

        安心感を得る
    –

    レッド・グリーン・リファクタリング
●



        リズムを与える
    –

    手順はオプションですが、理に適っていると思
●


    います
ユニットテストフレームワーク孝
    シンプルなもので十分
●



        MinUnit(C言語用)はたった3行
    –

        僕が普段使っている自作ライブラリはマクロ2個だ
    –
        けです
    Makefileとサンプルといつでも相談にのる姿勢
●


    が重要
自動テストセットが満たすべき性質
            テストの自動化を考えるときの参考に

    簡単実行
●



        言うまでもなく...
    –

    自己検証
●



        OK/NGまでプログラムに判断させる
    –

    繰り返し可能
●



        何度実行しても同じ結果が得られること
    –

    独立性
●



        (なるべく)環境や外部のコンポーネントに依存しない
    –

        テストケースの実行順に依存しない
    –
いまどきのフレームワークに
        求められるもの
    アプリケーションをテストしにくいフレーム
●


    ワークは困る
    ユニットテストをいかにサポートするか
●



    デプロイしなくても単体でテストしたい
●



    xUnitなどデファクトの単体テストフレーム
●


    ワークに載せたい
    ドライバやモックの機構を提供する
●
テスト駆動開発のテストは
          テストじゃない?
    テスト駆動開発のテストは仕様記述
●



        プログラムが仕様に適合していることを示す
    –

      実行すればただちに示される
        ●


    デバッグ(バグ探し)ではない
●
機能テストについて
    機能テストがあってのユニットテスト
●



        ダブルチェック
    –

    テストビューからコントローラとモデルへのテストを
●


    自動化するのが基本
    UIのテストやDBMSまで結合したテストはコストが高
●


    いので、すべてをやろうとせず(単体テストや機能テ
    ストで補間して)、観点を絞って行うとよいのでは
テスト駆動開発が合う開発
           合わない開発
    探索的な開発とは相性が良くない?
●



        割り切って、後からテストを書く
    –

        あるいは、後からテスト駆動で書き直す
    –

    制約を課すことで洞察を得るのが、手法として
●


    の目的
        アジャイル/リーン(トヨタ式)に共通する特徴
    –
プログラミングと洞察
当時の一般的手法は、とりあえずプログラムを書いてから
問題ないことを検証するというものであった。ダイクスト
ラはこれに対して、検証に時間がかかって面倒であるし、
プログラムの開発手法に何ら洞察を与えない点が問題であ
るとした。
         エドガー・ダイクストラ - Wikipedia


テスト駆動開発は、プログラミング中の決定とフィード
バックとのギャップの認識、およびそのギャップを制御す
る技術である。
        「テスト駆動開発入門」ケント・ベック
参考文献
    XPエクストリーム・プログラミング入門 第二
●


    版
    テスト駆動開発入門
●



        ケント・ベック著+長瀬嘉秀訳...かなり厳しいです
    –
        が、原典なので。よく読むと、すべて書いてありま
        す。
    xUnit Test Patterns - Gerard Meszaros
●



        テスト駆動開発の考え方とパターンを網羅した決定
    –
        版。900ページ位ある。翻訳中との噂。
「テスト駆動開発は、コードに思い入れのある
変わり者にも適している」
   「テスト駆動開発入門」ケント・ベック
付録: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
付録:C言語ユニットテストセット例2/3
main関数。テストスイートランナー。

/* main.c */
#include quot;unit_test.hquot;

size_t unit_test_count = 0;

int
main()
{
    RUN_SUITE(foo_test);
    /* and more */

    printf(quot;OK (%d tests)nquot;, unit_test_count);
    return 0;
}
付録:C言語ユニットテストセット例3/3
テストソースファイル。スイートとテストケース。

/* foo_test.c */
#include <assert.h>
#include quot;unit_test.hquot;

void
test_foo_hoge(void) // テストケース
{
   assert(1 + 1 == 2); //パスすること前提なのでassertで十分
}

void
foo_test(void) // テストスイート
{
   RUN_TEST(test_foo_hoge);
   /* and more */
}

More Related Content

What's hot

【12-E-2】 SEC流品質作りこみESQR 組込みソフトウェア開発向け品質作り込みガイドの紹介
【12-E-2】 SEC流品質作りこみESQR 組込みソフトウェア開発向け品質作り込みガイドの紹介【12-E-2】 SEC流品質作りこみESQR 組込みソフトウェア開発向け品質作り込みガイドの紹介
【12-E-2】 SEC流品質作りこみESQR 組込みソフトウェア開発向け品質作り込みガイドの紹介devsumi2009
 
Kotatsu-Model in Openthology
Kotatsu-Model in OpenthologyKotatsu-Model in Openthology
Kotatsu-Model in OpenthologyKent Ishizawa
 
【12-A-5】 ユーザー企業責任で25サイトをアジャイルに開発
【12-A-5】 ユーザー企業責任で25サイトをアジャイルに開発【12-A-5】 ユーザー企業責任で25サイトをアジャイルに開発
【12-A-5】 ユーザー企業責任で25サイトをアジャイルに開発devsumi2009
 
ルーティングを使って シンプルなアプリケーション開発を
ルーティングを使ってシンプルなアプリケーション開発をルーティングを使ってシンプルなアプリケーション開発を
ルーティングを使って シンプルなアプリケーション開発をKousuke Ebihara
 
【12-E-4】 『脱Excel』を実現!統合プロジェクト管理パッケージ『SI Object Browser PM』を利用してIT企業も近代化しよう~PM...
【12-E-4】 『脱Excel』を実現!統合プロジェクト管理パッケージ『SI Object Browser PM』を利用してIT企業も近代化しよう~PM...【12-E-4】 『脱Excel』を実現!統合プロジェクト管理パッケージ『SI Object Browser PM』を利用してIT企業も近代化しよう~PM...
【12-E-4】 『脱Excel』を実現!統合プロジェクト管理パッケージ『SI Object Browser PM』を利用してIT企業も近代化しよう~PM...devsumi2009
 
2009年4月8日セミナー 4.レコメンデーション Q&A
2009年4月8日セミナー 4.レコメンデーション Q&A2009年4月8日セミナー 4.レコメンデーション Q&A
2009年4月8日セミナー 4.レコメンデーション Q&APreferred Networks
 
0423mitsubishi
0423mitsubishi0423mitsubishi
0423mitsubishiloftwork
 
2009年4月8日セミナー 2.Sedue新機能
2009年4月8日セミナー 2.Sedue新機能2009年4月8日セミナー 2.Sedue新機能
2009年4月8日セミナー 2.Sedue新機能Preferred Networks
 
私がチャレンジしたSBMデータマイニング
私がチャレンジしたSBMデータマイニング私がチャレンジしたSBMデータマイニング
私がチャレンジしたSBMデータマイニングHiroshi Ono
 
Newb CMS eco Business Solution
Newb CMS eco Business SolutionNewb CMS eco Business Solution
Newb CMS eco Business SolutionKanji Syuto
 
【Web2.0 Expo】リクルートWebサービス
【Web2.0 Expo】リクルートWebサービス【Web2.0 Expo】リクルートWebサービス
【Web2.0 Expo】リクルートWebサービスguesta74682
 
2009年4月8日セミナー 1.オープニング
2009年4月8日セミナー 1.オープニング2009年4月8日セミナー 1.オープニング
2009年4月8日セミナー 1.オープニングPreferred Networks
 
Jaws2008 Presen12
Jaws2008 Presen12Jaws2008 Presen12
Jaws2008 Presen12umekoumeda
 
Loftwork 20090416
Loftwork 20090416Loftwork 20090416
Loftwork 20090416武 河野
 
2009年4月8日セミナー 3.SSD向け全文検索エンジン
2009年4月8日セミナー 3.SSD向け全文検索エンジン2009年4月8日セミナー 3.SSD向け全文検索エンジン
2009年4月8日セミナー 3.SSD向け全文検索エンジンPreferred Networks
 
Re-Introduction to Openthology
Re-Introduction to OpenthologyRe-Introduction to Openthology
Re-Introduction to OpenthologyKent Ishizawa
 

What's hot (19)

【12-E-2】 SEC流品質作りこみESQR 組込みソフトウェア開発向け品質作り込みガイドの紹介
【12-E-2】 SEC流品質作りこみESQR 組込みソフトウェア開発向け品質作り込みガイドの紹介【12-E-2】 SEC流品質作りこみESQR 組込みソフトウェア開発向け品質作り込みガイドの紹介
【12-E-2】 SEC流品質作りこみESQR 組込みソフトウェア開発向け品質作り込みガイドの紹介
 
Kotatsu-Model in Openthology
Kotatsu-Model in OpenthologyKotatsu-Model in Openthology
Kotatsu-Model in Openthology
 
【12-A-5】 ユーザー企業責任で25サイトをアジャイルに開発
【12-A-5】 ユーザー企業責任で25サイトをアジャイルに開発【12-A-5】 ユーザー企業責任で25サイトをアジャイルに開発
【12-A-5】 ユーザー企業責任で25サイトをアジャイルに開発
 
ルーティングを使って シンプルなアプリケーション開発を
ルーティングを使ってシンプルなアプリケーション開発をルーティングを使ってシンプルなアプリケーション開発を
ルーティングを使って シンプルなアプリケーション開発を
 
【12-E-4】 『脱Excel』を実現!統合プロジェクト管理パッケージ『SI Object Browser PM』を利用してIT企業も近代化しよう~PM...
【12-E-4】 『脱Excel』を実現!統合プロジェクト管理パッケージ『SI Object Browser PM』を利用してIT企業も近代化しよう~PM...【12-E-4】 『脱Excel』を実現!統合プロジェクト管理パッケージ『SI Object Browser PM』を利用してIT企業も近代化しよう~PM...
【12-E-4】 『脱Excel』を実現!統合プロジェクト管理パッケージ『SI Object Browser PM』を利用してIT企業も近代化しよう~PM...
 
2009年4月8日セミナー 4.レコメンデーション Q&A
2009年4月8日セミナー 4.レコメンデーション Q&A2009年4月8日セミナー 4.レコメンデーション Q&A
2009年4月8日セミナー 4.レコメンデーション Q&A
 
0423mitsubishi
0423mitsubishi0423mitsubishi
0423mitsubishi
 
2009年4月8日セミナー 2.Sedue新機能
2009年4月8日セミナー 2.Sedue新機能2009年4月8日セミナー 2.Sedue新機能
2009年4月8日セミナー 2.Sedue新機能
 
私がチャレンジしたSBMデータマイニング
私がチャレンジしたSBMデータマイニング私がチャレンジしたSBMデータマイニング
私がチャレンジしたSBMデータマイニング
 
Newb CMS eco Business Solution
Newb CMS eco Business SolutionNewb CMS eco Business Solution
Newb CMS eco Business Solution
 
【Web2.0 Expo】リクルートWebサービス
【Web2.0 Expo】リクルートWebサービス【Web2.0 Expo】リクルートWebサービス
【Web2.0 Expo】リクルートWebサービス
 
2009年4月8日セミナー 1.オープニング
2009年4月8日セミナー 1.オープニング2009年4月8日セミナー 1.オープニング
2009年4月8日セミナー 1.オープニング
 
Jaws2008 Presen12
Jaws2008 Presen12Jaws2008 Presen12
Jaws2008 Presen12
 
Loftwork 20090416
Loftwork 20090416Loftwork 20090416
Loftwork 20090416
 
2009年4月8日セミナー 3.SSD向け全文検索エンジン
2009年4月8日セミナー 3.SSD向け全文検索エンジン2009年4月8日セミナー 3.SSD向け全文検索エンジン
2009年4月8日セミナー 3.SSD向け全文検索エンジン
 
Re-Introduction to Openthology
Re-Introduction to OpenthologyRe-Introduction to Openthology
Re-Introduction to Openthology
 
4 22blog
4 22blog4 22blog
4 22blog
 
PFI会社案内
PFI会社案内PFI会社案内
PFI会社案内
 
4 15 Guidance
4 15 Guidance4 15 Guidance
4 15 Guidance
 

More from hiroyuki Yamamoto

名古屋アジャイル勉強会「モチベーションはどこからくるの?」
名古屋アジャイル勉強会「モチベーションはどこからくるの?」名古屋アジャイル勉強会「モチベーションはどこからくるの?」
名古屋アジャイル勉強会「モチベーションはどこからくるの?」hiroyuki Yamamoto
 
名古屋アジャイル勉強会「XPから学ぶアジャイル」
名古屋アジャイル勉強会「XPから学ぶアジャイル」名古屋アジャイル勉強会「XPから学ぶアジャイル」
名古屋アジャイル勉強会「XPから学ぶアジャイル」hiroyuki Yamamoto
 
アジャイルの本質 - Agile Japan 2019サテライト名古屋
アジャイルの本質 - Agile Japan 2019サテライト名古屋アジャイルの本質 - Agile Japan 2019サテライト名古屋
アジャイルの本質 - Agile Japan 2019サテライト名古屋hiroyuki Yamamoto
 
名古屋アジャイル勉強会「ストレスに負けないアジャイルマインドの育み方」
名古屋アジャイル勉強会「ストレスに負けないアジャイルマインドの育み方」名古屋アジャイル勉強会「ストレスに負けないアジャイルマインドの育み方」
名古屋アジャイル勉強会「ストレスに負けないアジャイルマインドの育み方」hiroyuki Yamamoto
 
チームビルディング~本物のチームを作る方法~
チームビルディング~本物のチームを作る方法~チームビルディング~本物のチームを作る方法~
チームビルディング~本物のチームを作る方法~hiroyuki Yamamoto
 
名古屋アジャイル勉強会「仮説思考に学ぶ最速アジャイル仕事術」
名古屋アジャイル勉強会「仮説思考に学ぶ最速アジャイル仕事術」名古屋アジャイル勉強会「仮説思考に学ぶ最速アジャイル仕事術」
名古屋アジャイル勉強会「仮説思考に学ぶ最速アジャイル仕事術」hiroyuki Yamamoto
 
名古屋アジャイル勉強会「チームの認識合わせはビジュアルに~マインドマップとアジャイル~」
名古屋アジャイル勉強会「チームの認識合わせはビジュアルに~マインドマップとアジャイル~」名古屋アジャイル勉強会「チームの認識合わせはビジュアルに~マインドマップとアジャイル~」
名古屋アジャイル勉強会「チームの認識合わせはビジュアルに~マインドマップとアジャイル~」hiroyuki Yamamoto
 
「名古屋アジャイル勉強会」ムダとアジャイル
「名古屋アジャイル勉強会」ムダとアジャイル「名古屋アジャイル勉強会」ムダとアジャイル
「名古屋アジャイル勉強会」ムダとアジャイルhiroyuki Yamamoto
 
「名古屋アジャイル勉強会」アナログツールで高めるパフォーマンス、実践チーム仕事術
「名古屋アジャイル勉強会」アナログツールで高めるパフォーマンス、実践チーム仕事術「名古屋アジャイル勉強会」アナログツールで高めるパフォーマンス、実践チーム仕事術
「名古屋アジャイル勉強会」アナログツールで高めるパフォーマンス、実践チーム仕事術hiroyuki Yamamoto
 
【名古屋アジャイル勉強会】コミュニケーション上手になろう~論理的思考とアサーティブネス事始め~
【名古屋アジャイル勉強会】コミュニケーション上手になろう~論理的思考とアサーティブネス事始め~【名古屋アジャイル勉強会】コミュニケーション上手になろう~論理的思考とアサーティブネス事始め~
【名古屋アジャイル勉強会】コミュニケーション上手になろう~論理的思考とアサーティブネス事始め~hiroyuki Yamamoto
 
名古屋アジャイル勉強会「傾聴とルーチンでチームを導くアジャイルリーダーシップ」
名古屋アジャイル勉強会「傾聴とルーチンでチームを導くアジャイルリーダーシップ」名古屋アジャイル勉強会「傾聴とルーチンでチームを導くアジャイルリーダーシップ」
名古屋アジャイル勉強会「傾聴とルーチンでチームを導くアジャイルリーダーシップ」hiroyuki Yamamoto
 
名古屋アジャイル勉強会「働き方改革とアジャイル開発」
名古屋アジャイル勉強会「働き方改革とアジャイル開発」名古屋アジャイル勉強会「働き方改革とアジャイル開発」
名古屋アジャイル勉強会「働き方改革とアジャイル開発」hiroyuki Yamamoto
 
名古屋アジャイル勉強会「自分を知ることからはじめる、よりよいコミュニケーション」
名古屋アジャイル勉強会「自分を知ることからはじめる、よりよいコミュニケーション」 名古屋アジャイル勉強会「自分を知ることからはじめる、よりよいコミュニケーション」
名古屋アジャイル勉強会「自分を知ることからはじめる、よりよいコミュニケーション」 hiroyuki Yamamoto
 
名古屋アジャイル勉強会「春のアジャイル入門」
名古屋アジャイル勉強会「春のアジャイル入門」名古屋アジャイル勉強会「春のアジャイル入門」
名古屋アジャイル勉強会「春のアジャイル入門」hiroyuki Yamamoto
 
名古屋アジャイル勉強会「コンピテンシーを活用した人財育成」
名古屋アジャイル勉強会「コンピテンシーを活用した人財育成」名古屋アジャイル勉強会「コンピテンシーを活用した人財育成」
名古屋アジャイル勉強会「コンピテンシーを活用した人財育成」hiroyuki Yamamoto
 
第88回名古屋アジャイル勉強会「ウォーターフォール×アジャイル」
第88回名古屋アジャイル勉強会「ウォーターフォール×アジャイル」第88回名古屋アジャイル勉強会「ウォーターフォール×アジャイル」
第88回名古屋アジャイル勉強会「ウォーターフォール×アジャイル」hiroyuki Yamamoto
 
第85回名古屋アジャイル勉強会「ふりかえりでアジャイルなチームを育てる」
第85回名古屋アジャイル勉強会「ふりかえりでアジャイルなチームを育てる」第85回名古屋アジャイル勉強会「ふりかえりでアジャイルなチームを育てる」
第85回名古屋アジャイル勉強会「ふりかえりでアジャイルなチームを育てる」hiroyuki Yamamoto
 
第83回名古屋アジャイル勉強会「一言で言うと、アジャイルってなんなの?」
第83回名古屋アジャイル勉強会「一言で言うと、アジャイルってなんなの?」第83回名古屋アジャイル勉強会「一言で言うと、アジャイルってなんなの?」
第83回名古屋アジャイル勉強会「一言で言うと、アジャイルってなんなの?」hiroyuki Yamamoto
 
第80回名古屋アジャイル勉強会「スッキリ!問題解決でプロジェクトを進めよう」
第80回名古屋アジャイル勉強会「スッキリ!問題解決でプロジェクトを進めよう」第80回名古屋アジャイル勉強会「スッキリ!問題解決でプロジェクトを進めよう」
第80回名古屋アジャイル勉強会「スッキリ!問題解決でプロジェクトを進めよう」hiroyuki Yamamoto
 
第76回名古屋アジャイル勉強会「半分の時間で二倍の成果を出す仕事術!」
第76回名古屋アジャイル勉強会「半分の時間で二倍の成果を出す仕事術!」第76回名古屋アジャイル勉強会「半分の時間で二倍の成果を出す仕事術!」
第76回名古屋アジャイル勉強会「半分の時間で二倍の成果を出す仕事術!」hiroyuki Yamamoto
 

More from hiroyuki Yamamoto (20)

名古屋アジャイル勉強会「モチベーションはどこからくるの?」
名古屋アジャイル勉強会「モチベーションはどこからくるの?」名古屋アジャイル勉強会「モチベーションはどこからくるの?」
名古屋アジャイル勉強会「モチベーションはどこからくるの?」
 
名古屋アジャイル勉強会「XPから学ぶアジャイル」
名古屋アジャイル勉強会「XPから学ぶアジャイル」名古屋アジャイル勉強会「XPから学ぶアジャイル」
名古屋アジャイル勉強会「XPから学ぶアジャイル」
 
アジャイルの本質 - Agile Japan 2019サテライト名古屋
アジャイルの本質 - Agile Japan 2019サテライト名古屋アジャイルの本質 - Agile Japan 2019サテライト名古屋
アジャイルの本質 - Agile Japan 2019サテライト名古屋
 
名古屋アジャイル勉強会「ストレスに負けないアジャイルマインドの育み方」
名古屋アジャイル勉強会「ストレスに負けないアジャイルマインドの育み方」名古屋アジャイル勉強会「ストレスに負けないアジャイルマインドの育み方」
名古屋アジャイル勉強会「ストレスに負けないアジャイルマインドの育み方」
 
チームビルディング~本物のチームを作る方法~
チームビルディング~本物のチームを作る方法~チームビルディング~本物のチームを作る方法~
チームビルディング~本物のチームを作る方法~
 
名古屋アジャイル勉強会「仮説思考に学ぶ最速アジャイル仕事術」
名古屋アジャイル勉強会「仮説思考に学ぶ最速アジャイル仕事術」名古屋アジャイル勉強会「仮説思考に学ぶ最速アジャイル仕事術」
名古屋アジャイル勉強会「仮説思考に学ぶ最速アジャイル仕事術」
 
名古屋アジャイル勉強会「チームの認識合わせはビジュアルに~マインドマップとアジャイル~」
名古屋アジャイル勉強会「チームの認識合わせはビジュアルに~マインドマップとアジャイル~」名古屋アジャイル勉強会「チームの認識合わせはビジュアルに~マインドマップとアジャイル~」
名古屋アジャイル勉強会「チームの認識合わせはビジュアルに~マインドマップとアジャイル~」
 
「名古屋アジャイル勉強会」ムダとアジャイル
「名古屋アジャイル勉強会」ムダとアジャイル「名古屋アジャイル勉強会」ムダとアジャイル
「名古屋アジャイル勉強会」ムダとアジャイル
 
「名古屋アジャイル勉強会」アナログツールで高めるパフォーマンス、実践チーム仕事術
「名古屋アジャイル勉強会」アナログツールで高めるパフォーマンス、実践チーム仕事術「名古屋アジャイル勉強会」アナログツールで高めるパフォーマンス、実践チーム仕事術
「名古屋アジャイル勉強会」アナログツールで高めるパフォーマンス、実践チーム仕事術
 
【名古屋アジャイル勉強会】コミュニケーション上手になろう~論理的思考とアサーティブネス事始め~
【名古屋アジャイル勉強会】コミュニケーション上手になろう~論理的思考とアサーティブネス事始め~【名古屋アジャイル勉強会】コミュニケーション上手になろう~論理的思考とアサーティブネス事始め~
【名古屋アジャイル勉強会】コミュニケーション上手になろう~論理的思考とアサーティブネス事始め~
 
名古屋アジャイル勉強会「傾聴とルーチンでチームを導くアジャイルリーダーシップ」
名古屋アジャイル勉強会「傾聴とルーチンでチームを導くアジャイルリーダーシップ」名古屋アジャイル勉強会「傾聴とルーチンでチームを導くアジャイルリーダーシップ」
名古屋アジャイル勉強会「傾聴とルーチンでチームを導くアジャイルリーダーシップ」
 
名古屋アジャイル勉強会「働き方改革とアジャイル開発」
名古屋アジャイル勉強会「働き方改革とアジャイル開発」名古屋アジャイル勉強会「働き方改革とアジャイル開発」
名古屋アジャイル勉強会「働き方改革とアジャイル開発」
 
名古屋アジャイル勉強会「自分を知ることからはじめる、よりよいコミュニケーション」
名古屋アジャイル勉強会「自分を知ることからはじめる、よりよいコミュニケーション」 名古屋アジャイル勉強会「自分を知ることからはじめる、よりよいコミュニケーション」
名古屋アジャイル勉強会「自分を知ることからはじめる、よりよいコミュニケーション」
 
名古屋アジャイル勉強会「春のアジャイル入門」
名古屋アジャイル勉強会「春のアジャイル入門」名古屋アジャイル勉強会「春のアジャイル入門」
名古屋アジャイル勉強会「春のアジャイル入門」
 
名古屋アジャイル勉強会「コンピテンシーを活用した人財育成」
名古屋アジャイル勉強会「コンピテンシーを活用した人財育成」名古屋アジャイル勉強会「コンピテンシーを活用した人財育成」
名古屋アジャイル勉強会「コンピテンシーを活用した人財育成」
 
第88回名古屋アジャイル勉強会「ウォーターフォール×アジャイル」
第88回名古屋アジャイル勉強会「ウォーターフォール×アジャイル」第88回名古屋アジャイル勉強会「ウォーターフォール×アジャイル」
第88回名古屋アジャイル勉強会「ウォーターフォール×アジャイル」
 
第85回名古屋アジャイル勉強会「ふりかえりでアジャイルなチームを育てる」
第85回名古屋アジャイル勉強会「ふりかえりでアジャイルなチームを育てる」第85回名古屋アジャイル勉強会「ふりかえりでアジャイルなチームを育てる」
第85回名古屋アジャイル勉強会「ふりかえりでアジャイルなチームを育てる」
 
第83回名古屋アジャイル勉強会「一言で言うと、アジャイルってなんなの?」
第83回名古屋アジャイル勉強会「一言で言うと、アジャイルってなんなの?」第83回名古屋アジャイル勉強会「一言で言うと、アジャイルってなんなの?」
第83回名古屋アジャイル勉強会「一言で言うと、アジャイルってなんなの?」
 
第80回名古屋アジャイル勉強会「スッキリ!問題解決でプロジェクトを進めよう」
第80回名古屋アジャイル勉強会「スッキリ!問題解決でプロジェクトを進めよう」第80回名古屋アジャイル勉強会「スッキリ!問題解決でプロジェクトを進めよう」
第80回名古屋アジャイル勉強会「スッキリ!問題解決でプロジェクトを進めよう」
 
第76回名古屋アジャイル勉強会「半分の時間で二倍の成果を出す仕事術!」
第76回名古屋アジャイル勉強会「半分の時間で二倍の成果を出す仕事術!」第76回名古屋アジャイル勉強会「半分の時間で二倍の成果を出す仕事術!」
第76回名古屋アジャイル勉強会「半分の時間で二倍の成果を出す仕事術!」
 

テスト駆動開発のエッセンス

  • 1. テスト駆動開発のエッセンス 自動テストセットは欲しいけれど テストファーストが嫌いな人のための 2009-03-22 山本 博之@名古屋アジャイル勉強会
  • 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. テスト駆動開発が合う開発 合わない開発 探索的な開発とは相性が良くない? ● 割り切って、後からテストを書く – あるいは、後からテスト駆動で書き直す – 制約を課すことで洞察を得るのが、手法として ● の目的 アジャイル/リーン(トヨタ式)に共通する特徴 –
  • 22. プログラミングと洞察 当時の一般的手法は、とりあえずプログラムを書いてから 問題ないことを検証するというものであった。ダイクスト ラはこれに対して、検証に時間がかかって面倒であるし、 プログラムの開発手法に何ら洞察を与えない点が問題であ るとした。 エドガー・ダイクストラ - Wikipedia テスト駆動開発は、プログラミング中の決定とフィード バックとのギャップの認識、およびそのギャップを制御す る技術である。 「テスト駆動開発入門」ケント・ベック
  • 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
  • 26. 付録:C言語ユニットテストセット例2/3 main関数。テストスイートランナー。 /* main.c */ #include quot;unit_test.hquot; size_t unit_test_count = 0; int main() { RUN_SUITE(foo_test); /* and more */ printf(quot;OK (%d tests)nquot;, unit_test_count); return 0; }
  • 27. 付録:C言語ユニットテストセット例3/3 テストソースファイル。スイートとテストケース。 /* foo_test.c */ #include <assert.h> #include quot;unit_test.hquot; void test_foo_hoge(void) // テストケース { assert(1 + 1 == 2); //パスすること前提なのでassertで十分 } void foo_test(void) // テストスイート { RUN_TEST(test_foo_hoge); /* and more */ }