Xcode 4.0.2でテストの実行がうまくいかない問題に対する対応

Xcode 4.0.2でiPhoneアプリを開発しようと思ったのですがテストが上手く動かず、動くようになるまで若干苦労したので備忘録的に解決策を残しておこうと思います。

4.0.2はデフォルトだと(僕の環境の問題?)

  • デフォルトで入っている必ず失敗するはずのテストが動かない
  • テストを実行する環境を用意するためにいくつか設定が必要

という状態でした。

1. TEST_AFTER_BUILDの設定

デフォルトの設定だと上手くテストが実行されません。なんだろーと思ってログを確認したところ、

TEST_AFTER_BUILDという環境変数にNOが設定されているようだったのでとりあえず、全部Yesに変更しました。


2. RunPlatformUnitTests の編集

TEST_AFTER_BUILDをYESに設定してBuildしてみると警告が出るようになりました。

警告は、

/Developer/Platforms/iPhoneSimulator.platform/Developer/Tools/Tools/RunPlatformUnitTests

というファイルのL95で出ているようです。これについて調べていると次のエントリで解決策が紹介されていました。
http://longweekendmobile.com/2011/04/17/xcode4-running-application-tests-from-the-command-line-in-ios/

Change line 95 of /Developer/Platforms/iPhoneSimulator.platform/Developer/Tools/RunPlatformUnitTests from-the-command-line-in-ios
Warning ${LINENO} "Skipping tests; the iPhoneSimulator platform does not currently support application-hosted tests (TEST_HOST set)."
 
to these 2 lines:
 
export OTHER_TEST_FLAGS="-RegisterForSystemEvents"
RunTestsForApplication "${TEST_HOST}" "${TEST_BUNDLE_PATH}"

L95を次の2行に置き換えろとのことだったので置き換えました。

3.テストを動かしてみる

RunPlatformUnitTestsの編集後にBuild For Testingでテストを動かすと、無事テストが実行でき結果は失敗となりました。

STFail(@"Unit tests are not implemented yet in SampleTests");

デフォルトだと必ず失敗するようになっているので、これを動く形にとりあえず変更してみました。

STAssertTrue(1, @"test success");

これで、テストを実行した上で、Buildできるようになりました。

4.新しくクラスとテストを追加してみる

とりあえずデフォルトのテストは動いたので、新しくクラスとテストを追加してみました。

Buildしてみると、またエラーが出て SenTestingKit/SenTestingKit.h が無いと怒られたので、最初から入ってるテストは大丈夫なのに。。。と思いながらも、とりあえずFrameworksディレクトリに追加しました。追加はmenuから

File > Add Filt to "ProjectName" > /Developer/Library/Frameworks/SenTestingKit.framework

を指定します。追加されたFrameworkはFrameworksディレクトリの下に移動しておきました。


Build For Testingでテストが実行されることが確認できました。


(ちょっと分かりにくいですが、SampleTestが追加したテストでSampleTestsが最初から存在していたテストです)

なんとか動いた

これで開発もなんとか出来そうです。
4.0.2でテストが実行出来ない問題について日本語のブログで情報があまり出てきませんでした、もしかしたら自分の環境が良くないのかも。。。