背景:
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
xCode 7とxCtoolを使用します。
xctoolは、シミュレータなしで単体テストを実行できます。
これを機能させるには、
1。ホストアプリなしで実行するようにターゲット設定を更新します。
プロジェクトを選択->次にテスト対象->ホストアプリケーションをnoneに設定します。
2。 xctoolがインストールされていない場合はインストールします。
brew install xctool
3。 xctoolでターミナルを使用してテストを実行します。
xctool -workspace yourWorkspace.xcworkspace -scheme yourScheme run-tests -sdk iphonesimulator
IOS単体テストの代わりにMac OSX単体テストを作成できます。ただし、ユニットテストにはiOS固有のライブラリを含めないでください。これは次の方法で実行できます。
単体テストにソースを追加して、シミュレータを起動せずにiOSテストのように実行できるようになりました。
同じ質問を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"];
}
どのソースファイルを含めるかを自分で管理する必要があるため、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
}
...
これにより、シミュレーターの起動が妨げられることはありませんが、時間を大幅に節約できます。
アプリは引き続き起動しますが、#if
実行したくないものを定義します。
Test
を複製してDebug
というカスタムビルド構成を作成します([プロジェクト]> [情報]> [新しい構成を作成])Build Settings
> Active Compilation Conditions
for Test
add TESTING
#if !TESTING
#endif
テスト時に実行したくないコードの周り。組み込みフレームワークがある場合は、フレームワークバイナリが適切にリンクされるように、フレームワークで同じビルド構成を作成します。
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