2013-08-08 22 views
30

Einige Hintergrund laufen:nicht Simulator starten, wenn Unittests

Ich habe iOS-Anwendung mit einem Ziel konfiguriert laufen Unittests. Und ich benutze Build-Automation-Tool jenkins auf meinem MacBook, die automatisch diese Anwendung erstellt und alle Tests (mit der Befehlszeile xcodebuild-Tool) ausführen.

Alles funktionierte mit Xcode 4. Dieses Build-Automatisierungstool wurde unter verschiedenen Benutzern ausgeführt und führte alle diese Tests aus.

Ich wechselte vor kurzem zu Xcode 5 und es begann zu scheitern, weil es Simulator nicht starten kann.

Das Problem

I ein Schema Unittests haben, die Tests (Logiktests) auszuführen konfiguriert ist. AI laufen diese Test eine von zwei Methoden:

  • Befehl U in Xcode

  • oder Befehlszeile „/ usr/bin/xcodebuild -Schema Unittests -SDK iphonesimulator -Konfiguration Lösen sauber build TEST_AFTER_BUILD = YES "

In beiden Fällen wird versucht, den Simulator zu starten. Aber nach meinem Verständnis braucht es das nicht. Jedenfalls läuft es auf x86 und es sieht nicht so aus, als ob irgendwelche Apps auf dem Simulator installiert sind.

Gibt es eine Möglichkeit, diesen lästigen Simulator Start loszuwerden (weil es meine Build-Automatisierung bricht)?

Update 1

scheint sehr ähnliche Frage zu finden, aber nicht bekommen kann es funktioniert: Run logic tests in Xcode 4 without launching the simulator

Update 2

ich sehr relevant und interessante Frage gefunden/Antwort : Apple CI/Xcode Service and Jenkins

+0

Diese Frage könnte auch helfen. Die Schritte sollten für eine iOS-App ungefähr gleich sein. http://stackoverflow.com/questions/19219706/xcode-5-unit-testing-starts-my-app –

+0

@CleverError: Danke. Ich werde es mir ansehen. –

+0

Warum willst du den Simulator nicht laufen lassen? – quellish

Antwort

12

Sie können einen Mac OSX Unit Test statt eines erstellen n iOS-Komponententest. Dazu müssen Sie jedoch keine iOS-spezifischen Bibliotheken in die Komponententests einschließen. Sie können dies über das folgende:

  1. Wählen Sie das Projekt -> das Ziel Dropdown -> "Ziel speichern ..."
  2. Wählen Sie "Mac OSX" -> "Andere" -> „Cocoa Einheit Testing Bundle“
  3. erstellen Sie das Testpaket als würden Sie ein normales Projekt

Sie jetzt Quellen an das Gerät zu testen und führen Sie es wie ein iOS-Test ohne Start des Simulators hinzufügen können.

+2

Das ist die Richtung, in die ich mich jetzt bewege. Allerdings sind iOS und OS X nicht genau die gleichen Betriebssysteme (insbesondere unter Berücksichtigung aller Unterschiede zwischen Frameworks) –

13

Ich habe die gleiche Frage an Apple-Ingenieure gestellt. Leider scheint es so, als könnten Sie das nicht schaffen und gleichzeitig bei iOS bleiben. Es gibt einige Tricks, die Sie tun können, um zu überprüfen, ob Tests durchgeführt werden. Sie könnten dieses Code-Snippet in Ihr AppDelegate einfügen.h oder eine andere globale Klasse zu sagen, nicht eine Wurzel Viewcontroller laden und jede wierdo ui Sachen verhindern, dass die Komponententests korrumpieren:

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

Ich habe auch ein Apfel Ingenieur überprüfen dies eine legitime Kontrolle ist. Und Kredit zu geben, wem Ehre gebührt, ist dies aus: Programmatically determine current target (run or test) in iOS project

EDIT: Ich habe auch Erfolg mit diesem und es ist ein wenig mehr einfach:

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

ich vermute ich, dass Sie möchten, zu tun: return isTesting; Im Gegensatz zu "Return NO;" –

+0

Ja, tut mir leid. Code aus einem Projekt eingefügt und nicht aufgepasst! – rfrittelli

+0

Das ist eine interessante Lösung! – LightningStryk

16

Mit xCode 7 und xCtool.

xctool kann Komponententests ohne den Simulator ausführen.

diese Funktion zu erhalten,

1. Aktualisieren Sie die Zieleinstellungen so, dass sie ohne eine Host-App ausgeführt werden.

Wählen Sie Ihr Projekt -> dann Ziel testen -> Setzen Sie die Host-Anwendung auf keine.

enter image description here

2. Installieren Sie xctool, wenn Sie es nicht haben.

brew install xctool 

3. Führen Sie die Tests mit xctool mit Terminal.

xctool -workspace yourWorkspace.xcworkspace -scheme yourScheme run-tests -sdk iphonesimulator 
+1

Sie können Linker-Fehler mit Klassen, die nicht im Testpaket nicht verfügbar ist, auftreten, lösen Sie sie, um dies funktioniert. – rustylepord

+0

Das ist seltsam. Die Dokumentation von xctool besagt [Wenn Sie xctool in der kontinuierlichen Integration ausführen, muss das Benutzerkonto, das xctool aufruft, über einen aktiven GUI-Kontext verfügen. Wenn nicht, kann der Simulator nicht mit kryptischen Warnungen beginnen (https://github.com/facebook/xctool). –

1

A osx Testziel kann ein riesiger Aufwand, weil Sie selbst verwalten müssen, die Quelldatei aufzunehmen. Putting @testable import YourAppName auf Ihre XCTest-Dateien ist viel bequemer. Verhindern Sie also, dass Ihre App im Falle eines XCTest-Laufs gestartet wird.

In Ihrem AppDelegate setzen: (Swift 3 -Lösung)

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

... 

Dies wird nicht den Simulator verhindern, starten, aber Sie werden eine Menge Zeit sparen.

+0

Ich verstehe es nicht, wenn es den Simulator nicht davon abhält zu starten, wie ist das eine Antwort auf die Frage? – smileBot

0

Umgehung:

App noch starten, aber Sie können #if definieren, was Sie wollen nicht laufen.

Ansatz:

  1. eine benutzerdefinierte Build-Konfiguration Test durch Duplizieren Debug genannt erstellen (Projekt> Info> neue Konfiguration erstellen)
  2. In Build Settings>Active Compilation Conditions für TestTESTING
  3. Schema bearbeiten> Info hinzufügen> Konfiguration erstellen, Build-Konfiguration als Test setzen
  4. Verwenden Sie #if !TESTING#endif um die c ode, die Sie beim Testen nicht ausführen möchten.

Frameworks:

Wenn Sie Embedded-Frameworks haben, erstellen Sie die gleiche Build-Konfiguration im Rahmen, so dass der Rahmen binär richtig verbunden ist.

Verwandte Themen