2008-05-17

Objective-CでUnit Test

XCodeにはUnit TestのFrameworkであるSenTestingKitが添付されている。SenTestingKitでのテスト方法を簡単にまとめておく。

以下のようなクラス Circleがあった場合、

#import <Cocoa/Cocoa.h>#define PI (double)3.14159
@interface Circle : NSObject {
double _radius;
}
+(id)circleWithRadius: (double) raidus;
-(id)initWithRadius:(double)radius;
-(double)diameter;
-(double)dimension;
-(double)circumference;
@property(readwrite) double radius;
@end

まず、テスト用の新規ターゲットを作成する。このときアシスタントで「Cocoa」のカテゴリーから「Unit Test Budle」を選択しておく。名前は何でもよい"TestCircle"などとしておく。

次にFrameworkの取り込みを行う。
Frameworkの定義は、/Developer/Libary/Frameworks/SenTestingKit.frameworkにあるのでこれをプロジェクトに追加する。ここで、先に作成した新規ターゲット"TestCircle”に追加する。

そしていよいよテスト用のコードの追加。
新規ファイルをプロジェクトに作成し、ファイルの種類を「Objective-C test case class」を選択する。ヘッダーフィアルを見るとSenTestingKitのヘッダーのインポートとクラスのテンプレートができているので、ここにテストしたいクラスのインスタンスとテスト用のメソッドを定義しておく。

#import <SenTestingKit/SenTestingKit.h>
#import "Circle.h"

@interface CircleTest : SenTestCase {
Circle* circle;
}
-(void)testDiameterValue;
-(void)testCicumference;
-(void)testDimension;
@end

これらのメソッドのほかにSenTestCaseで定義されているsetUpとtearDownの2つのメソッドを通常はオーバーライドする。それぞれ初期化とテスト終了時の後始末を担うメソッド。その他のテスト用のメソッドに関しては、メソッド名を「test」で始めること。

テスト用メソッドでの確認方法は、SenTestingKitが提供するチェック用の関数を使って以下のように実施する。

-(void)testDimension {
STAssertEquals([circle dimension],(30 * 30 * PI),nil,NULL);
}

この関数では最初の引数と2番目の引数が正しくなければエラーとなる。その他いくつかの関数が定義されているのでそれらを使用してクラスのテストケースとその結果をチェックするロジックを作成する。

これらのチェックはビルド時に行われる。チェックするにはアクティブターゲットをテスト用に作成したターゲット(ここではTestCircle)を指定してビルドする。結果が正しければ何事もなくビルドは完了する。エラーがあれば、ビルドの後以下のようにコンパイルのエラーと同様に表示される。

Download

0 件のコメント:

コメントを投稿