由于应用程序测试现在可以在Xcode的模拟器上运行,除了可能节省很少的执行时间之外,还有什么优势可以将测试分成逻辑和应用程序测试?
根据Apple文档的区别:
逻辑测试.这些测试在洁净室环境中检查代码的正确功能; 也就是说,您的代码不会在应用程序中运行.逻辑测试允许您将非常具体的测试用例组合在一起,以非常精细的级别(类中的单个方法)或作为工作流的一部分(一个或多个类中的多个方法)来练习代码.您可以使用逻辑测试对代码执行压力测试,以确保它在正在运行的应用程序中不太可能发生的极端情况下正常运行.这些测试可帮助您生成可靠的代码,这些代码在您未预料到的方式使用时可正常工作.逻辑测试是基于iOS模拟器SDK; 但是,应用程序不在iOS模拟器中运行:正在测试的代码在相应的目标构建阶段运行.
应用测试.这些测试检查正在运行的应用程序中的代码功能.您可以使用应用程序测试来确保用户界面控件(插座和操作)的连接保持不变,并且在处理应用程序时控件和控制器对象可以与对象模型一起正常工作.由于应用程序测试仅在设备上运行,因此您还可以使用这些测试来执行硬件测试,例如获取设备的位置.
所以我在UISplitViewController的详细视图中有一个MyViewController实例.我正在运行单元测试以查看详细视图是否包含正确的视图类型.
我用以下方法在单元测试中测试控制器的类型:
[controller isKindOfClass:[MyViewController class]];
Run Code Online (Sandbox Code Playgroud)
但是,isKindOfClass方法始终返回NO
当我在调试器中调用对象时,我得到以下内容:
(gdb) po controller
<MyViewController: 0xb31c4d0>
Run Code Online (Sandbox Code Playgroud)
我也尝试了isMemberOfClass:方法,它产生了相同的结果.任何人都可以解释为什么会这样吗?
编辑:所以在阅读了Nick Weaver发布的文章后,我意识到我将我的应用程序的源文件包含在测试包的编译源构建阶段.这在日志中也表示类似于以下语句:
Class MyViewController is implemented in both /Users/jdoe/Library/Application Support/iPhone Simulator/4.3.2/Applications/670A077A-BAD8-4FA6-945A-851F33114CF5/MyApp.app/MyApp and /Users/jdoe/Library/Developer/Xcode/DerivedData/MyApp-drxyfejeattjwgantzesgensnlnx/Build/Products/Debug-iphonesimulator/MyAppTests.octest/MyAppTests. One of the two will be used. Which one is undefined.
Run Code Online (Sandbox Code Playgroud)
但是,当我从测试包的编译源构建阶段中删除源文件时,我会得到一个链接器错误,如下所示:
Undefined symbols for architecture i386:
"_OBJC_CLASS_$_MyViewController", referenced from:
objc-class-ref in _MyViewControllerTests.o
(maybe you meant: _OBJC_CLASS_$__MyViewControllerTests)
Run Code Online (Sandbox Code Playgroud) 我们正在寻找一种记录核心数据实体的方法.到目前为止,我提出的唯一真正的选择是:
选项1感觉太多额外的工作和几乎肯定会在99%的时间过时.
选项2比选项1更自然,更正确.这里最大的一点是,如果使用Xcode重新生成此模型类,那些注释可能会丢失.
选项3感觉不如选项2更正确,但具有增加元数据提取自动化可能性的附加优势.例如,在我们的某个应用程序中,我们需要密切关注我们在设备上本地存储的内容以及同步到iCloud.使用用户信息字典,可以很容易地自动创建某种形式的人工制品,可以在内部和外部(由客户)检查是否合规
所以我的问题是,为此目的使用用户信息字典是否不合适?我还缺少其他选择吗?
我在App Store上被拒绝在我的应用程序中使用私有实例变量.我应该使用的ivars绝对不能在我的代码中访问,但我使用的是来自第三方的一个或两个静态库.我如何测试这些实际上是否真的是罪犯?
更新:
Apple指责我(和第三方库)在UITouch类中使用私有实例变量,包括
无论如何,我可以查看应用程序以字节为单位创建的文件的大小,然后存储该号码以便以后使用?或者有什么方法我可以判断一个NSArray中的对象是否为空,我已经尝试了一切,但它只是不起作用!
我正在iPhone SDK 3.1.3上尝试多线程核心数据实现.我为每个线程有两个不同的NSManagedObjectContext对象,我正在一个线程上注册更改通知,如下所示:
- (void)setup {
DLog(@"Registering for NSManagedObjectContext notifications");
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(test:) name:@"NSManagedObjectContextWillSaveNotification" object:nil];
[nc addObserver:self selector:@selector(test:) name:@"NSManagedObjectContextDidSaveNotification" object:nil];
[nc addObserver:self selector:@selector(test:) name:@"NSManagedObjectContextObjectsDidChangeNotification" object:nil];
}
- (void)test:(NSNotification *)notif {
DLog(@"Test callback");
}
Run Code Online (Sandbox Code Playgroud)
在我的另一个线程中,我保存第二个上下文,如下所示:
NSError *error = nil;
[managedObjectContext save:&error];
if (error) {
ALog(@"Error occured while trying to save a NewsStory object");
}
else {
DLog(@"Saving context");
}
Run Code Online (Sandbox Code Playgroud)
通知回调方法永远不会执行,这让我相信这些通知永远不会发布?
我的日志显示以下内容:
Registering for NSManagedObjectContext notifications
Saving context
...
Saving context
Run Code Online (Sandbox Code Playgroud) cocoa ×3
cocoa-touch ×3
iphone ×3
core-data ×2
objective-c ×2
unit-testing ×2
xcode4 ×2
debugging ×1
file ×1
nsarray ×1
nsdata ×1
xcode ×1