今回は google-toolbox-for-mac に付属する単体テストフレームワーク GTM UnitTest を紹介します。Xcode に付属している OCUnit に比べてアプリとして実行されるのでテストコード自体のデバッグがしやすい事や通信などの非同期テストが可能などの点が優れています。
インストール
インストールは少し面倒ですが頑張りましょう。手順としては以下になります。
- テスト用のターゲットを作成
- google-toolbox-for-mac をチェックアウトして必要なファイルを、プロジェクトに追加
- プロジェクトにビルドフェーズを追加
- 動作確認
順に見ていきます。ここでは MyProject というプロジェクトがホームディレクトリにあるものとしています。
1. テスト用のターゲットを作成
まず対象のプロジェクトにテスト用のターゲットを追加します。「プロジェクト > 新規ターゲット」を選択し、Application を追加します。ここで追加するのは Application で Unit Test Bundle では無い事に注意して下さい。手順2以降でここで追加したターゲットのセットアップをしていきます。
2. google-toolbox-for-mac をチェックアウトして必要なファイルを、プロジェクトに追加
一番面倒なのがこの作業です。google-toolbox-for-mac はその名の通り mac 上での開発支援ツールなので、その中から iPhone アプリ開発に必要なファイル群を1で追加したターゲットにコピーします。コピーする必要があるファイルは以下の通りです。
- google-toolbox-for-mac/UnitTesting/GTMIPhoneUnitTestMain.m
- google-toolbox-for-mac/UnitTesting/GTMIPhoneUnitTestDelegate.m
- google-toolbox-for-mac/UnitTesting/GTMIPhoneUnitTestDelegate.h
- google-toolbox-for-mac/UnitTesting/GTMSenTestCase.m
- google-toolbox-for-mac/UnitTesting/GTMSenTestCase.h
- google-toolbox-for-mac/UnitTesting/GTMUnitTestDevLog.m
- google-toolbox-for-mac/UnitTesting/GTMUnitTestDevLog.h
- google-toolbox-for-mac/Foundation/GTMObjC2Runtime.m
- google-toolbox-for-mac/Foundation/GTMObjC2Runtime.h
- google-toolbox-for-mac/Foundation/GTMRegex.m
- google-toolbox-for-mac/Foundation/GTMRegex.h
- google-toolbox-for-mac/GTMDefines.h
ここでは ~/MyProject に GTMUnitTest というディレクトリを作成して上記ファイル群をコピーし、使用するものとしています。ターミナルから以下の操作を行います。
$ mkdir -p ~/MyProject/GTMUnitTest $ svn checkout http://google-toolbox-for-mac.googlecode.com/svn/trunk/ google-toolbox-for-mac $ cp google-toolbox-for-mac/UnitTesting/GTMIPhoneUnitTest.* ~/MyProject/GTMUnitTest/. $ cp google-toolbox-for-mac/UnitTesting/GTMSenTestCase.* ~/MyProject/GTMUnitTest/. $ cp google-toolbox-for-mac/UnitTesting/GTMUnitTestDevLog.* ~/MyProject/GTMUnitTest/. $ cp google-toolbox-for-mac/Foundation/GTMObjC2Runtime.* ~/MyProject/GTMUnitTest/. $ cp google-toolbox-for-mac/Foundation/GTMRegex.* ~/MyProject/GTMUnitTest/. $ cp google-toolbox-for-mac/GTMDefines.h ~/MyProject/GTMUnitTest/. $ cp google-toolbox-for-mac/UnitTesting/RunIPhoneUnitTest.sh ~/MyProject/GTMUnitTest/.
コピーが終わったら MyProject を1で追加したターゲットにファイル群を登録します。新しくグループを作ると良いでしょう。以下のスクリーンショットは2の手順を終えたところです。
3. プロジェクトにビルドフェーズを追加
次に必要なファイルをプロジェクトに登録できたら、次はビルドフェーズを追加します。「プロジェクト > 新規ビルドフェーズ > 新規スクリプトを実行」でビルド後に実行するスクリプトを追加し、以下の内容に編集します。このスクリプトはビルド時にテストを実行する為のもので、OCUnit と同じ使用感で GTMUnit を使えるようになります。
./GTMUnitTest/RunIPhoneUnitTest.sh
4. 動作確認
3までの操作が完了したらビルドしてみましょう。次の様な出力が得られたら正常に動作しています。早速使ってみましょう。
Executed 0 tests, with 0 failures (0 unexpected) in 0.053 (0.053) seconds
使い方
使い方は OCUnitTest とほとんど同じです。「ファイル > 新規ファイル」から「Objective-C test case class」を選択してテストケース用のクラスを追加しましょう。生成されたクラスが、 SenTestCase ではなく GTMTestCase を継承するように修正して下さい。
#import#import "GTMSenTestCase.h" @interface NSStringAdditionsTest : GTMTestCase { } @end
後はいつも通りテストを書いてビルドしてみましょう。「Executed 1 tests, with 0 failures (0 unexpected) in 0.283 (0.283) seconds」のように結果が表示されれば成功です。
#import "MyProjectTest.h" - (void) testMath { STAssertTrue((1+1)==2, @"Compiler isn't feeling well today..." ); }
なおテストコードをデバッグしたい場合は、テストターゲットをビルドではなく実行します。またテストケース内でランループをまわせば非同期処理のテストも可能です。上手く組み合わせて、効率の良いテストを目指していきたいですね。