ObjcUnit その4

2003/06/01


ObjcUnitの使い方 その3

前回のつづきです。


テストを書こう その3

  1. Obvious Implementation
    ビルドすると、「SmallIntegerにメソッドadd:がない」と言われるので書いちゃいましょう。
    - (id) add: (id)another
    {
    	value += [another intValue];
    	return self;
    }
    
    「なにぃ! Fake Itしないのか」って。しないんです(^_^)
    - (id) add: (id)another
    {
    	value = 2;
    	return self;
    }
    
    べつに、こんなのを書いてもいいんだけど、わざわざ書きたい?
    こういうときは「少しはまともに」書いちゃってもいいんです。そうじゃないと、遅くてしょうがないでしょ?
    こういう分かりきっているやつをObvious Implementationと言うんですよ。
  2. テストを失敗させる?
    あまりに簡単な実装だったので、テストに失敗しませんでした。でも、これを喜んでいるようじゃ、まだまだシロウトです(^_^)
    ここでは、わざと間違えてテストを失敗させてみましょう。2に0を足したら、2になるはずですが、ここでは3ということにしてみましょう。
    - (void) testAdd
    {
    	SmallInteger* one = [SmallInteger initWithInt:1];
    	SmallInteger* two = [one add:[SmallInteger initWithInt:1]];
    	[self assert:two equals:[SmallInteger initWithInt:2]];
    
    	[two add:[SmallInteger initWithInt:0]];
    	[self assert:two equals:[SmallInteger initWithInt:3]];
    }
    
    ビルドして実行させてみましょう。
    ..F
    
    FAILURES!!!
    Tests run:2,  Failures:1,  Errors: 0
    There was 1 failure:
    1) testAdd(SmallTest)"expected <SmallInteger: 0x7f770> but was <SmallInteger: 0x7f730>"
    
    これじゃあ、どこが間違っているのか分かりませんね。困りました(^^;
  3. 値を表示しよう。
    テストに失敗すると、アドレスらしきものが表示されるだけで、見ただけでは何がおかしいのか、さっぱり分かりませんでしたね。これでは後々困るので、メンバの値を表示して、表示上区別できるようにしましょう。
    そのためのメソッドがdescriptionです。
    - (NSString *) description
    {
    	return [NSString stringWithFormat:@"SmallInteger(%d)", value];
    }
    
    ..F
    
    FAILURES!!!
    Tests run:2,  Failures:1,  Errors: 0
    There was 1 failure:
    1) testAdd(SmallTest)"expected SmallInteger(3) but was SmallInteger(2)"
    
    これで「3になるはずなのに、2だよ」って言われました。これでテストの内容が理解できるようになりました。
  4. 修正。
    テストのほうが間違っていたわけですから、正しくしておきましょう。これで2つのテストを成功させることができました。
    - (void) testAdd
    {
    	SmallInteger* one = [SmallInteger initWithInt:1];
    	SmallInteger* two = [one add:[SmallInteger initWithInt:1]];
    	[self assert:two equals:[SmallInteger initWithInt:2]];
    
    	[two add:[SmallInteger initWithInt:0]];
    	[self assert:two equals:[SmallInteger initWithInt:2]];
    }
    

今日のおまけ

メソッドdescriptionを書いたら、オブジェクトの内容を表示できるようになりました。しかし、表示できたからと言って、正しく表示されているとは限りません。ここで注意しなければいけないことは「2になるはずなのに、3だよ」ではないということです。説明上、例を簡単にしているから、この例のようにテストプログラムを間違うわけないと思っているかもしれませんが、あなたが書いたテストプログラムだって間違うかもしれないのです。そのとき、運が悪いと、テストされたプログラムが正しいのに、テストは失敗します。

正しく表示できるのは、正しく使ったときだけです。メソッドassert:equals:の正しい使い方です。

[self assert:<テストされる値> equals:<テスト結果として正しい値>];


戻る