转:点击打开链接

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

#import <GHUnitIOS/GHUnit.h> @interface GHUnitSampleTest: GHTestCase
{
}@end

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 descriptionGHAssertNotNULL(string1, nil);// Assert equal objects, add custom error descriptionNSString *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。

其他文章:

iOS开发中的单元测试(一)点击打开链接
iOS开发中的单元测试(二)——让断言活泼起来的匹配引擎点击打开链接
iOS开发中的单元测试(三)——URLManager中的测试用例解析点击打开链接

参考资料:
OCMock: http://ocmock.org/
Unit Testing in Xcode 4- use OCUnit and SenTest instead of GHUnit
GHUnit Reference: http://gabriel.github.com/gh-unit/

转载于:https://www.cnblogs.com/forrestblog/p/5077479.html

XCode下的iOS单元测试相关推荐

  1. (0038) iOS 开发之Xcode下的DerivedData文件

    Xcode下的DerivedData文件 长时间没清理:吃了大量硬盘.删除了之后,运行:CleanMyMac 竟然有50G啊!清除,爽啊! 一大早就跑过来删除xcode的垃圾文件,如果你很久没有删除x ...

  2. xcode反汇编调试iOS模拟器程序

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow http://bl ...

  3. python模拟ios_使用Xcode + Python进行IOS运动轨迹模拟!

    前言 在某些app中,需要根据用户的实时位置来完成某些事件 例如跑步打卡软件(步道乐跑).考勤打卡软件(叮叮).某些基于实时位置的游戏(Pokemon Go.一起来捉妖) 一般解决办法是通过使用安卓模 ...

  4. XCode下Object C和C++混合编译

    最近,在iOS上调试一个App,核心代码是用C++实现的,App界面使用Object C实现,在XCode下混合编译 C++/Object-C遇到的问题总结一下: 1. 文件格式问题,C++里的.h和 ...

  5. python 模拟ios提交网络_使用Xcode + Python进行IOS运动轨迹模拟

    前言 在某些app中,需要根据用户的实时位置来完成某些事件 例如跑步打卡软件(步道乐跑).考勤打卡软件(叮叮).某些基于实时位置的游戏(Pokemon Go.一起来捉妖) 一般解决办法是通过使用安卓模 ...

  6. python round()_使用Xcode + Python进行IOS运动轨迹模拟!

    前言 在某些app中,需要根据用户的实时位置来完成某些事件 例如跑步打卡软件(步道乐跑).考勤打卡软件(叮叮).某些基于实时位置的游戏(Pokemon Go.一起来捉妖) 一般解决办法是通过使用安卓模 ...

  7. Xcode下使用bits/stdc++.h 头文件

    Xcode下使用bits/stdc++.h 头文件 bits/stdc++.h 头文件,"万能头文件". 这个头文件包含了所有 C++ 标准库,这样我们就不用一个一个将我们需要的头 ...

  8. ios跑 python_使用Xcode + Python进行IOS运动轨迹模拟

    摘要: 085977848结束点: lat:34.3733728774 lon:108.9064091023  在该网站可以通过经纬度获得距离信息:http://www.hhlink.com/经纬度/ ...

  9. 如何使用Xcode Configuration 管理 iOS Apps 不同构建版本

    如何使用Xcode Configuration 管理 iOS Apps 不同构建版本 面临的问题 解决方案 如何操作 建立Build Configuration 使用Xcode配置文件(.xcconf ...

  10. 使用 Xcode 在越狱 iOS 设备上进行开发调试

    1 目的 2 iOS 设备的设置 3 生成私有签名 4 设置 Xcode 4.1 告诉 Xcode 不需要签名 4.2 告诉 Xcode 不用做签发动作 4.3 指示 Xcode 使用私有签名签发 A ...

最新文章

  1. Codejock的使用--皮肤
  2. 图解人工智能机器学习深度学习的关系和区别
  3. pytorch下载mnist超时解决方案
  4. LinkedList专题2
  5. 多项新政催生本年度购房最佳“窗口期”
  6. TypeScript算法专题 - blog2 - 单链表节点的索引、结点删除与链表反转
  7. Windows XP搜索功能 包含文字 搜索不到内容的解决办法
  8. 在 Windows 中实现 Java 本地方法-Java native 关键词
  9. ClickHouse常用sql语句
  10. lopatkin俄大神精简系统Windows 10 Pro 18362.10006 19H2 PreRelease x86-x64 ZH-CN MICRO
  11. 云购PHP,高仿一元云购CMS-PHP源码
  12. Spark入门(一)概述
  13. 从HttpClient3迁移到HttpClient4
  14. 永远的Beyond, 永远的家驹
  15. 离散元 python_开源离散元软件YADE的安装与编译(基于ubuntu18.04) | 望天博客
  16. MACD底背离选股公式——通达信、同花顺
  17. IMFI DAO World of Balatroon:土地出售即将到来!
  18. 器件选型-墨水屏(电子纸)介绍
  19. Tor 在 linux上使用
  20. 倍福PLC部署Jenkins入门使用笔记

热门文章

  1. elementUI给树控件中的节点添加图标
  2. 6.爬虫 requests库讲解 总结
  3. C# LINQ系列:LINQ to DataSet的DataTable操作 及 DataTable与Linq相互转换
  4. css设置字体的行数,超出显示...
  5. NOIP欢乐模拟赛 T1 解题报告
  6. 运行后台程序出现[1]+ Exit
  7. iOS :高德地图SDK配置教程(安装CocoaPods、生成Podfile文件、安装SDK、demo简单使用等)
  8. Struts2学习第4天--拦截器
  9. 北京集训②DAY1 Morning
  10. javaWEB总结(29):理解多个Filter代码的执行顺序