Index: [Article Count Order] [Thread]

Date:  Wed, 26 Apr 2000 13:00:48 +0900
From:  firo <firo@....jp>
Subject:  [XP-jp:00263] Re: JUnit 利用方法
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <00Apr26.130159jst.115201@....jp>
References:  <B52BD0C8.1178%khosokawa@....com>
Posted:  Wed, 26 Apr 2000 13:01:59 +0900
X-Mail-Count: 00263

矢崎です。

Kaoru Hosokawaさん wrote:


> > ◇以下のクラスのテストを行うとする。(TestTarget.java)
> >
> > public class TestTarget {
> >
> > int number;
> > String name;
> >
> > public TestTarget(){
> > name = "";
> > }
> >
> > public void setNumber(int number){
> > this.number = number;
> > }
> >
> > public int getNumber(){
> > return this.number;
> > }
> >
> > public void setName(String name){
> > this.name = name;
> > }
> >
> > public String getName(){
> > return this.name;
> > }
> > }
> >
> >
>
> 例えば、Employee見たいな名前と社員番号を持っているクラスですね。
>

上記サンプルは、そんな感じです。もちろん、JUnitは、そんな感じで
はないクラスのテストもできます。

>
>
> > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> > 3.必要ならばsetUpメソッドをオーバライドする。原則的に
> >  はオーバライドすることになるでしょう。何をするかというと、
> >  ユニットテストをする対象のオブジェクトをnewする。
> >  newしたオブジェクトを入れておくためのインスタンス変数
> >  も定義する。
> >
> > import junit.framework.*;
> >
> > public class ConcreteTestCase extends TestCase{
> >
> > /*以下の変数は任意。型はテストしたいクラス。数も自由*/
> > TestTarget aTestTarget;                  //3
> >
> > public ConcreteTestCase(String name){
> > super(name);
> > }
> >
> > /*setUpはリターンはvoid。引数はなしじゃないとだめ。*/
> > public void setUp(){                     //3
> > aTestTarget = new TestTarget();   //3
> > }                                        //3
> >
> > }
> >
>
> 例えば、setUp()でファイルをオープンしようとして、エラーになった場合、例外で
> 戻るのでしょうか?どこへ戻るのでしょうか?

これは、ちょっと調べる時間ください。申し訳ありません。

>
> > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> > 6.各Testメソッドの中身は以下のように作る。
> >
> >  1)テストのTargetのオブジェクトの、テストしたいメソッドを
> >   呼び出す。
> >  2)そのメソッドのリターン値か、あるいはそのメソッドの結果
> >   を取得できる別のメソッドを実行し、結果を取得する。
> >  3)その結果を判断するassert関連メソッドを呼び出す。
> > ※assert関連メソッドは14種類ある。
> >    ※14種類のassert関連メソッドで対応できない場合は、
> >     独自のassert関連メソッドを作らなければならない。
> >
>
> assertメソッドをリストしていただけますか?
>

ちょっと見ずらい&長くなりますが、以下に列記します。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1.static public void assert(String message, boolean condition)
 message テストが通らなかったときに表示したいメッセージ
 condition trueかfalse
 判定方法 conditionがtrueならテストOK。falseならテストNG。

2.static public void assert(boolean condition)
 condition trueかfalse
 判定方法 conditionがtrueならテストOK。falseならテストNG。

3.static public void assertEquals(String message, double expected, double
actual, double delta)
 message テストが通らなかったときに表示したいメッセージ
 expected 比較したい一方の数
 actual 比較したいもう一方の数
 delta 期待される差(0ならexpectedとdeltaが等しいということ)
 判定方法 expectedとactual の差がdeltaと等しければテストOK。それ以外はテストNG。


4.static public void assertEquals(double expected, double actual, double delta)
 expected 比較したい一方の数
 actual 比較したいもう一方の数
 delta 期待される差(0ならexpectedとdeltaが等しいということ)
 判定方法 expectedとactual の差がdeltaと等しければテストOK。それ以外はテストNG。


5.static public void assertEquals(String message, long expected, long actual)
 message テストが通らなかったときに表示したいメッセージ
 expected 比較したい一方の数
 actual 比較したいもう一方の数
 判定方法 expectedとactualが等しければテストOK。それ以外はテストNG。

6.static public void assertEquals(long expected, long actual)
 expected 比較したい一方の数
 actual 比較したいもう一方の数
 判定方法 expectedとactualが等しければテストOK。それ以外はテストNG。

7.static public void assertEquals(String message, Object expected, Object
actual)
 message テストが通らなかったときに表示したいメッセージ
 expected 比較したい一方のオブジェクト
 actual 比較したいもう一方のオブジェクト
 判定方法 expectedとactualが両方ともnullならテストOK。
  expectedでnullでなく、かつ、actual.equals(expected)が真ならテストOK。
    ※つまり、Stringオブジェクトとしては別インスタンスでも文字列が
      が同じものをもっているものどうしならテストOKなど。
  上記以外はテストNG。

8.static public void assertEquals(Object expected, Object actual)
 expected 比較したい一方のオブジェクト
 actual 比較したいもう一方のオブジェクト
 判定方法 expectedとactualが両方ともnullならテストOK。
  expectedでnullでなく、かつ、actual.equals(expected)が真ならテストOK。
    ※つまり、Stringオブジェクトとしては別インスタンスでも文字列が
      が同じものをもっているものどうしならテストOKなど。
  上記以外はテストNG。

9.static public void assertNotNull(String message, Object object)
 message テストが通らなかったときに表示したいメッセージ
 object Nullかどうかを判定したいオブジェクト変数
 判定方法 objectがnullでなければテストOK。nullならテストNG。

10.static public void assertNotNull(Object object)
 object Nullかどうかを判定したいオブジェクト変数
 判定方法 objectがnullでなければテストOK。nullならテストNG。


11.static public void assertNull(String message, Object object)
 message テストが通らなかったときに表示したいメッセージ
 object Nullかどうかを判定したいオブジェクト変数
 判定方法 objectがnullならテストOK。nullでなければテストNG。

12.static public void assertNull(Object object)
 object Nullかどうかを判定したいオブジェクト変数
 判定方法 objectがnullならテストOK。nullでなければテストNG。

13.static public void assertSame(String message, Object expected, Object actual)

 message テストが通らなかったときに表示したいメッセージ
 expected 比較したい一方のオブジェクト
 actual 比較したいもう一方のオブジェクト
 判定方法 expectedとactualが同じオブジェクトならOK。それ以外はエラー

14.static public void assertSame(Object expected, Object actual)
 expected 比較したい一方のオブジェクト
 actual 比較したいもう一方のオブジェクト
 判定方法 expectedとactualが同じオブジェクトならOK。それ以外はエラー
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#もし間違いあったらフォローお願いします(どなたでも)。


>
> >
> > 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で書きかえられたとは言えないので)


>
>
> > 上のメソッドでは、最初のassertEqualsでエラーがあった場合、
> > そこから先のチェックは行わない。別のメソッドの実行は行う。 
> >
>
> 一つ目のエラーでとまった方がいいような気もしますが、エラーが起きても次のtest
> メソッドを呼ぶようですね。一つ目のエラーでオブジェクトがエラー状態になる可能
> 性があるので、後半のテストは全滅という可能性もありますよね。testごとに新規に
> オブジェクトをnewしたほうがいいのかな?しなくてもいいのかな?
>

昼休みが終わりそうなので、後ほど投稿します。申し訳ありません。

>
> > 他のメソッドの例
> >
> > public void testYYY(){
> >
> > int wkInt;
> > String unitName;
> >
> > aTestTarget.setNumber(0);
> > aTestTarget.setNumber(1000);
> > assert(0 != aTestTarget.getNumber());
> >
> > aTestTarget.setName("TARO");
> > assert(! "HANAKO".equals(aTestTarget.getName()));
> >
> > }
> >
> > public void testZZZ(){
> > assertNotNull(aTestTarget.getName());
> > }
> >
> >
> >
>
> それで、実際にtestXXX(), testYYY(), testZZZ()をコールするのはだれなのでしょ
> うか?どのようなメカニズムで呼ばれるのでしょうか?
>

これについても後ほど投稿します。申し訳ありません。

--
矢崎博英  firo@....jp