
Jenkinsサーバを立てているなら、ビルドだけで無くUnitTestもしてみたい。
と思い、iOSのテストコードを書く事にいたしました。
UnitTestのFrameworkはいろいろあるのですが、
なんだからGHUnitが良さそうです。
GHUnitのインストール
まずはGHUnitのインストールから、GHUnitはGitHubにありますので、探しましょう。
git clone https://github.com/gabriel/gh-unit.git cd gh-unit/Project-iOS/ make
これでFramework完成。

テストターゲットの作成
Xcodeのテストしたいプロジェクトから、Add Targetでターゲットを追加します。今回はUnitTestというターゲットとでもしましょう。

ターゲットを追加したら、AppDelegate.h、AppDelegate.m、InfoPlist.stringを削除します。
次に、ターゲットを指定し、Build Settingsで、
Valid Architechturesにi386(iOSシミュレータ)を追加します。

そして、Other Linker Flagsに-ObjC -all_loadを追加します。

最後にフレームワークを追加します。
先ほどビルドしたGHUnitiOS.frameworkをプロジェクトのFrameworksへコピー。
Build PhasesにはGHUnitiOS.frameworkも追加されている事を確認して下さい。
追加されていなければ、FrameworksからGHUnitiOS.frameworkを選択し、
右のTarget MembershipでUnitTestターゲットをチェックして下さい。
また、UnitTestターゲットのBuild Phasesから、QuartzCore.frameworkを追加します。
一旦ここまでで事前準備は完了です。
テスト設定
これだけで済めばいいのですが、実行出来なかったり、バグがあったりいろいろでした。何でかなぁと調べてて、私が実行出来た設定のメモを残します。
まずはmain.mを編集します。
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import <GHUnitIOS/GHUnit.h>
@interface MyUIApplication : UIApplication
@end
@implementation MyUIApplication
- (id)init
{
self = [super init];
if (self && getenv("GHUNIT_CLI") && [[[UIDevice currentDevice] systemVersion] doubleValue] >= 6.0) {
__block BOOL done = NO;
NSOperationQueue * queue = [[ NSOperationQueue alloc ] init ];
[queue addOperationWithBlock:^{
int status = [GHTestRunner run];
if (status != 0) {
NSString *reason = [NSString stringWithFormat:@"failed to test %d", status];
@throw [NSException exceptionWithName:@"TestFailure" reason:reason userInfo:nil];
}
done = YES;
}];
while( !done ) {
[[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: 5] ];
}
}
return self;
}
@end
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, @"MyUIApplication", @"GHUnitIOSAppDelegate");
}
}
テストコード
同期テストの場合はGHTestCase、非同期テストの場合はGHAsyncTestCaseクラスを使います。テストディレクトに新規Objective-Cのクラスファイルを作り、
テストコードを書いていきます。
こちらは後日詳しく説明しようと思います。
実行
実行する為にMakefileを作ります。clean:
-rm -rf build/*
test:
GHUNIT_CLI=1 xcodebuild -target UnitTest -configuration Debug -sdk iphonesimulator build
と作成しました。
最後にテストを実行する為のコマンド
make clean && make testで実行出来ました。
JUnit形式のXMLを出力させ、Jenkinsで表示なんて事もやってます。
そのあたりはおいおい解説していきますね。
0 件のコメント:
コメントを投稿