我正在尝试对为Mac OS编写的命令行工具进行单元测试.
当我第一次创建项目时,XCode不会在项目导航器中生成测试组.当我尝试添加新的测试目标时,它不会让我选择将我的目标指定为"要测试的目标".
我的问题是:甚至可以将XCTest用于命令行工具项目吗?或者,由于我可以从命令行运行它,这只是被认为是微不足道的?我能理解这个推理,但我确实想测试内部功能.
我正在尝试调试我不知道原因的崩溃。不幸的是,我所拥有的只是我从 Crashlytics 中检索到的堆栈跟踪,并且几乎找不到我的应用程序导致这种情况发生的证据,因此很遗憾我无法提供任何具体的代码示例,我在这里发布纯粹是希望之前有人遇到过这种情况。
我在通过 Crashlytics 收集的所有相关崩溃堆栈跟踪中看到,它在名为“com.apple.avkit.seekQueue”的线程上崩溃。输出如下所示:
Crashed: com.apple.avkit.seekQueue
0 libobjc.A.dylib 0x18c3e17f4 objc_object::release() + 8
1 libsystem_blocks.dylib 0x18c86fa68 _Block_release + 160
2 libdispatch.dylib 0x18c81a9a0 _dispatch_client_callout + 16
3 libdispatch.dylib 0x18c828ad4 _dispatch_queue_serial_drain + 928
4 libdispatch.dylib 0x18c81e2cc _dispatch_queue_invoke + 884
5 libdispatch.dylib 0x18c828fa8 _dispatch_queue_override_invoke + 344
6 libdispatch.dylib 0x18c82aa50 _dispatch_root_queue_drain + 540
7 libdispatch.dylib 0x18c82a7d0 _dispatch_worker_thread3 + 124
8 libsystem_pthread.dylib 0x18ca23100 _pthread_wqthread + 1096
9 libsystem_pthread.dylib 0x18ca22cac start_wqthread + 4
Run Code Online (Sandbox Code Playgroud)
由于 Crashlytics,我看到的例外是 EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0000000000000020。由此我只能假设有一个 AVPlayer 对释放或受限的内存地址做了一些事情,但堆栈跟踪没有显示除主线程中的 main.m 之外的任何其他进入我的应用程序的入口点。
FWIW,Crashlytics 还建议以下内容:
堆栈跟踪表明堆损坏可能导致您的应用程序崩溃。释放悬空指针、线程竞争或错误的指针算法很容易导致内存损坏。要记住的重要一点是,最终的崩溃可能发生在初始损坏之后很久。因此,此崩溃的堆栈跟踪可能无法提供有关代码中错误位置的任何线索。 …
我开始尝试使用EarlGrey一点点,现在已经使用XCUITest进行了UI测试.我遇到了无法解除系统警报的经典问题,这很奇怪,因为看起来Google实现了一个名为grey_systemAlertViewShown()的系统警报匹配器.我正在尝试使用GREYCondition检测系统警报.这是我尝试过的:
- (void)waitForAndDismissSystemAlertForSeconds:(NSInteger)seconds {
GREYCondition *interactableCondition = [GREYCondition conditionWithName:@"isInteractable" block:^BOOL{
// Fails if element is not interactable
NSError *error;
[[EarlGrey selectElementWithMatcher:grey_systemAlertViewShown()] assertWithMatcher:grey_interactable() error:&error];
if (error) {
return NO;
} else {
NSError *allowButtonError;
[[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"Allow")] assertWithMatcher:grey_notNil() error:&allowButtonError];
if (!allowButtonError) {
[[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"Allow")] performAction:grey_tap()];
}
return YES;
}];
[interactableCondition waitWithTimeout:seconds];
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用这里描述的addUIInterruptionMonitorWithDescription(但是使用EarlGrey代码来完成我在上面的中断监视器中所做的事情):Xcode 7 UI测试:如何在代码中解除一系列系统警报
两种方法都不奏效.我的GREYCondition中的非错误情况不会触发断点,并且中断监视器也不会解除我的警报.
有人知道EarlGrey是否支持解雇系统警报?
我想在日志中添加一条消息,其中包含即将运行的测试方法的名称。我想在我的测试超类的setUp方法中执行此操作,因此不必到处重复代码。
我想做这样的事情:
- (void) setUp {
[super setUp];
[self log:@NSStringFromSelector(_cmd)];
}
Run Code Online (Sandbox Code Playgroud)
但是,_cmd始终将“ setUp”作为其字符串,而我想要“ test00TestTheThing”
有没有办法做到这一点?
我正在尝试通过命令行将值传递给我的 XCUITest。我知道可以通过以下方式为 XCTest(非 UI)执行此操作:
xcodebuild -verbose test -workspace MyWorkspace.xcworkspace -衍生数据路径衍生数据 -scheme "MyScheme" -configuration Debug SYMROOT="$(pwd)"/build -destination platform="iOS Simulator",name="iPad Air",OS=10.2 -仅测试:UITests/UITests -resultBundlePath 日志文件 MY_SETTING="setting_value" MY_OTHER_SETTING="setting_value_2"
然而,这似乎在我的 XCUITest 中不起作用,因为代码没有进入 #ifdef MY_SETTING 块。是否有另一种方法可以通过命令行将值传递给我的 XCUITest,或者这是不可能的?
xcode ×4
ios ×3
xctest ×2
avkit ×1
debugging ×1
earlgrey ×1
macos ×1
objective-c ×1
ui-testing ×1