2010/09/21からのアクセス回数 9209 iPhone SDKのUnitTestは中途半端 †iPhone SDKにもUnitTest用のクラスとプロジェクトテンプレートが提供されています。 UnitTest バンドルの新規作成 †iPhone用のアプリケーションプロジェクト(ここではCopyTextを使います)に、UnitTestバンドルを追加します。
単体テストクラスを作成 †次に単体テスト用のクラスを作成します。
今回は、APPLICATION_UNIT_TESTを使わないので、MyTestCase.hのdefine文を変更します。 #define USE_APPLICATION_UNIT_TEST 0 単体テストの実行 †単体テストの実行は、
単体テストに失敗すると「CopyTest-ビルド結果」のウィンドウにエラーが表示されるのですが、 正常終了の場合は、Build Succeededとしか出力されません。 「何となく」物足りないのと、エラーが発生した場合デバッグすることができないのが、 私が「中途半端」と感じるところです。 試しにtestMathの1+1を1+2に変更し、ビルドして見てください。 のようなエラーが「スクリプト実行」の結果として表示されます。 残念ながらこのままではtestMathをデバッグできません。 かっこ悪いデバッガの使い方 †とても残念なのですが、色々調べた結果単体テストのデバッグには、次ような作業がプロジェクト毎に必要になります。
この方法は、Scitt Densmore氏の以下のURLを参照しました。 otestの設定 †octestの追加手順は以下の通りです。
otestの設定
のように引数と環境変数を設定します。 引数は、2個目の引数は、単体テストのターゲット名+.octestとします。
環境変数は、
デバッガの起動 †デバッガを起動する前に、もう一度、ターゲットUnitTestsを実行しておきます。 次に、
これで、無事デバッガが使えるようになりました。 hamcrestの準備 †hamcrestは、単体テストで判定をする時の便利な機能を集めたパッケージです。 hamcrestの大きな特徴は、メソッド名称が英語に近い表現になっていることです。 assertThat(aaaa, is(not(equalTo(bbbb)))); は、カッコとカンマを全部取り除くと assert that aaaa is not equal to bbbb.となり、 英語として意味のわかるように作られています。*1 インストール手順 †残念ながら、hamcrestにはiPhone SDK用のパッケージはありません。 ここでは、SVNを使ったソースからの作成方法を紹介します。
使い方 †hamcrestの使い方*2は、簡単です。 ソースの最初に以下の2行を追加するだけです。 #define HC_SHORTHAND #import <OCHamcrest/OCHamcrest.h> 最初のHC_SHORTHANDは、メソッドの先頭にHC_を付けないで使用するためのおまじないです。 ライブラリで提供する機能は以下の通りです。
hamcrestの使用例 †hamcrestを使うには、
必要があります。 外部フレームワークの追加は、プロジェクトを選択し、右クリックで「追加」→「既存のフレームワーク」を選択し、「その他の追加」からOCHamcrestのSource/build以下のDebug/OCHamcrest.frameworkを選択します。 次に、OCHamcrestのXCodeプロジェクトをテストしたいプロジェクトにドラッグしますと、 のダイアログが表示されるので、ターゲットを単体テスト(UnitTests)であることを確認します。 次に、libochamcrest.aの左端のチェックボックスをセットします。 最後にターゲットのUnitTestsを選択し、「情報を見る」を選択し、ビルドタグから外部リンクを選択し、「他のリンカフラグ」をダブルクリックし、他のフラグの後に-ObjC, -all_load, -lstdc++ を追加する。 テストプログラムは、以下を参考に入力してください。 #import "GTMSenTestCase.h" #define HC_SHORTHAND #import <OCHamcrest/OCHamcrest.h> @interface ExampleWithAssertThat : SenTestCase @end @implementation ExampleWithAssertThat - (void) testUsingAssertThat { assertThat(@"xx", is(@"xx")); assertThat(@"yy", isNot(@"xx")); assertThat(@"i like cheese", containsString(@"cheese")); } @end OCMockの準備 †iPhone/最初の一歩でもお話したように、iPhoneの処理はViewControllerを中心に作られているため、 iPhoneシミュレータでWindowを表示しなければ、動作をチェックすることができません。 単体テストでは、OCMockのモック機能を使ってWindowを実際に表示することなく、テストが可能に なります。 OCMockには、
があります。 インストール手順 †OCMockは、以下のURLから「Download」タグをクリックして、 http://www.mulle-kybernetik.com/software/OCMock/ iPhone用の場合には、Mac OS X 10.6以降が必要ですから、ocmock-1.70.dmgをダウンロッドしてください。 ダウンロードしたOCMockは、システムではなくユーザのローカルディレクトリに入れることにします。ここでは、
に入れます。 OCMock 1.70/Source/ocmock-1.70にあるOCMock.xcodeprojをダブルクリックします。 ターゲットをOCMockPhoneSimに切り替えて、Debug版のlibOCMock.aを作成します。 OCMockの使用例 †OCMockを使うには、ヘッダファイルとライブラリをセットする必要があります。
ここで注意することは、OCMock.frameworkのライブラリを使用しないように、プロジェクトのファイル名一覧のOCMock.frameworkの右端のチェックを外すことです。 準備ができたら、OCMockのテスト用のメソッドを追加します。 // 以下のimport文を追加 #import <OCHamcrest/OCHamcrest.h> #import <OCMock/OCMock.h> // テスト用メソッドは以下の通り - (void)testReturnsStubbedReturnValue { id mock = [OCMockObject mockForClass:[NSString class]]; [[[mock stub] andReturn:@"megamock"] lowercaseString]; id returnValue = [mock lowercaseString]; assertThat(returnValue, is(@"megamock")); } これで、テスト駆動型開発の準備が整いました。 コメント †この記事は、 皆様のご意見、ご希望をお待ちしております。 Tweet |