我知道如何解决EXC_BAD_ACCESS问题,但我不确定如何对它进行单元测试.有没有办法在代码中捕获EXC_BAD_ACCESS而不是简单地崩溃?
这就是我问的原因:我编写了一个大量使用块的库,如下所示:
- (void)doSomething:(void (^)())myBlock;
Run Code Online (Sandbox Code Playgroud)
在我的实现中,doSomething:我将最终运行块,如下所示:
myBlock();
Run Code Online (Sandbox Code Playgroud)
如果调用者为块传递nil,那么它将崩溃EXC_BAD_ACCESS,因此解决方案是检查该块是否存在,如下所示:
if (myBlock) {
myBlock();
}
Run Code Online (Sandbox Code Playgroud)
这个零检查很容易忘记,所以我想要一种方法来编写在崩溃发生时失败的单元测试.我认为崩溃可能被视为测试失败,但我认为对于其他试图运行测试以查看错误消息而不是崩溃的人来说会更好.有任何想法吗?
是否可以将Jenkins与XCTest一起使用?
有一个ruby脚本(OCUnit2JUnit - https://github.com/ciryon/OCUnit2JUnit),它解析OCUnit输出并创建Jenkins可以解析的XML文件.
有没有相当于处理新的XCTest输出的东西?
目前,使用Apple的持续集成是不可能的.
我无法找到关于在Xcode 4上使用OCUnit测试的最新信息,即使它是一个经过重新设计的功能.
Apples自己在Organizer中的文档是从2005年开始的(OS X 10.3).
我想我只是继续尝试自己设置它.
1:制定新的测试目标.(TestUnit)
2:确保项目和目标中的所有Base SDK设置都设置为iOS 4.3.
3:添加了测试类
4:确保框架搜索路径指向框架文件夹
(4.1?)手动将SenTesting框架添加到我的testTarget中
当我将我的方案设置为"TestUnit iOS 4.3 Simulator"并尝试运行它时,弹出的错误显示"所选的运行目标对此操作无效.".
我不知道上面是否是向Xcode 4添加OCUnit测试的正确方法,所以如果有人有资源或者可以指出我会感激的步骤.
先感谢您.
在单元测试中创建UIWebView时,我得到EXC_BAD_ACCESS:
-(void)test1 {
[[UIWebView alloc] initWithFrame:CGRectZero]; // EXC_BAD_ACCESS
}
Run Code Online (Sandbox Code Playgroud)
是否有特殊配置来运行涉及UIWebView的单元测试?
我在XCode 4.2上使用OCUnit/SenTest.
我正在使用SFHFKeychainUtils在我的应用程序中使用Keychain服务.我写了一些OCUnit测试来验证这段代码的功能.当我在iOS模拟器或我的设备上运行Xcode的单元测试时,一切正常.但是现在我正在尝试设置CI服务器,并且当它通过命令行运行时测试失败,错误代码为-25291.仔细查看Apple的文档告诉我:没有可用的信任结果(errSecNotAvailable).我已将Security.framework链接到我的单元测试项目,看起来就像我在网上看到的那样,这是我需要的才能让它工作.这是我在控制台中调用的命令:
/usr/bin/xcodebuild -target [Test_Target] -sdk /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/ -configuration Debug
有没有人有任何经验或建议让单元测试和钥匙串服务从命令行很好地一起玩?
continuous-integration unit-testing ocunit ios sfhfkeychainutils
我有一个问题,我得到了错误的访问异常,但只有在运行测试版本时(在调试版本中调用相同的方法不会导致问题出现).该项目启用了ARC,我使用Xcode 4.3在iPad 5.1模拟器上运行它:
这就是问题出现的地方:
- (void)testChangeFoodNotification {
Player* p = [[Player alloc] init];
[p addObserver:self forKeyPath:@"food" options:0 context:0]; // <-EXC_BAD_ACCESS (code=2)
p.food += 1;
STAssertTrue(_wasNotifiedOfFoodChange, nil);
}
Run Code Online (Sandbox Code Playgroud)
在addObserver:调用该方法时,似乎不应该释放任何涉及的对象,那么可能导致异常的原因是什么?
编辑:
如果不清楚但上面的代码是作为测试用例的一部分执行(使用标准的Xcode OCUnit),请道歉.此外,如果它澄清了这里的任何内容,那么来自播放器类的相关代码(还有其他的ivars和方法,但它们与被测试的属性或方法没有任何关联):
// Public interface
@interface Player : NSObject
@property (nonatomic, assign) NSInteger food;
@end
// Private interface
@interface Player() {
NSInteger _food;
}
@end
@implementation Player
@synthesize food = _food;
#pragma mark - Getters/Setters
- (void)setFood:(NSInteger)food {
[self willChangeValueForKey:@"food"];
_food = food;
[self didChangeValueForKey:@"food"];
}
Run Code Online (Sandbox Code Playgroud) 我有一个带有用户界面项目(UI)和核心逻辑项目(Core)的XCode工作区.我想在UI项目中进行OCUnit单元测试,所以我添加了一个新的测试目标,就像通常那样.
我能够运行测试,直到我为主UI目标中的类放入import语句,而后者又引用了Core项目.
我得到的错误是"未找到词法或预处理器问题'xxx.h'文件".当我直接构建主UI目标时,我没有收到此消息.
就像主UI目标在构建时知道Core一样,但是当它从测试目标引用时,似乎对Core一无所知.
我采取了使用"链接二进制文件库"添加对核心项目的引用的步骤.列表中的项目保持红色.线索?也许,但是链接列表中的红色引用不会阻止UI目标构建和使用核心类.我还使主要目标成为测试目标的依赖关系.
当我使用OCUnit测试我的应用程序时,它会像往常一样设置AppDelegate,window和rootViewController,然后再运行测试.然后我的rootViewController将自己添加为某些NSNotifications的观察者.
当我使用独立的测试实例和模拟观察者测试这些通知时,也会调用自动创建的rootViewController的通知处理程序,这会导致我的一些测试失败.
有没有办法让OCUnit在测试模式下运行时不创建rootViewController或使其使用不同的ViewController类?如果可以在我的应用程序代码中不编写与测试相关的特殊代码的情况下完成,那将会很酷.
有没有办法忽略特定的测试用例而不将其评论出来?
有些测试是在实现存在之前编写的,所以在提交任何代码之前,我想先将这些测试标记为忽略,这样就不会给任何同事带来任何影响.
对它们进行评论会导致失败,不完整的测试失败.
我正在尝试实现此处所述的应用程序测试.到目前为止,这么好,但我没有测试,例如,使用Core Location的设备的位置.我已经向目标添加了适当的框架,并启动了位置更新,但我不知道如何等待加载位置,测试套件在第二个线程完成之前就结束了.请帮我找一种测试这种东西的方法.
ocunit ×10
unit-testing ×6
ios ×4
iphone ×2
objective-c ×2
xcode ×2
xcode4 ×2
cocoa-touch ×1
jenkins ×1
tdd ×1
uiwebview ×1
xctest ×1