ios - 使用 Xcode 7.2 录制时 XCUITest 崩溃

标签 ios iphone xcode xcode-ui-testing

我正在使用 Xcode 7.2 尝试新的 iOS UI 测试框架。

我遵循了一些教程并观看了 Apple 的演示视频,并尝试记录一些测试用例。当目标是“模拟器”时,第一次测试成功了。当我尝试在真实设备中重复这些步骤时,Xcode 在启动应用程序后立即崩溃。我用了iPhoneCoreDataRecipes来自 Apple 的演示应用程序,以便开始使用简单且“经过验证”的东西。

下面是一个简单的测试类:

#import <XCTest/XCTest.h>

@interface RecipesUITests : XCTestCase

@end

@implementation RecipesUITests

- (void)setUp {
    [super setUp];

    // Put setup code here. This method is called before the invocation of each test method in the class.

    // In UI tests it is usually best to stop immediately when a failure occurs.
    self.continueAfterFailure = NO;
    // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
    [[[XCUIApplication alloc] init] launch];

    // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
}

- (void)tearDown {
    // Put teardown code here. This method is called after the invocation of each test method in the class.
    [super tearDown];
}

- (void)testExample {
    // Use recording to get started writing UI tests.
    // Use XCTAssert and related functions to verify your tests produce the correct results.


    XCUIApplication *app = [[XCUIApplication alloc] init];
    [app.navigationBars[@"Recipes"].buttons[@"Add"] tap];
    [app.textFields[@"Recipe Name"] typeText:@"Lef"];
    [app.navigationBars[@"Add Recipe"].buttons[@"Save"] tap];

    XCUIElementQuery *tablesQuery = app.tables;
    XCUIElement *descriptionTextField = tablesQuery.textFields[@"Description"];
    [descriptionTextField tap];
    //[descriptionTextField tap];
    //[descriptionTextField tap];

    XCUIElement *lefNavigationBar = app.navigationBars[@"Lef"];
    [lefNavigationBar.buttons[@"Edit"] tap];

    XCUIElement *overviewTextField = tablesQuery.textFields[@"Overview"];
    [overviewTextField tap];
    //[overviewTextField typeText:@"Lef2"];
    [lefNavigationBar.buttons[@"Done"] tap];
    [lefNavigationBar.buttons[@"Recipes"] tap];


}

这是一个已知问题吗?关于如何调试问题有什么想法吗?我需要“以某种方式”来启用该设备吗?

更新#1

当我尝试在设备中运行测试用例时,我在 Xcode 中收到一些日志。

2016-01-19 13:18:36.772 XCTRunner[9331:2287347] Running tests...
2016-01-19 13:18:36.776 XCTRunner[9331:2287347] Looking for test bundles in /var/mobile/Containers/Bundle/Application/42229178-A3D8-4BB1-A4CD-7E2FC28E90F9/RecipesUITests-Runner.app/PlugIns
2016-01-19 13:18:36.778 XCTRunner[9331:2287347] Found test bundle at /var/mobile/Containers/Bundle/Application/42229178-A3D8-4BB1-A4CD-7E2FC28E90F9/RecipesUITests-Runner.app/PlugIns/RecipesUITests.xctest
2016-01-19 13:18:36.780 XCTRunner[9331:2287347] Looking for configurations in /var/mobile/Containers/Bundle/Application/42229178-A3D8-4BB1-A4CD-7E2FC28E90F9/RecipesUITests-Runner.app/PlugIns/RecipesUITests.xctest
2016-01-19 13:18:36.784 XCTRunner[9331:2287347] Found configuration <XCTestConfiguration: 0x145e317d0>
                      testBundleURL:file:///Users/unifyit/Downloads/iPhoneCoreDataRecipes_3/Build/Products/Debug-iphoneos/RecipesUITests-Runner.app/PlugIns/RecipesUITests.xctest/
                  productModuleName:RecipesUITests
                        testsToSkip:(null)
                         testsToRun:RecipesUITests/testExample
                 reportResultsToIDE:YES
                  sessionIdentifier:<__NSConcreteUUID 0x145e235a0> DD878763-999D-467F-968D-599B82EC5651
         pathToXcodeReportingSocket:(null)
          disablePerformanceMetrics:no
    treatMissingBaselinesAsFailures:no
                    baselineFileURL:(null)
              targetApplicationPath:/Users/unifyit/Downloads/iPhoneCoreDataRecipes_3/Build/Products/Debug-iphoneos/Recipes.app
          targetApplicationBundleID:com.example.apple-samplecode.Recipes
                   reportActivities:YES
           testsMustRunOnMainThread:YES
***** Begin XCTest Status Log *****
***** End XCTest Status Log *****

看起来没有任何反应,没有执行测试用例,Xcode 尝试加载应用程序,但显示黑屏。

此外,当我尝试重新编码 Xcode 时,会出现以下崩溃:

Crashed Thread:        0  Dispatch queue: com.apple.main-thread

Exception Type:        EXC_CRASH (SIGABRT)
Exception Codes:       0x0000000000000000, 0x0000000000000000
Exception Note:        EXC_CORPSE_NOTIFY

Application Specific Information:
ProductBuildVersion: 7C68
ASSERTION FAILURE in /Library/Caches/com.apple.xbs/Sources/IDEFrameworks/IDEFrameworks-9548/IDEKit/Testing/IDEUIRecordingManager.m:429
Details:  (result) should not be nil.
Object:   <IDEUIRecordingManager: 0x7fb40190c640>
Method:   -_workspaceTabController
Thread:   <NSThread: 0x7fb3fb519b00>{number = 1, name = main}
Hints:   None
Backtrace:
  0  0x0000000103e541fa -[IDEAssertionHandler handleFailureInMethod:object:fileName:lineNumber:assertionSignature:messageFormat:arguments:] (in IDEKit)
  1  0x00000001029e4761 _DVTAssertionHandler (in DVTFoundation)
  2  0x00000001029e4978 _DVTAssertionFailureHandler (in DVTFoundation)
  3  0x0000000103f3256b -[IDEUIRecordingManager _workspaceTabController] (in IDEKit)
  4  0x0000000103f33433 __94-[IDEUIRecordingManager _startRecordingWithLaunchSession:alwaysAskForAPIAccess:reservedNames:]_block_invoke_2 (in IDEKit)
  5  0x0000000102a20a04 __DVTDispatchAsync_block_invoke (in DVTFoundation)
  6  0x00007fff8c97d8f5 _dispatch_call_block_and_release (in libdispatch.dylib)
  7  0x00007fff8c9723c3 _dispatch_client_callout (in libdispatch.dylib)
  8  0x00007fff8c985c1b _dispatch_main_queue_callback_4CF (in libdispatch.dylib)
  9  0x00007fff986ac999 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ (in CoreFoundation)
 10  0x00007fff9866b9cd __CFRunLoopRun (in CoreFoundation)
 11  0x00007fff9866afc8 CFRunLoopRunSpecific (in CoreFoundation)
 12  0x00007fff8a5ead55 RunCurrentEventLoopInMode (in HIToolbox)
 13  0x00007fff8a5eab8f ReceiveNextEventCommon (in HIToolbox)
 14  0x00007fff8a5ea9cf _BlockUntilNextEventMatchingListInModeWithFilter (in HIToolbox)
 15  0x00007fff93319d96 _DPSNextEvent (in AppKit)
 16  0x00007fff933191c5 -[NSApplication _nextEventMatchingEventMask:untilDate:inMode:dequeue:] (in AppKit)
 17  0x0000000102fc00c2 -[DVTApplication nextEventMatchingMask:untilDate:inMode:dequeue:] (in DVTKit)
 18  0x00007fff9330dd28 -[NSApplication run] (in AppKit)
 19  0x00007fff932d6fbe NSApplicationMain (in AppKit)
 20  0x00007fff8fec85ad start (in libdyld.dylib)

abort() called

最佳答案

我在黑暗中拍摄的最佳照片:

IOS 8 ENHANCEMENT

iOS 8 includes a new Enable UI Automation preference under Settings > Developer, which allows third-party developers finer control of when their devices are available to perform automation. For physical iOS devices, this setting is off by default and must be enabled prior to performing any UI Automation. In the simulator, the setting is enabled by default.

Source

除了更明显的要求(ios9 目标、10.10/11 等)之外,该文档还列出了许多其他要求和链接,您可能会发现对引用有帮助。

关于ios - 使用 Xcode 7.2 录制时 XCUITest 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34856924/

相关文章:

iOS:当分段控件更改时隐藏或删除以编程方式添加的 subview

iphone - iPad视频播放仅提供音频,不提供视觉效果

iphone - 我应该使用核心动画制作三点加载动画,还是应该找到一种方法来显示相同​​操作的 gif?

iphone - 编写通用 XML 解析器

xcode - 隐藏一个 Outlet Collections 对象

ios - 具有自动布局的典型 UITableViewCell

ios - Flutter Firebase_Admob "The Google Mobile Ads SDK requires a deployment target of iOS 8.0 or later."iOS 错误

ios - 无法在 xcode 5 中更改应用程序的名称

ios - 更新到Xcode 5后的新警告

ios - Stripe iOS SDK - 发送不兼容的 block 指针类型