iOS 单元测试OCMock介绍

来源:互联网 发布:北大青鸟计算机二级vb 编辑:程序博客网 时间:2024/05/22 22:58
OCMock总结
使用OCMock是为了某些不容易构造或者不用一获取的对象,用一个虚拟的对象来创建以便测试。在cocoa编程测试使用系统自带的ocunit,或者第三方的ghunit都没有mock,一般使用oc mock和ghunit的组合来搭建测试框架来测试
mock基本的用法有从class初始化mock对象,
id mock = [OCMockObject mockForClass:[SomeClass class]]
初始化mock对象之后可以使用expect 和verify组合来进行验证。
[[mock expect] someMethod:someArgument]
中间调用其他代码会调用someMethod
[mock verify]
expect 也可以验证返回值,例如
[[[mock expect] andReturn:@"Objective-C"] lowercaseString];

stub 构造接口返回信息,但不验证,expectstub在实现上的区别是,在mockobject上有个expectations数组,expect后会把stub后的对象加到该数组,verify时候对expectations数组验证。
[[[mock stub] andReturn:aValue] someMethod:someArgument]
告诉mock对象someMethod调用时候,应该返回aValue
也可以抛出异常
[[[mock stub] andThrow:anException] someMethod:someArgument]
或者发送消息
[[[mock stub] andPost:aNotification] someMethod:someArgument]
或者委托另外一个对象
[[[mock stub] andCall:@selector(aMethod:) onObject:anObject] someMethod:someArgument]
可以使用and Return, and Throw, and Post, and call onObject 组合使用

除了从class得到mock对象,还能从protocol得到,
id aMock = [OCMockObject mockForProtocol:@protocol(SomeProtocol)]
另外有一种Partial mocks
id aMock = [OCMockObject partialMockForObject:anObject]
当方法没有使用stub之后被调用之后,会被返回到anObject,当一个stub的方法被调用时候使用anObject的引用。
当mock object的一个方法没有expect或者stub之后被调用会产生一个异常,而如果使用niceMock来初始化被忽略。
id mock = [OCMockObject niceMockForClass:[SomeClass class]]
可以不允许指定的方法:
[[mock reject] someMethod]

OCMock 文档:http://ocmock.org/


GHUnit 总结
相比自带的ocunit,GHUnit可以兼容ocunit的语法,并提供了异步测试的方法。测试target是一个独立的app,可以加断点和可以在真机上运行。
使用GHAsyncTestCase 异步测试
例如
- (void)testThatDelegateCanOverrideActionSheetDisplay {
   self.actionBar.delegate = self;
   
   [self prepare];
   [self.actionBar shareButtonTouched:nil];
   [self waitForStatus:kGHUnitWaitStatusSuccess timeout:1.0];
}

- (void)actionBar:(SocializeActionBar *)actionBar wantsDisplayActionSheet:(UIActionSheet *)actionSheet {
//    GHAssertEquals(actionSheet, self.mockShareActionSheet, @"Bad action sheet");
   [self notify:kGHUnitWaitStatusSuccess];
}
先调用prepare,调用方法后,再等待  kGHUnitWaitStatusSuccess消息。自己实现了actionBar: wantsDisplayActionSheet:的delegate方法,发送 kGHUnitWaitStatusSuccess。

GHUnit文档:https://github.com/gabriel/gh-unit


Kif 总结
kif ,”keep it functional”,可以让iOS通过在模拟器上模拟用户交互行为的方式来做集成测试。
模拟用户的行为包括,输入文字,点击等等,验证方式可以使用是否跳转到指定View等。

使用方式是先把原来的target复制一份,引入库文件,修改一下配置,加入集成测试代码。测试代码一般需要三个部分,继承自KIFTestController的类,扩展KIFTestScenario的方法,指定要执行哪些step,每个step调用KifTestStep,自己扩展KifTestStep来实现每个step的具体操作。

Kif文档:https://github.com/square/KIF


另一个测试框架 Kiwi
Kiwi类似于系统自带的ocunit,在系统自带的test的target里添加测试用例。
与ocunit相比,除了语法区别之外,还可以使用mock对象,可以异步方法来测试。
不过对比GHUnit,异步测试的方法不够好用。

1 0
原创粉丝点击