[[FrontPage]] 2010/09/24からのアクセス回数 &counter; #contents Userinterface BuilderのXIBファイルを使ったテストは、iPhone SDKの単体テスト機能では上手く動作しません。 ここでは、もう一つの単体テストツールであるGoogle Tool for Mac(GTM)を使った方法を説明します。 GTMでは、iPhone Simulatorを起動しますので、起動は若干遅くなりますが、通常のiPhoneアプリケーションとして作成されますので、デバッグも簡単です。 ** GTMの準備 [#zbadee89] *** ソースのダウンロード [#s5872fd4] SVNを使ってソースをダウンロードするので操作は簡単です。ここでは$HOME/local/GTM以下にダウンロードします。 #pre{{ $ mkdir -p ~/local/GTM; cd ~/local/GTM $ svn checkout http://hamcrest.googlecode.com/svn/trunk/ hamcrest-read-only }} iPhone単体テストの構築方法は、Googleの以下のサイトを参照しました。 http://code.google.com/p/google-toolbox-for-mac/wiki/iPhoneUnitTesting *** 使い方 [#r01a085e] ソースの内、iPhoneの単体テストで使用するのは、以下のファイルです。 &ref(GTM_list.png); これをGTMIPhoneUnitTestディレクトリィにコピーし、単体テストを行うプロジェクトにコピーします。((すぐに使いたい方は、以下のファイルを解凍してご使用ください。&ref(GTMIPhoneUnitTest.zip); )) - グループとファイルでプロジェクト名を右クリックして、「追加」→「既存のファイル」で「GTMIPhoneUnitTest」を選択し、追加します。 - 次にターゲットを右クリックで「追加」→「新規ターゲット」で「Cocoa Touch」の「Application」を選択し、次へボタンを押します。ターゲット名を入力(ここではGTMUnitTestsと)します。 - GTMIPhoneUnitTest以下のソースファイル((.mで終わるファイル))と単体テストのと単体テストに必要なソースを「ソースをコンパイル」にドラッグし、 すべてのXIBファイルを「バインドリソースをコピー」にドラッグし、 必要なフレームワークを「バイナリをライブラリにリンク」にドラッグします。 - 最後にターゲットのGTMUnitTestsを右クリックで「追加」→「新規ビルドフェーズ」→「新規スクリプトを実行」を選択し、「シェルスクリプト」に以下の行を入力します。 #pre{{ "${SRCROOT}/GTMIPhoneUnitTest/RunIPhoneUnitTest.sh" }} - OCMock, OCHamcrestと一緒に使う場合には、外部リンクフラッグに-ObjC, -all_load, -lstdc++ を追加します *** 使用例 [#pe25389a] 最初の単体テストとして、簡単な文字列のチェックを使います。 GTMTestCase.h #pre{{ #import "GTMSenTestCase.h" @interface MyGTMTestCase : GTMTestCase { } @end }} GTMTestCase.m #pre{{ #import "MyGTMTestCase.h" #define HC_SHORTHAND #import <OCHamcrest/OCHamcrest.h> #import <OCMock/OCMock.h> @implementation MyGTMTestCase - (void) testHello { assertThat(@"hello", is(@"hello")); } @end }} ** GTMを使ったViewControllerの単体テスト [#b5f4c275] 準備が整ったので、ViewControllerの単体テストをします。((Carbon Five Communityの http://blog.carbonfive.com/2010/03/testing/testing-view-controllers を参考にしました)) [[iPhone/最初の一歩]]のCopyTextViewControllerをXIBファイルからロードして、ビューとボタンが正しくセットされているか確認します。 #pre{{ -(void) testViewBinding { CopyTextViewController *viewController =[[CopyTextViewController alloc] initWithNibName:@"CopyTextViewController" bundle:nil]; [viewController loadView]; assertThat(viewController.view, isNot(nilValue())); assertThat(viewController.copyButton, isNot(nilValue())); } }} 締めくくりに、デバッガでloadViewの後の、viewControllerの属性toLabelを確認しているスナップショットをお見せします。 &ref(ViewController_debug.png); ** コメント [#g1281538] この記事は、 #vote(おもしろかった[1],そうでもない[0],わかりずらい[0]) #vote(おもしろかった[2],そうでもない[0],わかりずらい[0]) 皆様のご意見、ご希望をお待ちしております。 #comment_kcaptcha