web-dev-qa-db-ja.com

単体テストの実行中にシミュレーターを起動しないでください

背景:

UnitTestsを実行するように構成されたターゲットを持つiOSアプリケーションがあります。そして、このアプリケーションを自動的にビルドし、すべてのテストを(コマンドラインのxcodebuildツールを使用して)実行するビルドオートメーションツールjenkinsをMacBookで実行しています。

Xcode 4ではすべてが正常に機能しました。このビルド自動化ツールは別のユーザーで実行され、これらすべてのテストを実行していました。

最近Xcode 5に切り替えましたが、シミュレータを起動できないため失敗し始めました。

問題

テスト(論理テスト)を実行するように構成されたスキームUnitTestsがあります。 A 2つの方法のいずれかを使用してこれらのテストを実行します。

  • XcodeのコマンドU

  • またはコマンドライン "/ usr/bin/xcodebuild -scheme UnitTests -sdk iphonesimulator -configuration Release clean clean TEST_AFTER_BUILD = YES"

どちらの場合も、シミュレーターを開始しようとします。しかし、私の理解によると、それはそれを必要としません。とにかくトップx86で実行され、シミュレーターにアプリがインストールされているようには見えません。

この厄介なシミュレーターの開始を取り除く方法はありますか(ビルドの自動化が中断されるため)?

アップデート1

非常によく似た質問を見つけたようですが、それを機能させることはできません: シミュレータを起動せずにXcode 4でロジックテストを実行します

更新2

非常に関連性のある興味深い質問/回答が見つかりました: Apple CI/Xcode Service and Jenkins

39
Victor Ronin

xCode 7とxCtoolを使用します。

xctoolは、シミュレータなしで単体テストを実行できます。

これを機能させるには、

1。ホストアプリなしで実行するようにターゲット設定を更新します。

プロジェクトを選択->次にテスト対象->ホストアプリケーションをnoneに設定します。

enter image description here

2。 xctoolがインストールされていない場合はインストールします。

brew install xctool

3。 xctoolでターミナルを使用してテストを実行します。

xctool -workspace yourWorkspace.xcworkspace -scheme yourScheme run-tests -sdk iphonesimulator
25
rustylepord

IOS単体テストの代わりにMac OSX単体テストを作成できます。ただし、ユニットテストにはiOS固有のライブラリを含めないでください。これは次の方法で実行できます。

  1. プロジェクトを選択->ターゲットドロップダウン->「ターゲットを追加...」
  2. [Mac OSX]-> [その他]-> [ココアユニットテストバンドル]を選択します
  3. 通常のプロジェクトと同じようにテストバンドルを作成します

単体テストにソースを追加して、シミュレータを起動せずにiOSテストのように実行できるようになりました。

16
Saltymule

同じ質問をAppleエンジニアに依頼しました。残念ながら、これを達成し、同時にiOSを使い続けることはできないようです。テストするかどうかを確認するためのいくつかのコツがありますこのコードスニペットをAppDelegate.hまたは他のグローバルクラスに配置して、ルートビューコントローラーをロードせず、wierdo uiがユニットテストを破損させないようにすることができます。

static BOOL isTesting() {
    BOOL isTesting = !isEmpty([[[NSProcessInfo processInfo] environment] objectForKey:@"XCInjectBundle"]);
    return isTesting;
}

また、Appleエンジニアがこれが正当なチェックであることを確認しました。クレジットが支払われるべき場所にクレジットを付与するため、これは次のとおりです。 またはテスト)iOSプロジェクト

EDIT:私もこれで成功しましたが、もう少し簡単です:

static BOOL isTesting() {
    return [[[NSProcessInfo processInfo] processName] isEqualToString:@"xctest"];
}
14
rfrittelli

どのソースファイルを含めるかを自分で管理する必要があるため、osxテストターゲットは非常に面倒になります。置く@testable import YourAppName XCTestファイルの上にある方が便利です。そのため、XCTestが実行された場合にアプリが起動しないようにします。

AppDelegateに以下を入力します:(Swift 3ソリューション)

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
{
    if ProcessInfo.processInfo.environment["XCInjectBundleInto"] != nil {
        return false
    } 

...

これにより、シミュレーターの起動が妨げられることはありませんが、時間を大幅に節約できます。

4
LimeRed

回避策:

アプリは引き続き起動しますが、#if実行したくないものを定義します。

アプローチ:

  1. Testを複製してDebugというカスタムビルド構成を作成します([プロジェクト]> [情報]> [新しい構成を作成])
  2. Build Settings> Active Compilation Conditions for Test add TESTING
  3. スキームの編集>情報>ビルド構成、ビルド構成をテストとして設定
  4. 使用する #if !TESTING#endifテスト時に実行したくないコードの周り。

フレームワーク:

組み込みフレームワークがある場合は、フレームワークバイナリが適切にリンクされるように、フレームワークで同じビルド構成を作成します。

1
user1046037

Xcode 9と端末からのコマンドを使用して、ヘッドレスモードでユニットテストとUIテストを実行できます。リファレンスサンプルコマンドの場合:

ワークスペースの構築とテスト

xcrun xcodebuild -workspace "YOUR_WORKSPACE_NAME.xcworkspace" -scheme "YOUR_SCHEME" -sdk "iphonesimulator12.0" -destination "OS=12.0,name=iPhone X" -configuration Debug -enableCodeCoverage YES clean build test

プロジェクト用

xcrun xcodebuild -project "YOUR_PROJECT_NAME.xcodeproj" -scheme "YOUR_SCHEME" -sdk "iphonesimulator12.0" -destination "OS=12.0,name=iPhone X" -configuration Debug -enableCodeCoverage YES clean build test
0
abdullahselek