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 テストプログラムは、以下を参考に入力してください。
#import "GTMSenTestCase.h" #define HC_SHORTHAND #import <hamcrest/hamcrest.h> @interface ExampleWithAssertThat : SenTestCase @end @implementation ExampleWithAssertThat - (void) testUsingAssertThat { assertThat(@"xx", is(@"xx")); assertThat(@"yy", isNot(@"xx")); assertThat(@"i like cheese", containsString(@"cheese")); } @end
この記事は、
皆様のご意見、ご希望をお待ちしております。