Index: [Article Count Order] [Thread]

Date:  Thu, 27 Apr 2000 22:53:54 +0900
From:  Kaoru Hosokawa <khosokawa@....com>
Subject:  [XP-jp:00308] テストはシンプルに  Was:Re: JUnit  利用方法
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <B52E5B83.1224%khosokawa@....com>
In-Reply-To:  <00Apr26.130159jst.115201@....jp>
Posted:  Thu, 27 Apr 2000 22:53:24 +0900
X-Mail-Count: 00308

ホソカワです。

矢崎さん、説明ありがとうございます。

on 2000/04/26 1:00 PM, firo at firo@....jp wrote:

> 矢崎です。
> 
> Kaoru Hosokawaさん wrote:
> 

>>> 
>>> public void testXXX(){
>>> 
>>> int wkInt;
>>> String unitName;
>>> 
>>> aTestTarget.setNumber(0);
>>> aTestTarget.setNumber(1000);
>>> wkInt = aTestTarget.getNumber();
>>> assertEquals(wkInt,1000);
>>> 
>>> aTestTarget.setName("TARO");
>>> assertEquals("TARO",aTestTarget.getName());
>>> 
>>> }
>>> 
>>> 
>> 
>> テストもシンプルにするべきですから、numberのテストとnameのテストを別々にする
>> のでしょうね。なぜ、ここでこだわっているのかというと、テストメソッドにコメン
>> トはつけないのかな?と思っただけです。コメントがあれば、中身を読まなくてすむ
>> のですが、コメントを付ける暇があるのならrefactoringするのでしょうね。
> 
> はい、上記の例でいえば、別々にすべきだと思います。
> ただ、1つのテスト・メソッド(testXXXなど)にassertXXX()が
> 1つしかないべき、ということではありません。(と私は思います)
> 
> 例えば、
> 
> aTestTarget.setNumber(5);
> assertEquals(wkInt,5);
> aTestTarget.setNumber(1000);
> assertEquals(wkInt,1000);
> 
> のようなテストは、既に値が入っている、Number属性
> に対して、setNumberが正しく値を書き換えたかをテスト
> する流れとしては妥当だと思います。
> (もともと5が最初に正しくセットされていなければ、
> 正しく1000で書きかえられたとは言えないので)

テストの効率(実行時間)を考えると、上記の方法がいいように思います。でも、実
際に test メソッドが失敗した時、(二つ assert があるので)どの assert で失敗
したか探す必要があります。私は、test メソッドは一つの事を試す方がいいと思い
ます。上記の例は、2つの test メソッドに分けた方がいいと思います。以下が私の
分け方です。

public void testSetNumberOnce() {
    // ...
    
    aTestTarget.setNumber(5);
    wkInt = aTestTarget.getNumber();
    assertEquals(wkInt, 5);
}

public void testSetNumberTwice() {
    // ...
    
    aTestTarget.setNumber(5);
    aTestTarget.setNumber(1000);
    wkInt = aTestTarget.getNumber();
    assertEquals(wkInt, 1000);
}

testSetNumberOnce() で、setNumber() が正しく値をセットすることが確認できます。
testSetNumberTwice() では、setNumber() が正しく値を書き換えるかどうかが確認
できます。 testSetNumberOnce() が、成功した場合、testSetNumberTwice() の
setNumber(5) の後に、assert は必要ないと思います。

その時のテストによると思いますが、私は「一つのテストメソッドに一つの assert」
ではないかと思います。

-- 
Kaoru Hosokawa
khosokawa@....com