Index: [Article Count Order] [Thread]

Date:  Thu, 06 Mar 2003 11:05:10 +0900
From:  安井 <yasui@....jp>
Subject:  [XP-jp:04171] Re: 幻覚剤としてのテストファースト
To:  extremeprogramming-jp@....jp
Message-Id:  <3E66ACD6.5010402@....jp>
In-Reply-To:  <9CC2E2A45A8A2Eomura@....jp>
References:  <3E642F93.8000801@....jp> <9CC2E2A45A8A2Eomura@....jp>
X-Mail-Count: 04171

安井@Aspacです。

Shin wrote:
> Tue, 04 Mar 2003 13:46:11 +0900
> 安井 <yasui@....jp> さんのメールから
> |Shin wrote:
> | たとえば、ATMの手数料を計算するときに「すべての日時に対し
> |て計算する」というものを、「曜日と時間帯に対して計算する」よ
> |うに具体的に落としていく方向で考えています。そしてテストでは、
> |  ・平日(たとえば月曜)、土曜、日曜
> |  ・料金の変わる時刻の前後
> |の組み合わせだけについて記述します。
> 
> 
> 私のいいたかったことは、この例だと、問題を考えているときは
> 「平日」というわれわれにはわかりやすい概念を使っているのに
> テストを書くために、わざわざ「2003年3月3日」などという特定
> の日付を使っているということです。
> 数字の上からは、平日は無限に存在しますよね。

 たとえば、
 ・日付から曜日を導く
 ・曜日から、平日か土曜か日祝日かを導く
 ・平日/土曜/日祝日から、手数料を導く
というふうに分解してそれぞれをテストしても、最終的には「無限
の日付から曜日を導くテスト」は必要で、そこを特定の日付だけで
書くのは

Shin wrote:
> それを、実行可能なテストにするために、そういう無限の世界から、
> 有限の世界におりてきて、特定の値のテストを書く。そういう
> ことをしているのだと思います。

ということでしょうか。

 品質のためのテスト、という意味では、個人的には「それで十
分」と感じるのですが、おおむらさんのおっしゃることも理解でき
る気がします。

 仕様を記述すれば、それに基づいて自動的にテストができる。じ
つはそういうツールを作れないかと考えているところです。もとも
とは、受け入れテストを顧客役の人間が書くという要望から考え始
めました。テストケースのわかりやすさ・書きやすさを考えている
ので、おおむらさんの意図とは方向が違うと思いますが。

 人間が記述する内容が「平日の9時から5時の間は手数料が¥0」
で済む。まあ、仕様を解析して、最終的なテストのロジックは特定
の値でやるしかありませんが。

 じゃあ現実にツールでどこまでやれるのか?と考えると、とても
難しいわけですが (^^;  たとえば、画面の入力チェックの仕様を
「引き落とし金額は正の整数で500,000以下」と書くだけで自動テ
ストしてくれる、というあたりが当面のスコープです。

> | また、XP(というかTDD)では、インターフェイスやクラスの構成
> |もテストドリブンで作っていけると思います(自分ではそうしてい
> |るつもりです)。
> 
> それは、単にテストファーストだけでなく、リファクタリングも
> 含めた、より大きなスケールでのプロセスにおいて、の話のように
> 思いますが、違うでしょうか?
> 
> インターフェイスやクラスの定義は、テストを書く前に決めて
> いないとテストが書けないので
> テストファーストだけでは、設計をすすめることはできないと思う
> のですが、テストドリブンだと、できるのでしょうか。

 「テストファースト(テストドリブン)のコーディングでは、リ
ファクタリングは必須」です。リファクタリングにはクラス定義な
どを決めることも含みます。

 リファクタリングをしないテストファーストもありますね。先に
クラス設計などをしてからそのとおりに実装する。この場合は「テ
ストファーストで設計を進める」ことにはなりません。これを「テ
ストドリブン」と呼ぶのはおかしいと感じますが。

# テストファーストとテストドリブンって同義語?

-- 
アジアパシフィックシステム総研 ソリューション3部   安井 力
         http://www.asia.co.jp/            yasui@....jp
                            03-3985-3886 / FAX:03-3985-3778