注: 最近では、単体テストのセットアップがはるかに簡単になっています。このチュートリアルは、Xcode バージョン 5 以降にはあまり関係ありません。
かなり時間がかかりましたが、ようやく自分のプロジェクトで機能させることができました。「ロジック」テストを作成するために、ロジック テストの作成に関する Apple のガイドラインに従いました。ロジック テストがビルド中に実行されることを理解すれば、これは問題なく機能します。
これらのテストをデバッグできるようにするには、それらのテストを呼び出すカスタム実行可能ファイルを作成する必要があります。Grokking Cocoa ブログの Sean Miceliによる記事には、これを行うためのすべての情報が記載されています。ただし、それに従ってもすぐに成功するわけではなく、微調整が必要でした。
Sean のチュートリアルに示されている主な手順を説明し、理解するのに時間がかかった「ダミー用」の概要を説明します。
- 単体テストを含むターゲットをセットアップしますが、実行しません
- テストを実行するために otest 実行可能ファイルをセットアップします
- otest 環境変数をセットアップして、otest が単体テストを見つけられるようにします。
以下はXCode 3.2.5で実行されました
XCode 4 に関する注意
XCode 4 では、単体テストを直接デバッグできます。テストを作成し、テストの 1 つとしてターゲットに追加し、ブレークポイントを設定するだけです。それで全部です。もっと来ます。
ステップ 1 - ターゲットの設定
- プロジェクトのターゲットの下にある単体テストのターゲットを複製します。これにより、単体テスト製品 (.octest ファイル) の複製も作成されます。下図の「LogicTest」が本来のターゲットです。
- 単体テスト ターゲットと単体テスト プロダクト (.octest ファイル) の両方の名前を同じ名前に変更します。下図の「LogicTestsDebug」が重複対象です。
- 新しいターゲットの RunScript フェーズを削除します
両方の名前は何でもかまいませんが、スペースは避けます。

ステップ 2 - otest のセットアップ
ここで最も重要な点は、正しい otest を取得することです。つまり、デフォルトの Mac バージョンではなく、現在の iOS 用のものです。これは、ショーンのチュートリアルで詳しく説明されています。以下に、物事を正しく設定するのに役立ついくつかの詳細を示します。
- Project->New Custom Executable に移動します。これにより、実行可能ファイル名と実行可能ファイルのパスを入力するよう求めるウィンドウが開きます。
- 名前は何でも入力してください。
- iOS otest 実行可能ファイルへのパスをコピーして貼り付けます。私の場合、これは /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk/Developer/usr/bin/otest でした
- 入力を押します。これにより、実行可能ファイルの構成ページが表示されます。
- この時点で変更する唯一のことは、「パス タイプ: 現在の SDK に相対」を選択することです。パスは入力しないでください。これは手順 3 で入力したものです。

ステップ 3 - otest 引数と環境変数の設定
otest の引数は簡単に設定できます... しかし、これが私の最大の問題であることが判明しました。私は当初、自分のロジック テスト ターゲットに「LogicTests Debug」という名前を付けていました。この名前と「LogicTests Debug.octest」(引用符付き) を otest の引数として使用すると、otest は終了コード 1 で終了し、コードに停止することはありません...
解決策: ターゲット名にスペースを入れないでください!
otest の引数は次のとおりです。
- -SenTest Self (または All またはテスト名 - ターミナルで man otest と入力してリストを取得)
- {LogicTestsDebug}.octest - {LogicTestsDebug} はロジック テスト バンドル名に置き換える必要があります。
コピー/貼り付け用の環境変数のリストは次のとおりです。
- 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"
- DYLD_LIBRARY_PATH: ${BUILD_PRODUCTS_DIR}:${DYLD_LIBRARY_PATH}
- DYLD_NEW_LOCAL_SHARED_REGIONS: はい
- DYLD_NO_FIX_PREBINDING: はい
DYLD_FORCE_FLAT_NAMESPACE も試しましたが、これは単純にクラッシュしました。

ステップ 4 - otest 実行可能ファイルの実行
otest 実行可能ファイルを実行してテストのデバッグを開始するには、次のことを行う必要があります。
- アクティブ ターゲットを単体テスト ターゲット (私の場合は LogicTestsDebug) に設定します。
- アクティブな実行可能ファイルを otest 実行可能ファイルに設定します
実行可能ファイルをビルドして実行し、ブレークポイントを使用してテストをデバッグできます。
補足として、otest 実行可能ファイルの実行に問題がある場合は、以下に関連している可能性があります。
- 間違ったパス。私は mac otest を指していたので、最初は多くの問題がありました。起動時に終了コード 6 でクラッシュし続けました。
- 間違った引数。バンドル (.octest) 名からスペースを削除するまで、終了コード 1 で otest がクラッシュし続けました。
- 環境変数のパスが間違っています。Sean のチュートリアルには、他の人が試したことについての洞察を提供するフォローアップの質問がたくさんあります。私が今持っているセットは機能しているように見えるので、これから始めることをお勧めします.
環境変数に問題があると思われるメッセージがコンソールに表示される場合があります。CFPreferences に関するメッセージが表示される場合があります。このメッセージは、テストの適切な実行を妨げているわけではないので、otest の実行に問題がある場合は、このメッセージに集中しないでください。

最後に、すべてが機能していれば、テストのブレークポイントで停止できます。

最後に一つだけ...
多くのブログで、統合された XCode SenTestKit の主な制限は、アプリケーションのビルド中にテストを実行できないことであると読みました。結局のところ、これは実際には非常に簡単に管理できます。アプリケーション プロジェクトへの依存関係としてロジック テスト バンドルを追加するだけです。これにより、ロジック テスト バンドルが確実にビルドされます。つまり、アプリケーションがビルドされる前に、すべてのテストが実行されます。
これを行うには、ロジック テスト バンドルをアプリケーション ターゲットにドラッグ アンド ドロップします。
