FrontPage

2010/09/21からのアクセス回数 8877

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に変更し、ビルドして見てください。

failed.png

のようなエラーが「スクリプト実行」の結果として表示されます。 残念ながらこのままではtestMathをデバッグできません。

かっこ悪いデバッガの使い方

とても残念なのですが、色々調べた結果単体テストのデバッグには、次ような作業がプロジェクト毎に必要になります。

この方法は、Scitt Densmore氏の以下のURLを参照しました。

otestの設定

octestの追加手順は以下の通りです。

otestの設定

arg_setting.png

のように引数と環境変数を設定します。

引数は、2個目の引数は、単体テストのターゲット名+.octestとします。

-SenTest All
UnitTests.octest

環境変数は、

NameValue
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_GCYES
DYLD_LIBRARY_PATH${BUILD_PRODUCTS_DIR}:${SDK_ROOT}:${DYLD_LIBRARY_PATH}
DYLD_NEW_LOCAL_SHARED_REGIONSYES
DYLD_NO_FIX_PREBINDINGYES

デバッガの起動

デバッガを起動する前に、もう一度、ターゲットUnitTestsを実行しておきます。

次に、

debugger.png

これで、無事デバッガが使えるようになりました。

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プロジェクトをテストしたいプロジェクトにドラッグしますと、

drag_proj.png

のダイアログが表示されるので、ターゲットを単体テスト(UnitTests)であることを確認します。

次に、libochamcrest.aの左端のチェックボックスをセットします。

hamcrest_ex.png

最後にターゲットの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_proj.png

OCMockの使用例

OCMockを使うには、ヘッダファイルとライブラリをセットする必要があります。

ここで注意することは、OCMock.frameworkのライブラリを使用しないように、プロジェクトのファイル名一覧のOCMock.frameworkの右端のチェックを外すことです。

ocmock_setting.png

準備ができたら、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"));
}

これで、テスト駆動型開発の準備が整いました。

コメント

この記事は、

選択肢 投票
おもしろかった 1  
そうでもない 0  
わかりずらい 0  

皆様のご意見、ご希望をお待ちしております。


(Input image string)

*1 hamcrestについては、java版ですが都元ダイスケさんのページ http://d.hatena.ne.jp/daisuke-m/20090710/1247181113 を参考にさせて頂きました。
*2 詳しくは http://code.google.com/p/hamcrest/wiki/TutorialObjectiveC を参照

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc