【iOS】XCTest で単体テスト

久しぶりのiOSネタです。XCTest.frameworkはDocumentが少ないですが割と手軽に単体テストが行えます。使えるテスト用メソッドはこちらのスライドで確認できます。

環境は OS X 10.9.1, XCode 5.0.2 です。

テスト対象のクラスを作成

以下のようなクイズの出題数と正解数を管理するクラスを作りました。

// Get Method
-(unsigned int)getQuestionCount{
    return self.questionCount;
}

-(unsigned int)getCorrectCount{
    return self.correctCount;
}

-(BOOL)getCorrect{
    return self.isCorrected;
}

// Set Method
-(int)setCount:(BOOL)isCorrected{
    self.questionCount++;
    _isCorrected = isCorrected;
    if (_isCorrected)self.correctCount++;
    
    return 0;
}

このクラスを単体テストします。

テストコードを書く

XCodeプロジェクトのツリーで [YourProject]Testsというディレクトリに [YourProject]Tests.m というファイルがあると思います。

テストを行うメソッドは,以下のようにprefixにtestをつけます。

- (void)testMyClass

以下ではXCTAssertEqualという2つのデータが等しいかどうかの判定メソッドを使っています。

- (void)testSetCount
{
    QuestionManager *qm = [[QuestionManager alloc]init];
    int ret = [qm setCount:1];
    XCTAssertEqual(ret,0);
}

- (void)testGetCount
{
    QuestionManager *qm = [QuestionManager sharedManager];
    [qm setCount:1];
    [qm setCount:0];
    [qm setCount:1];
    [qm setCount:1];
    [qm setCount:0];
    [qm setCount:0];
    [qm setCount:1];
    [qm setCount:1];
    [qm setCount:1];
    [qm setCount:0];
    // 直前問題の正解可否を取得
    int ret = [qm getCorrect];
    XCTAssertEqual(ret,0);
    // 正解数を取得
    int ret2 = [qm getCorrectCount];
    XCTAssertEqual(ret2,6);
    // 出題数を取得
    int ret3 = [qm getQuestionCount];
    XCTAssertEqual(ret3,10);
}

テスト実行

Test Navigator の三角ボタン,もしくは Product > test から行います。

test_run

実行するとTesting…と表示され,結果は以下のようにNavigatorに表示されます。

test_success

xcodebuildでJenkins等のCIツールとも連携できます。

余談ですが、ライブラリを持ってくる時などに発生する ld: warning: directory not found for option ‘-L/path/to/hoge’ のエラーはBuild Settings -> Library Search Paths に存在しないファイルが指定されていることが多いですが,これはディレクトリが指定されている場合だとその下にReadMe.txtなどが含まれていても同様のエラーがでるのが厄介な所です。