ぽんぽこ日記

プログラミング、読書、日々の生活

iPhoneシミュレータでOCUnitを実行する

前回のエントリで、XCodeのデバッガ上でOCUnitのテストを実行したいと書いたが、UIが絡まないようなロジックテストであれば思いの外簡単に実現できたので共有。

まず、新規ターゲットとしてCocoa Touchアプリケーションを追加。

ターゲットを右クリック「情報を見る」→「ビルド」タブの[リンク]グループ→[他のリンクフラグ]に、

-framework SenTestingKit

を追加、
さらに、[検索パス]グループ→[フレームワーク検索パス]に、

"$(DEVELOPER_LIBRARY_DIR)/Frameworks"

を追加、

SenTestingKitの配布元からソースをダウンロードし、Sourcecode/otest/SenTestTool.>|hm|をプロジェクトと、先ほど作成したターゲットに含める。
(SenTestToolはバンドルディレクトリを引数にとって、テストスイートを実行するコマンドラインツール。)
SenTestTool.mのrunメソッドを下記のように書き換える。

- (void) run
{
    NS_DURING

        NSString *path = [[[NSProcessInfo processInfo] arguments] lastObject];
        NSBundle *bundle = [NSBundle mainBundle];
         if (![self runTestFromBundle:bundle]) {
                    [self launchTaskFromPath:path bundle:bundle];

        }
            
    NS_HANDLER
        [self showUsage];
        NSLog (@"%@", localException);
    NS_ENDHANDLER
}

下記のような内容のmain()関数を実装した.mファイルをターゲットに含める。

#import "SenTestTool.h"
int main(int argc, char *argv[]) {
  
  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

      [SenTestTool run];
  [pool release];
  return 0;
}

あとは、Xcodeで追加したテストケースクラスをターゲットに含めて、[デバッグ]を実行すればiPhoneシミュレータが起動されてテストが実行される。通常main()関数からUIApplication#applicationMainを実行されるところが、テストスイートの実行に差し替わっているのでGUIは立ち上がらず、テストが終了したらデバッガは終了する。テストの出力や結果はデバッガコンソールに表示される。

もう一工夫ふた工夫すればGUIでテスト結果を参照することも可能だと思うが、取り急ぎ。


(まだ試していないが、実機では動かないような気がする。)