web-dev-qa-db-ja.com

XCode 5単体テスト:アプリを起動します

XCode 5でテストを実行すると、テストの実行中にOS Xアプリのメインウィンドウが数秒間画面に表示されます。どうして?すべてのテストのコメントを外しても、メインウィンドウが開きます。

32
dhrm

ロジックテストではなく、アプリケーションテストを実行しています。つまり、アプリのインスタンスが開始され、単体テストが実行されます。これにより、アプリの実行が必要な統合テストを実行できます。

ここ は、アプリケーションテストとロジックテストをセットアップするためのガイドです。

ロジックテストに変更する場合(より速く実行し、最初にアプリを起動する必要はありません):

  1. 単体テストターゲットの設定を作成します
  2. 検索Bundle
  3. バンドルローダーとテストホストの削除

enter image description here

37
Bryan Chen

そうです、ビルド設定から「バンドルローダー」と「テストホスト」を削除する必要があります。

ただし、単体テストターゲットに必要な実装ファイルを追加する必要があります。必要なファイルは、ユニットテストケースで使用するものです。ロジックテストではXCodeがアプリケーション全体をコンパイルしないため、これを行う必要があります。そのため、ファイルの一部が失われます。

これは、ファイルを削除した場合のエラーメッセージです。

Undefined symbols for architecture i386:
  "_OBJC_CLASS_$_Module", referenced from:
      objc-class-ref in Lobic Network.o
      objc-class-ref in Logic_Unit.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

実装ファイルを選択し、ファイルインスペクターを表示することで、不足しているファイルを追加できます。 「Target Membership」という名前のセクションがあり、そこにファイルのターゲットメンバーシップをユニットテストにも設定できます。

10
Szasza

XCTestでは、アプリケーションファイルはNOTをXCTestターゲットに含める必要があります。 XCTestバンドルは、実行時にこれらのファイルを使用可能にするアプリケーションにリンクされます。

これを機能させるには、コンパイラオプション "Symbolsデフォルトで非表示"が[〜#〜] no [〜#〜]に設定されていることを確認しますアプリケーションターゲット内。

わかりやすくするためのスクリーンショット付きのブログ投稿を次に示します。 http://zmcartor.github.io/code/2014/02/24/slim-xctest-targets

このアプローチの利点は、テストターゲットのビルドがはるかに高速になることです。

9
HackaZach

XCode 7では、Host Applicationを削除しても機能しません。実際、アプリの実行を避けるために以下を使用します。

  1. テストスキーム引数のセットアップ enter image description here

  2. main.m

    static bool isRunningTests()
    {
        NSDictionary* environment = [[NSProcessInfo processInfo] environment];
        NSString* testEnabled = environment[@"TEST_ENABLED"];
        return [testEnabled isEqualToString:@"YES"];
    }
    
  3. main()を変更します

    int main(int argc, char * argv[]) {
        @autoreleasepool {
            if (isRunningTests()) {
                return UIApplicationMain(argc, argv, nil, nil);
            } else {
                return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
            }
        }
    }
    
4
Nicholas Ng

テストがデスクトップおよびモバイルで実行できるコード用である場合、シミュレータなしで実行したり、アプリ内でホストしたりできます。

問題は、通常のターゲット(デスクトップまたはiOS)のスキームセレクターを使用してテストを実行できないことです。

Xcode6では次のことがうまくいきました。

File > New Target...

OS XカテゴリからCocoa Testing Bundleを選択します。

enter image description here

ターゲットのドロップダウンからNoneを選択するよう注意してください。

Specify new test target

完了をクリックします。上記の説明に従って、関連するファイルを新しいターゲットに追加します。

次に、テストを実行するスキームを作成します。

スキームチューザーの右上をクリックして、[New Scheme...、ドロップダウンをクリックして、リストを下に移動して新しいターゲットに移動します。これで、スキーム選択からスキームを選択し、⌘Uを使用してテストを実行できます。

enter image description here

2
Sez

これで朝を無駄にしました。

プロジェクトはXCode 4で作成され、SenTestingを使用しました。

XCode 5/XCTTestでテストの移行を試みました

同じ問題がありました-アプリはシミュレータで実行され、すべてを試してもテストが開始されませんでした(アプリからロジックテストへの変更、XCTestへの変更、SenTestingの削除)

あきらめて、きれいなXCode 5プロジェクトを作成しました。

すべてのファイルを追加し、テストは正常に実行されました。

これらはXCode 4で構築されたため、ストーリーボードにまだ問題がある場合があります。

抜本的ですが機能するので、最後の手段として保管してください。

1
brian.clear

XCode5では、アプリが起動します。この回答は、ユニットテストを実行するときにデリゲートを変更してすぐに終了する方法を示しています: https://stackoverflow.com/a/20588035/239408

1
xverges