2016-05-06 11 views
1

Ich versuche, Xcode UI-Tests über die Befehlszeile auf einem Jenkins-Computer auszuführen, die auf meinem lokalen Computer funktionieren. Wenn ich jedoch versuche, die UI-Tests in Jenkins auszuführen, scheinen sie die App im Simulator nicht zu starten. Was passiert, wenn das Gerät im Simulator geladen wird, öffnet sich das UI-Testziel und der Bildschirm wird schwarz. Dann nichts für 30 Sekunden zu passieren scheint, bis ich einen Fehler wie folgt (erwarte ich, dass die App zu starten und die Automatisierung beginnen):Kann Xcode (7.3) UI-Tests in Jenkins nicht ausführen

2016-04-22 11:44:54.549 XCTRunner[33303:299557] Running tests... 
11:44:54.707 XCTRunner[33303:299590] _XCT_testBundleReadyWithProtocolVersion:minimumVersion: reply received 
11:44:54.711 XCTRunner[33303:299587] _IDE_startExecutingTestPlanWithProtocolVersion:16 
2016-04-22 11:45:24.730 XCTRunner[33303:299557] *** Assertion failure in void _XCTFailInCurrentTest(NSString *, ...)(), /Library/Caches/com.apple.xbs/Sources/XCTest_Sim/XCTest-10112/XCTestFramework/Classes/XCTestCase.m:63 
2016-04-22 11:45:24.732 XCTRunner[33303:299557] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '_XCTFailInCurrentTest should only be called while a test is running. 
Failure description: Failed to receive completion for <XCDeviceEvent:0x7f88c85972c0 page 12 usage 64 duration 0.01s within 30.0s' 
*** First throw call stack: 
(
    0 CoreFoundation      0x0000000102369d85 __exceptionPreprocess + 165 
    1 libobjc.A.dylib      0x0000000101ddddeb objc_exception_throw + 48 
    2 CoreFoundation      0x0000000102369bea +[NSException raise:format:arguments:] + 106 
    3 Foundation       0x0000000101a27e1e -[NSAssertionHandler handleFailureInFunction:file:lineNumber:description:] + 169 
    4 XCTest        0x0000000101875bbf _XCTFailInCurrentTest + 375 
    5 XCTest        0x000000010189717c -[XCUIDevice _dispatchEventWithPage:usage:duration:] + 847 
    6 XCTest        0x00000001018c2612 XCInitializeForUITesting + 575 
    7 XCTest        0x000000010186191d -[XCTestDriver _runSuite] + 141 
    8 XCTest        0x00000001018627d1 -[XCTestDriver _checkForTestManager] + 259 
    9 XCTest        0x00000001018aca9a _XCTestMain + 628 
    10 CoreFoundation      0x000000010228f2ec __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12 
    11 CoreFoundation      0x0000000102284f75 __CFRunLoopDoBlocks + 341 
    12 CoreFoundation      0x00000001022846d2 __CFRunLoopRun + 850 
    13 CoreFoundation      0x00000001022840f8 CFRunLoopRunSpecific + 488 
    14 GraphicsServices     0x0000000104424ad2 GSEventRunModal + 161 
    15 UIKit        0x000000010271ff09 UIApplicationMain + 171 
    16 XCTRunner       0x00000001017e68ad XCTRunner + 6317 
    17 libdyld.dylib      0x0000000104c4692d start + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
Build step 'Execute shell' marked build as failure 
Finished: FAILURE 

Könnte die App nicht bestanden beginnen, weil meine Jenkins Maschine kann nicht Öffnen Sie es schnell genug, bevor Xcode implizit den Test nicht besteht? Oder könnte es eine Benachrichtigung geben, die das Starten der App blockiert?

Antwort

1

Was passiert, ist, dass XCTest versucht, Home Button Press Event an das Gerät zu senden, aber keine Benachrichtigung für den Abschluss für 30 Sekunden erhalten.

Ich glaube nicht, dass es etwas mit einer Benachrichtigung UIAlertView Blockierung der Home-Schaltfläche aus dem Senden des Testziels in den Hintergrund zu tun, da ein solches Problem nach meiner Erfahrung eine andere Fehlermeldung ("Failed to background test runner within ...") auslöst.

Ich bin nicht vertraut mit der Jenkins-Lösung, aber wenn Sie vermuten, dass die Zeitüberschreitung zu kurz ist, können Sie versuchen, es wie folgt zu ändern (einige hacky Weise fand ich).

Fügen Sie die folgenden Zeilen zu einem Code, der [XCTestDriver _runSuite] früher dann ausgeführt wird (zum Beispiel Ihre eigene __attribute__((constructor)) Funktion hinzufügen und diesen Code setzen innen):

extern __attribute__((weak)) void* _XCTSetEventConfirmationTimeout(NSTimeInterval); 
// Change the default 30 seconds timeout. 
long MY_NEW_EC_TIMEOUT = 120; 
NSLog(@"Trying to call _XCTSetEventConfirmationTimeout(%ld)", MY_NEW_EC_TIMEOUT); 
if (&_XCTSetEventConfirmationTimeout) { 
    NSLog(@"_XCTSetEventConfirmationTimeout address found"); 
    _XCTSetEventConfirmationTimeout(MY_NEW_EC_TIMEOUT); 
    NSLog(@"_XCTSetEventConfirmationTimeout successfully called"); 
} else { 
    NSLog(@"_XCTSetEventConfirmationTimeout address not found"); 
}