Xcode4 になってから、iOS の Unit Test のやり方が Xcode3 とかなり変わっていて、だいぶやり方を悩んでしまった。試行錯誤した結果を書いておくことにする。
Xcode3 の Unit Test の種類
Xcode3 には、Logic Test と Application Test の2種類があった。詳細はiOS Development Guideを参照。
- Logic Test : アプリケーションとは独立してテストコードを実行する方法。ビルド過程でテストが実行される。
- Application Test : アプリケーションを実際に実行し、この中でテストを実行する方法。実機でしかテストは実行できない。
2つの使い分けだが、基本的に model のテストは Logic Test で、controller のテストは Application Test で行うのが基本のようだ。Logic test だと [UIApplication sharedApplication] の返り値が nil なので、これに依存するものは動作しない。
Xcode4 での Test
Xcode4 で新規にプロジェクトを作成するときにテストも一緒に作成することができる。このときに生成されるのはApplication Test のほうである。テストを実行するときは、Run ボタンを長押しして Test を選択すればよい。
最初からプロジェクトを作成する場合はこれでよいのだが、自前で Test Bundle を追加する場合はどうするのか?たぶん正しいやり方はこう。
- New Target から Cocoa Touch Unit Testing Bundle を追加する。
- Scheme ボタンを押して、Edit Scheme を選択。
- アプリケーションをビルドするための Scheme を選択 (新しく Scheme が追加されてるけどこちらは使わない)
- Build を選択し、"+" を押して Testing Buldle を追加する。
- Test を選択し、"+" を押して Testing Bundle を追加する。
これで OK 。ただし、このやり方の場合、テストは Logic Test になるので注意が必要である。
これを Application Test にする場合はさらに以下の手順を行う。
- プロジェクト設定で、TARGETS から追加した Testing Bundle を選択。
- Build Settings の "All" を選択。
- Testing Bundle をアプリケーションに link させるため、Linking にある "Bundle Loader" に、対象アプリケーションを指定する。具体的にはアプリ名を Hoge とすると、 $(BUILT_PRODUCTS_DIR)/Hoge.app/Hoge と記入する。
- テスト時にアプリケーションを起動させるため、Unit Testing にある "Test Host" に $(BUNDLE_LOADER) を設定する。
以上。設定がよくわからない場合は、Xcode4 で空プロジェクトをつくって中を覗いてみるのがおすすめ。
'11/11/5 追記。
Application Tests をする場合は、ターゲットアプリケーション側の "Symbols Hidden by Default" 設定を NO にしておくこと。そうしないと、テストクラスからアプリケーション側のクラスをリンクできない。
なお、Xcode 4 でのテスト方法については、以下に記載されている。