iOS单元测试

转自: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

复制代码
#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 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/

GHUnit测试框架 GHUnit 测试框架,从官网下载下来的,上传以备不时之需。 立即下载

相关推荐

Objective-C的测试框架gh-unit

Objective-C的测试框架gh-unit,源码gh-unit,GHUnit是一款Objective-C的测试框架,除了支持iOS工程还支持OSX的工程。可以作为单独的测试框架,也可以和其他测试框架一同使用,比如SenTestingKit或者GTM。 功能 支持运行测试、跟踪断点以及直接与Xcode Debugger进行交互。 并行测试; 可测试UI组件; 可捕获并展示测试细节; 按照关键字搜索过滤测试案例; 根据测试案例查看日志; 显示堆栈跟踪和有用的调试信息; 在项目中作为框架使用; 确定视图是否发生了改变; 快速记录view changes 文档 如何安装、创建以及运行测试 在线文档 Google Group (Deprecated - Use Github Issues instead)

XCode 下的 iOS 单元测试

XCode 下的 iOS 单元测试 罗朝辉 (http://blog.youkuaiyun.com/kesalin) CC 许可,转载请注明出处 XCode 内置了 OCUnit 单元测试框架,但目前最好用的测试框架应该是 GHUnit。通过 GHUnit + OCMock 组合,我们可以在 iOS 下进行较强大的单元测试功能。本文将演示如何在 XCode 4.2 下使用 OCUnit, GHU...

luliangok 285

GD32F450以太网(1):ETH 外设接口简介

GD32F450以太网ETH MAC外设接口简介

Zhichao_Zhang的博客 1万+

xxxTests-Info.plist Error in Xcode(删除test target)

I keep getting this error in Xcode and it's highly confusing:  error: could not read data from '/Users/mjz/Desktop/xxx-iOS-BTv3/xxxTests/xxxTests-Info.plist': The file “(myapp)Tests-Info.plist” cou

槑头脑的博客 842

群晖NAS变身私有Git服务器:DS218+部署与TortoiseGit客户端实战指南

本文详细介绍了如何将群晖NAS(如DS218+)变身为私有Git服务器,并配置TortoiseGit客户端实现高效代码管理。通过硬件检查、系统更新、Git Server套件安装及权限配置等步骤,帮助开发者在局域网内搭建安全、高速的代码托管环境,特别适合小团队协作。

weixin_29252171的博客 223

3、数据导入与清洗:Excel、SQL、SPSS、Stata和SAS数据处理

本文详细介绍了如何从Excel文件、SQL数据库以及SPSS、Stata和SAS等统计软件中导入和清洗数据。针对不同数据来源的特点,提供了具体的处理方法,包括跳过无用行、重命名列、处理缺失值、转换数据类型、保留元数据等关键步骤。同时,通过实际应用案例展示了如何整合多源数据,并总结了数据导入和清洗的最佳实践,帮助读者高效完成数据预处理工作,为后续的数据分析打下坚实基础。

134

Xcode 单元测试

XCTEST 场景 / XCTEST 展望 / 评估 Block() 虽然WWDC 2014 上iOS 8 和Swift的发布引起了开发者的极大关注,但Xcode 6 在测试功能方面的提升和改进或许将会产生长期的深远的影响。 本周,我们将关注XCTest, “” 阅读器 原文:XCTestCase/XCTestExpectati

尘埃落定 6707

高级数据库--作业及答案

中科大金培权老师的高级数据库课程作业及答案

一杯水果茶!足矣~ 1657

转 Xcode7 UI自动化测试详解 带demo UITests

作者:sunljz 授权本站转载。 UI Tests是什么? UI Tests是一个自动测试UI与交互的Testing组件 UI Tests有什么用? 它可以通过编写代码、或者是记录开发者的操作过程并代码化,来实现自动点击某个按钮、视图,或者自动输入文字等功能。 UI Tests的重要性 在实际的开发过程中,随着项目越做越大,功能越来越多,仅仅靠人工操作的方

ZWQ0325的博客 1062

用生成式AI自动生成测试用例的完整教程

本文旨在帮助测试工程师、开发人员快速掌握“生成式AI自动生成测试用例”的核心技术,覆盖从概念理解、工具选择到实战落地的全流程。无论是Web应用、API接口还是移动端功能测试,你都能找到可复用的方法。本文将按照“概念→原理→实战→避坑”的逻辑展开:先通过生活案例理解生成式AI如何生成测试用例,再拆解核心算法原理,接着用Python代码演示完整生成流程,最后分享实际应用中的优化技巧和未来趋势。生成式AI:能“创造内容”的AI模型(如ChatGPT、CodeLlama),像会写作文的智能笔。测试用例。

AIGC应用创新大全的博客 1580

C#对接EtherNet/IP协议 完整版|罗克韦尔AB PLC通信+CIP核心概念全解析

你做罗克韦尔(AB) PLC工业上位机开发,是唯一的首选协议,没有之一!EtherNet/IP(Ethernet Industrial Protocol)是基于标准以太网的工业级通信协议,由罗克韦尔自动化主导开发,是ODVA(开放设备网络供应商协会)主推的工业以太网标准,也是目前全球应用最广泛的工业以太网协议之一。原生适配罗克韦尔AB PLC:Micro800、CompactLogix、ControlLogix、Micro850等全系AB PLC原生标配EtherNet/IP,无需额外配置,开箱即用;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 891

iOS Xcode自带单元测试框架XCTest进行逻辑测试和异步测试

使用Kiwi框架进行测试,参考这篇Kiwi简单使用-硬币demo代码地址        在写完代码或者修改一个功能后,我们需要对修改的代码进行测试,看看修改或者添加的代码有没有bug,这时候你可能会重新运行程序,操作到相应的函数界面,下断点,看看代码是否正常工作,可是每次都运行代码进行测试的效率肯定不如只测试这一个函数的效率来的高,单元测试就是为你的某一个函数或者功能进行单独测试的功能。什么时候用...

硬币2014 3039

Lammps实现甲烷与水的竞争吸附-循环不同气体分子

Lammps实现甲烷与水的竞争吸附

Rockyoung 5375

ios单元测试_正确进行iOS中的单元测试

ios单元测试 为什么我的应用程序在每次发行后都会变得如此麻烦? 为什么我的质量检查小组经常报告重复性问题和崩溃? 遏制此类问题的最佳解决方案是单元测试。 在此博客文章中,我们将看到如何将单元测试有效地合并到我们的代码库中,从而减少重复的测试工作和错误频率。 有3种类型的开发人员级别测试: 单元测试 (我们今天将重点讨论) 整合测试 UI测试 单元测试基本上是将较...

编程故事的地方 4013

链接文件及功能安全:S32K3如何将FLASH驱动放到RAM里面、RAM如何实现软件复位数据不丢失操作。

在通过RTD的SDK也好MCAL也好,始终存在一个问题,生成的代码除了看门狗模块,默认都是放在flash里面,按照正常逻辑来看没啥大的问题,思考一个问题:Flash放在0x100的位置,但是此时我们要操作0x100怎么办?那肯定不允许啊,但是将flash的驱动放在RAM里面就可以避免这个问题的产生。Flash的特性:PF0能操作PF1,当然PF1也能操作PF0的,以此类推,只要不操作自身,想怎么玩都可以。这也是一个物理特性吧。

梦想技术家 2310

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

iOS单元测试SenTest

环境:Xcode 4.3 1、创建单元测试的target 选择工程,点击Add Target,添加ios-Other下的Cocoa Touch Unit Testing Bundle类型target(图1)。 (网上一些资料说,target后缀必须是Tests,但实际测试同名字无关系,可能是Xcode版本原因),完成后如图2 此时工程目录下会多一个TestF

FISH 的专栏 1835

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ios单元测试实践

单元测试作为测试开发同学必须掌握的一门技能,在测试中很受重视,因为本人在做测试之前做过ios开发,于是就拿出之前的项目代码进行了练习,希望通过我的这篇文章,小哥哥小姐姐能对ios单元测试有个基本了解,会写基本的ios单元测试代码。 单元测试的定义是对可以测试的最小单元进行测试,这里的最小单元可以是一个函数代码块,可以是一个UI操作。我们就拿函数代码块来举例说明。测函数代码块,也可以理解为测试研发自己写的函数方法,说白了就是通过调用这个方法,看调用完的结果是否是这个方法本身该实现的功能, 你比如研发同学经常

weixin_44635741的博客 538

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

IOS 单元测试

IOS 自带单元测试。 1、在创建时,将include Unit Tests钩上。   这样创建后就会自动生成以Tests结属的测试工程。   打开ProjectTest.m 可以看到系统已创建好一个测试例子的测试方法testExample 现在就可以运行测试单元看看效果。 点击RUN,长按弹出TEST,选择TEST 运行结果当然是测试

fengsh998的专栏 1万+

iOS 单元测试

很多开发者都听说过单元测试,但是在实际开发中我们却很少使用到单元测试,一般流程规范的大项目一般都会做单元测试,下面主要介绍 Xcode 自带的 XCTest 测试工具。 单元测试 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。如C语言中的一个函数,Java里的一个类等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测...

Andy Coding 590

iOS开发——单元测试

单元测试闻名不如见面!在某技术交流群里问了下iOS开发的人,貌似写单元测试的程序猿不多,查了些资料写了demo,发现单元测试还是挺有用的,第一次用就确实测试出了运行成功语法没错,但是存在问题的方法!初次见面还是印象不错,那还是从概念开始深入认识吧一.概念 单元测试又称模块测试,属于白盒测试,是最小单位的测试。模块分为程序模块和功能模块。功能模块指实现了一个完整功能的模块(单元),一个完整的程序单

吹泡泡的星星 4039

iOS 单元测试之常用框架 OCMock 详解

希望这篇文章和例子已经陈述清楚了一些 OCMock 最通用的用法。OCMock 站点:http://ocmock.org/features/ 是一个最好的学习 OCMock 的地方。mock 是单调的但是对于一个应用程序却是必须的。如果一个方法很难用 mock 来测试,这个迹象表明你的设计需要重新考虑了。

weixin_71807218的博客 1512

iOS 单元测试(UI Testing Bundle, Unit Testing Bundle, Include Tests)

Appler Developer: Writing Performance Tests Apple Developer: Defining Test Cases and Test Methods WWDC视频2020:Eliminate animation hitches with XCTest 参考博客: iOS 单元测试(Unit Test 和 UI Test) iOS单元测试从入门到应用(长文) ...

baidu_40537062的博客 967

IOS单元测试(—)

单元测试 OCUnit(即XCTest测试) 这个就是苹果自己的测试框架 GHUnit 这是一个可视化的测试框架,可以点击app来决定测试哪个方法,并且可以点击查看测试结果等。(后续详细叙述) OCMock 这个是模拟某个方法或者属性的返回值。(后续详细叙述) 创建一个简单的单元测试 新建项目: 最简单的单元测试 一个简单的测试demo 该类继承自XCTestCase类,其中包含三个方法:

TF_LIU的博客 786

ios android 单元测试 跨平台,iOS单元测试和UI测试

单元测试不是一个小工程,需要多用些时间才能做好,不要希望通过这个文章就能掌握单元测试,这只是一个入门,需要自己动手操作1、单元测试解释单元测试是开发者编写的一小段代码,用于检验被测代码中的一个很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。执行单元测试,是为了证明某段代码的行为确实和开发者所期望的一致。因此,我们所要测试的是规模很小的、非常独立的...

weixin_39725924的博客 313
上一篇: Core Data数据持久化的使用
下一篇: iPhone静态库学习笔记
iteye_3205
博客等级 码龄8年 0粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值