![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6HwIwsooT8j1J37kNnvwtssYGOZSlqCWahN8JjCP6MZsPN_QMFyioPzRWMCYWOZcLVgQ6Zo9kSWXfmL-ft2u2midIaJL7KUa2mgF3Ccw-V_YLIdFTWFBSrGUyKba4wy1D9fB6GlFQoy_F/s320/ghunit.png)
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完成。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEildzxxsj5RQDOC93mw0RdJkMFB71DcG6dbcQ-KTjvFgrWVsOk6ydlWz7kRfTa8DhEbOrTTT-Nc1uEgsDBLQfFFQ1F6CgS8pMtkeRn1igzm3XYw2ABQtEAK8KNFBHPnew9Axo8jVylkcp6O/s320/ghunit2.png)
テストターゲットの作成
Xcodeのテストしたいプロジェクトから、Add Targetでターゲットを追加します。今回はUnitTestというターゲットとでもしましょう。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsJ-c1r9KSm0pcihJmDZ3Gn7wEbsqbZ2kx6c8E3Jc6FzSrnS719GWhaCuei11tndfmzcetx-6o_URPanOO8EicHNZhTsdm4HA-aUtg14huhCPkJX8j8ZyLCuNGOHRKPU8htTIsqMr8h-0f/s320/ghunit3.png)
ターゲットを追加したら、AppDelegate.h、AppDelegate.m、InfoPlist.stringを削除します。
次に、ターゲットを指定し、Build Settingsで、
Valid Architechturesにi386(iOSシミュレータ)を追加します。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_N5_P5dH0I65ZT3Kz3IyFFGzikQUspdwyrX63gV8mHJPJcZIRQKARbBfjNPf05y_bG9woJNxmTlvtco7zyhAUPfxLpG3GM3VoDa0Y38IHaS1k19R9g1bB-YUFuGbZlwoMaYjhxi2HNGk-/s320/ghunit4.png)
そして、Other Linker Flagsに-ObjC -all_loadを追加します。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRZfw_jvdfFbQVOoiJhi4f8KfyXe0CTALPB3fyim9VrR8yMJD-874csKeZ54Y3GE60-MTkAtanZ6LCaFaIplovHT2KCVYMTo-oKO1X2QP5n49Z1PwjtbqdtsGrQN-ZhSj1hbkDqjcmomCn/s320/ghunit5.png)
最後にフレームワークを追加します。
先ほどビルドした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 件のコメント:
コメントを投稿