ホソカワです。
矢崎さん、説明ありがとうございます。
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