2010/09/21からのアクセス回数 9217
iPhone SDKにも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を参照しました。
octestの追加手順は以下の通りです。
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.0.sdk/Developer/usr/bin/otest
otestの設定
のように引数と環境変数を設定します。
引数は、2個目の引数は、単体テストのターゲット名+.octestとします。
-SenTest All |
UnitTests.octest |
環境変数は、
Name | Value |
DYLD_ROOT_PATH | $(SDKROOT) |
DYLD_FRAMEWORK_PATH | ${BUILD_PRODUCTS_DIR}:${SDK_ROOT}:${DYLD_FRAMEWORK_PATH} |
IPHONE_SIMULATOR_ROOT | $(SDKROOT) |
CFFIXED_USER_HOME | $(HOME)/Library/Application Support/iPhone Simulator/User/ |
OBJC_DISABLE_GC | YES |
DYLD_LIBRARY_PATH | ${BUILD_PRODUCTS_DIR}:${SDK_ROOT}:${DYLD_LIBRARY_PATH} |
DYLD_NEW_LOCAL_SHARED_REGIONS | YES |
DYLD_NO_FIX_PREBINDING | YES |
デバッガを起動する前に、もう一度、ターゲットUnitTestsを実行しておきます。
次に、
これで、無事デバッガが使えるようになりました。
hamcrestは、単体テストで判定をする時の便利な機能を集めたパッケージです。
hamcrestの大きな特徴は、メソッド名称が英語に近い表現になっていることです。
assertThat(aaaa, is(not(equalTo(bbbb))));
は、カッコとカンマを全部取り除くと assert that aaaa is not equal to bbbb.となり、 英語として意味のわかるように作られています。*1
残念ながら、hamcrestにはiPhone SDK用のパッケージはありません。
ここでは、SVNを使ったソースからの作成方法を紹介します。
svn checkout http://hamcrest.googlecode.com/svn/trunk/ hamcrest-read-only
/local/OCHamcrest/hamcrest-read-only/hamcrest-objectivec/SourceのOCHamcrest.xcodeprojをダブルクリック
hamcrestの使い方*2は、簡単です。
ソースの最初に以下の2行を追加するだけです。
#define HC_SHORTHAND #import <OCHamcrest/OCHamcrest.h>
最初のHC_SHORTHANDは、メソッドの先頭にHC_を付けないで使用するためのおまじないです。
ライブラリで提供する機能は以下の通りです。
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
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を作成します。
この記事は、
皆様のご意見、ご希望をお待ちしております。