转自:http://www.cnblogs.com/kesalin/archive/2011/12/23/cocoa_ocunit_ocmock.html
XCode 内置了 OCUnit 单元测试框架,但目前最好用的测试框架应该是 GHUnit。通过 GHUnit + OCMock 组合,我们可以在 iOS 下进行较强大的单元测试功能。本文将演示如何在 XCode 4.2 下使用 OCUnit, GHUnit 和 OCMock 进行单元测试。
OCUnit
在 XCode 下新建一个 OCUnitProject 工程,选中 Include Unit Tests 选择框,
OCUnit 框架则会为我们自动添加 Unit Test 框架代码:
XCode 在 OCUnitProjectTests.m 中为我们自动生成了一个 Fail 的测试:
- (void)testExample
{
STFail(@"Unit tests are not implemented yet in OCUnitProjectTests");
}
让我们来运行 Test,看看效果:
从图中的红色下划线部分可以看出,测试没有通过,符合预期。我们只要像类 OCUnitProjectTests 一样编写继承自 SenTestCase 类的子类,在其中添加形式如:- (void) testXXX(); 的测试函数既可,注意必须是一个无参无返回类型且名称是以 test 为前缀的函数。
OCUnit 的有点是官方支持,于 XCode 集成的比较好。
GHUnit
GHUnit 是一个开源的单元测试框架,具有可视化界面,功能亦相当强大。Mark 写了一篇 OCUnit vs GHUnit 的文章,有兴趣的童鞋可以看一看。OCMock 是由 Mulle Kybernetik 为 OS X 和 iOS 平台编写的遵循 mock object 理念的单元测试框架。
下面来介绍如何配置 GHUnit 和 OCMock
1,首先,创建一个名为 GHUnitProject 的单视图应用程序,注意:不要选中 Include Unit Tests 选择框。然后运行,应该出现白屏。
2,添加新的 test target,选中左边的工程名,点击右侧的 Add Target,新增一个名为 Tests 的 Empty Application 应用程序,让其附属于 GHUnitProject注意:不要选中 Include Unit Tests 选择框。
3,向 Tests 工程中(注意是 Tests 工程)添加 GHUnitIOS Framework。首先下载与 XCode 版本对应的 GHUnitIOS Framework。英文好的可以直接查看官方 iOS 版的安装文档:点此查看,跳过此第 3 节;否则请接着看。
3.1,解压 GHUnitIOS 框架到 GHUnitProject 下,让 GHUnitIOS.framework 与 Tests 在同一目录下。
3.2,回到 XCode,右击工程中的 Frameworks group,选中 Add Files to...菜单,选取 GHUnitIOS.framework ,注意 targets 要选择 Tests。
3.3,设置 Tests 的 Build Settings:在 Other Linker Flags 中增加两个 flag: -ObjC 和 -all_load。
3.4,删除 Tests 工程中的 UTSAppDelegate.h 和 UTSAppDelegate.m 两个文件;
3.5,修改 Tests 工程中的 main.m 为:
#import <UIKit/UIKit.h>
#import <GHUnitIOS/GHUnitIOSAppDelegate.h>
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([GHUnitIOSAppDelegate class]));
}
}
3.6,选择编译目标 Tests>iPhone 5.0 Simulator,编译运行,应该能得到如下效果。目前我们还没有编写任何实际测试,所以列表为空。
4,编写 GHUnit 测试。向 Tests 工程中添加名为 GHUnitSampleTest 的 Objective C class。其内容如下:
GHUnitSampleTest.h
GHUnitSampleTest.m
#import "GHUnitSampleTest.h"
@implementation GHUnitSampleTest
- (void)testStrings
{
NSString *string1 = @"a string";
GHTestLog(@"I can log to the GHUnit test console: %@", string1);
// Assert string1 is not NULL, with no custom error description
GHAssertNotNULL(string1, nil);
// Assert equal objects, add custom error description
NSString *string2 = @"a string";
GHAssertEqualObjects(string1, string2, @"A custom error message. string1 should be equal to: %@.", string2);
}
@end
然后编译运行,点击 Run,效果如下:
图中的 All 栏显示所以的测试,Failed 栏显示没有通过的测试。强大吧,GHUnit。你可以向 GHUnitSampleTest 添加新的测试,比如:
- (void)testSimpleFail
{
GHAssertTrue(NO, nil);
}
我们可以向 Tests 添加更多测试类,只要该类是继承自 GHTestCase,且其中的测试方法都是无参无返回值且方法名字是以 test 为前缀即可。
OCMock
下面我们来添加 OCMock。
1,我们只能以静态库的方式来添加 OCMock。在 GHUnitTest 目录下新建 Libraries 目录,该目录是与 Tests 目录平级的。下载静态库文件,解压头文件至该目录下。
文件下载:头文件 libOCMock.a ,framework 文件:OCMock framework ,打开下载好的 ocmock-1.77.dmg,拷贝其中的‘Release/Library/Headers/OCMock’ 目录至 Libraries 下。最终目录结构如下:
2,在 GHUnitTest 工程中新建名为 Libraries 的 group,导入libOCMock.a 和目录 OCMock,注意 target 是 Tests。
3,设置 Tests 的 Build Setting。让 Libray Search Paths 包含 $(SRCROOT)/Libraries:
在 Header Search Paths 中增加 $(SRCROOT)/Libraries,并选中 Recursive 选择框。
4,编写 OCMock 测试。向 Tests 工程中添加名为 OCMockSampleTest 的 Objective C class。其内容如下:
OCMockSampleTest.h
#import <GHUnitIOS/GHUnit.h>
@interface OCMockSampleTest : GHTestCase
@end
OCMockSampleTest.m
#import "OCMockSampleTest.h"
#import <OCMock/OCMock.h>
@implementation OCMockSampleTest
// simple test to ensure building, linking,
// and running test case works in the project
- (void)testOCMockPass
{
id mock = [OCMockObject mockForClass:NSString.class];
[[[mock stub] andReturn:@"mocktest"] lowercaseString];
NSString *returnValue = [mock lowercaseString];
GHAssertEqualObjects(@"mocktest", returnValue,
@"Should have returned the expected string.");
}
- (void)testOCMockFail
{
id mock = [OCMockObject mockForClass:NSString.class];
[[[mock stub] andReturn:@"mocktest"] lowercaseString];
NSString *returnValue = [mock lowercaseString];
GHAssertEqualObjects(@"thisIsTheWrongValueToCheck",
returnValue, @"Should have returned the expected string.");
}
@end
编译运行,点击 Run,效果如下图。
至此,iOS 下的OCUnit,GHUnit,OCMock 单元测试介绍就到此结束了。当然还有其他一些测试框架,比如 google 出品的 GTM。
参考资料:
OCMock: http://ocmock.org/
Unit Testing in Xcode 4- use OCUnit and SenTest instead of GHUnit
GHUnit Reference: http://gabriel.github.com/gh-unit/
发表评论
-
如何使用AV Foundation从摄像头将视频帧捕获为图像
2012-11-15 17:21 7460如果译错,感谢指出。 英文原文地址:https://d ... -
Core Data数据持久化的使用
2012-10-30 21:31 1050CoreData 是ios中用来对数据做持久化的一个框架 ... -
ASIHTTPRequest缓存策略的设置
2012-10-30 17:23 3876ASIHTTPRequest 是一款强大的网络请求框架,该框架 ... -
【无限互联】xcode自定义类的模板
2012-10-23 19:37 1161翻译:http://www.bobmccune.com/ ... -
【无限互联】适配iOS6和iPhone5屏幕
2012-10-23 18:05 24771. iOS6的mo模拟器比较大,通过comman ... -
【无限互联】mac下配置svn服务器
2012-10-22 13:30 773在mac下配置svn服务器其实很简单,只需要简单的几句命令就可 ... -
【无限互联】iOS开发之多线程开发
2012-10-10 17:41 1238本节要点: 1.多线程的概念 2.掌握iOS中多线程 ... -
【无限互联】iOS开发block用法之UIAlertView控件的修改
2012-10-10 17:06 2689原始的UIAlertView的需要通过委托方法来实现按钮 ... -
Objective-C新特性
2012-09-05 14:38 707基于Xcode4.4(不完全独有)。1. 成员方法无需前置声明 ... -
iphone-NSDate日期处理
2012-08-31 16:25 1071NSDate存储的是世界标准时(UTC),输出时需要 ... -
iphone开发资源汇总
2012-08-31 16:16 1623如何用Facebook graphic api上传视 ... -
iOS-如何让xcode自动检查内存泄露
2012-08-31 16:05 1097在project-setting中找到 “Run Static ... -
UIScrollView的属性总结
2012-02-08 15:58 4435在滚动过程当中,其实是在修改原点坐标 当手指触摸后, scr ... -
iPhone开发之 ARC是什么
2012-01-17 16:58 1384相关链接:http://blog.csdn ... -
画图时 自己做的一小笔记
2012-01-07 21:02 9660 CGContextRef context = UIGra ... -
让Xcode 4.2生成的app支持旧版iOS设备(armv6)
2012-01-07 00:46 1340这几天遇到一个非常奇怪的问题,基于Xcode 4.2开发的ap ... -
5个开源库的JSON解析速度测试
2011-12-03 23:15 1460iOS5新增了JSON解析的API ... -
获取iOS设备当前ip地址
2011-11-17 23:16 1394第一种方法是用系统api的方式获取,如下 #include & ... -
Quartz 2D编程指南(2) - 图形上下文(Graphics Contexts)
2011-11-12 00:08 1457一个Graphics Context表示一 ... -
Quartz 2D编程指南(1) - 概览
2011-11-11 23:57 1720Quartz 2D是一个二维图形绘制引擎,支持iOS环境和Ma ...
相关推荐
在进行iOS单元测试时,为了能够有效地进行代码测试和保证软件质量,开发者们通常会遵循一系列的最佳实践。这些最佳实践不仅能够帮助开发者们更加高效地编写测试用例,还能够确保测试用例能够覆盖应用的关键部分,...
这个“iOS单元测试大礼包”为你提供了全面的学习资源,包括8个演示实例(demo)和3个视频教程,帮助你深入理解和掌握iOS单元测试的技术和实践。 首先,我们要理解什么是单元测试。单元测试是对软件中的最小可测试...
"iOS单元测试实例"提供了关于如何在iOS应用中实现和利用单元测试的实践案例。在这个实例中,我们将探讨`iOS_Calc`和`Calculator-iOS`两个项目,它们可能是模拟一个简单计算器的应用,用于演示单元测试的基本概念和...
1、最小可测单元 2、不是为了发现bug,是为了提高开发效率,为了我们的代码健康可持续发展 1、好的单元测试就是一份上好的文档,而且比文档更容易被程序员接受 2
### 单元测试与自动化——李智维 iOS 开发经验分享 #### 一、作者背景介绍 李智维,一位年轻的技术人才,21岁时已积累了丰富的开发经验。他在中学时期就参加了算法竞赛,展现了其对编程技术的兴趣与天赋。大学期间...
Kiwi 是 Objective-C 的单元测试框架,因其简单的接口而著名,基于 Objective-C 编写,只支持 iOS 应用 示例代码: describe(@"Team", ^{ context(@"when newly created", ^{ it(@"should have a name", ^{ ...
**iOS单元测试之XCTest详解** 测试是软件开发过程中至关重要的一环,特别是对于App开发,良好的测试能够确保代码的稳定性和可靠性。XCTest是Apple为iOS开发者提供的一个强大的测试框架,它涵盖了单元测试、集成测试...
`swift-Spry` 是一个专门为SwiftPlaygrounds设计的单元测试库,它基于另一个知名的测试匹配框架`Nimble`。下面我们将深入探讨`swift-Spry`及其相关知识点。 首先,我们需要了解`Nimble`。`Nimble`是由Quick项目提供...