更新日:2010/06/13
目的OCUnitを使いCocoa Applicationをテストする方法を理解する。 また、日本語で解説している資料がほとんどないため、ここで簡単に解説する。 「実習環境」の環境要件を満たしていること。 TDDで一般的な、レッド/グリーン/リファクタリングの流れでは説明していない。
実習環境| OS | Mac OS X 10.6.2 | | Xcode | Xcode 3.2.1 | OCUnitはXcodeをインストールすると一緒にインストールされる。
実習開始新規プロジェクトを作成- 新規プロジェクトとして Cocoa Application を作成する。
- 名前を付けて適当なフォルダに保存する。(ここではOCTと名前を付けた)
- Xcode左側の [グループとファイル] ペインから [ターゲット] を開くと、OCTというターゲットが追加されている。
このターゲットがテスト対象となる。
テストケースとなるターゲットを追加- 作成したプロジェクトに、テストケースとなるターゲットを追加する。
[プロジェクト] メニューから [新規ターゲット] を選択。 [Unit Test Bundle] を選択し、次へ。
- Unit Testsと名前を付け、[完了] をクリック。
- ターゲットの情報ウィンドウが表示されるので [一般] タブを選択し、直接依存関係にOCTを追加する。
これでUnit TestsのコンパイルをトリガにしてOCTがコンパイルされるようになる。 (つまり、常に最新のOCTのコードをテストできるようになる)

- 次に [ビルド] タブを選択し、[テストホスト] が見付かるまでスクロールする。
そして、テスト対象プログラムの実行形式ファイルへのパスを入力する。
$(BUILT_PRODUCTS_DIR)/OCT.app/Contents/MacOS/OCT
- [テストホスト] に設定したパスを、[バンドルローダー] にも設定する。
- テストケースとなるターゲットの追加完了。
単体テストを行う準備は整ったので、後はテスト対象となるプログラムとテストケースを書いていく。
ここで追加するコードはすべてガベージコレクションが有効になっていることを前提にしている。
- 新規ファイルとして、[Objective-C class](スーパークラスはNSObject)をCounter.mという名前で追加。
さらにターゲットとしてOCTを選択する。
- Counter.hに下記コードを追加。
#import <Cocoa/Cocoa.h>
@interface Counter : NSObject {
int number;
}
@property(readwrite) int number;
- (void)countUp;
@end
- Counter.mに下記コードを追加。
#import "Counter.h"
@implementation Counter
@synthesize number;
- (void)countUp
{
number++;
}
@end
テストケースの作成ここで追加するコードはすべてガベージコレクションが有効になっていることを前提にしている。
- 新規ファイルとして、[Objective-C test case class] をCounterTestCase.mという名前で追加。
さらにターゲットとしてUnit Testsを選択する。
- CounterTestCase.hに下記コードを追加。
#import <SenTestingKit/SenTestingKit.h>
#import "Counter.h"
@interface CounterTestCase : SenTestCase {
}
- (void)testCountUp;
@end ここで重要なポイントが2つある。 1つ目は、テストケースとして作成したクラス(CounterTestCase)が SenTestCase のサブクラスであるということ。 2つ目は、テスト用メソッド(testCountUp:)の名前が「test」から始まっていること。 Unit Testsターゲットをビルドする際には、SenTestCaseのサブクラスのうち、testから 始まるメソッドが実行される。そのため、どちらかが抜けていた場合はテストが実行されないことになる。
- CounterTestCase.mに下記コードを追加。
#import "CounterTestCase.h"
@implementation CounterTestCase
- (void)testCountUp
{
Counter *testCounter = [[Counter alloc] init];
[testCounter countUp];
STAssertEquals([testCounter number], 1, @"testCountUp failed");
}
@end STAssertEquals()等のマクロの使用方法は「参考文献」のリンク先を参照。
ガベージコレクションの設定ガベージコレクションの設定はOCUnitとは無関係だが、メモリ管理が面倒なので有効にする。
- Xcode左側の [グループとファイル] ペインから、一番上にある [OCT] を選択。
- [ファイル] メニューから [情報を見る] を選択し、情報ウィンドウを開く。
そして設定内容が Debug 構成と Release 構成の両方で有効になるように 左上にある [構成] で [すべての構成] を指定する。
- [ビルド] タブで [Objective-C ガベージコレクション] が見付かるまでスクロールする。
そして [必須[-fobjc-gc-only]] を選択。
ビルド(テスト開始)- ビルド対象となるターゲットを Unit Tests に変更する。
- ビルドを実行すると、自動的にテストが実行される。
テスト結果はビルド結果ウィンドウで確認する。

- testCountUp:メソッドの STAssertEquals() の第2引数を「1」から「2」に変更して
ビルドすると、テストに失敗する。
- おわり
テストが成功するはずなのにビルドできないテストが失敗してビルドできないのではなく、他の原因が考えられる場合 下記内容をチェックすると何か分かるかもしれない。 - SenTestingKit.frameworkの場所
いくつかのウェブサイトで「SenTestingKit.framework が /System/Library/Frameworks ではなく /Developer/Library/Frameworks に存在するためXcodeでビルドに失敗する」という記述を見かけた。 ビルドするには下記コマンドで、/System/Library/Frameworks にシンボリックリンクを貼る必要があるらしい。
$ sudo ln -s /Developer/Library/Frameworks/SenTestingKit.framework /System/Library/Frameworks/SenTestingKit.framework しかし、今回の実習環境では上記の現象は発生しておらず、シンボリックリンクを貼る必要もなかった。
|
|