Xcode 5 单元测试(二)OCMock和GHUnit

【无人机路径规划】基于强化学习实现多无人机路径规划附matlab代码 1 简介 本文提出一种基于强化学习实现多无人机路径规划。​ 2 部分代码 % This is used to measure the path length, service rate and risk explosure for each UAVs %% parameters function [PL,ServiceRate,Risk]=measure global N2; % divide [0,1]*[0,1] map into N2*N2 grid when calcul 阅读详情

在Xcode 5 单元测试(一)使用XCTest进行单元测试中说了如何在Xcode 5中使用XCTest进行简单的单元测试,本文就来探讨下mock测试和更高级的工具GHUnit。


Mock

首先科普下什么是mock测试。mock测试是个很神奇而又很酷的技术,在测试过程中,对于一些不容易构造或不容易获取的对象,此时你可以创建一个虚拟的对象(mock object)来完成测试。

例如你可能要尝试100次才会返回一个NSError,通过mock object你可以自行创建一个NSError对象,测试在出错情况下程序的处理是否符合你的预期。

例如你要连接服务器但是服务器在实验室,你在外工作的时候就无法测试了(小弟就试过这种情况,非常反感),这个时候你可以创建一个虚拟的服务器,并返回一些你指定的数据,从而绕过服务器。

例如假设你要访问一个数据库,但是访问过程的开销巨大,这时你可以虚拟一个数据库,并且返回一些自行定制的数据,从而绕过了数据库的访问。

mock的思想很简单:没有条件?我们就自行创造条件。



OCMock


1.关于OCMock

OCMock是一个用于为iOS或Mac OS X项目配置Mock测试的开源项目,如果目标是iOS项目那么生成的是静态库,如果是Mac OS X项目生成的是框架。小弟粗略看过下OCMock的源码(可惜功力不够,目前只看了一小部分),其实现思想就是根据要mock的对象的class来创建一个对应的对象,并且设置好该对象的属性和调用预定方法后的动作(例如返回一个值,调用代码块,发送消息等等),然后将其记录到一个数组中,接下来开发者主动调用该方法,最后做一个verify(验证),从而判断该方法是否被调用,或者调用过程中是否抛出异常等。

在讲解如何在iOS项目中添加OCMock静态库之前,先给出OCMock的资料地址:

OCMock官网

iOS Project Setup:在iOS项目中配置OCMock的教程

erikdoe / ocmock:在GitHub上的示例项目,可以参考下其中的一些配置参数

OCMock Download:OCMock的静态库、框架和工程文件(可以在这里看OCMock的源码实现)下载地址,已经打包成dmg格式了。


2.配置OCMock

好吧,进入主题。还是以(一)中的UnitTestDemo那个工程为例吧。

1.下载OCMock Download的dmg文件,将iOS文件夹中的文件(libOCMock.a和OCMock文件夹)拷贝到要测试的项目目录下:



2.打开工程,首先添加以上文件到项目中(Command + Option + A):


3.打开UnitTestDemoTests Target的Build Phases,添加libOCMock.a到要链接的类库中:



4.打开Build Settings,搜索Other Linker Flags,设置如下:

这里的-ObjC表示告诉链接器,要把OC类和Category加载到工程中,但是该设置有Bug,所以还要用-all_load或者-force_load来加载静态库中没有加载进来的Category。如果使用-all_load会把所有相关无关的文件都load进来,使得目标程序变得更大,所以用-force_load来指定要加载的静态库就可以了,下面的"$(SRCROOT)/ocmock/libOCMock.a"就是静态库文件在Finder中的路径。


再搜索Header Search Paths,设置如下:

"$(SRCROOT)/ocmock"给出的是OCMock的头文件在Finder中的路径,因此该选项告诉编译器应该到哪里去寻找OCMock静态库的头文件。


3.编写mock测试

新建一个test case class类,基类为XCTestCase,命名为MockTableTests。

首先我们测试一下TableDataSource的numberOfRowsInSection方法是否返回了正确的值,测试代码如下:

  1. - (void)testNumberOfRows {  
  2.     // 1.创建Table View的DataSource  
  3.     TableViewCellConfigureBlock cellConfigureBlock = ^(UITableViewCell *cell, NSString *item) {  
  4.         cell.textLabel.text = item;  
  5.     };  
  6.       
  7.     TableDataSource *tableSource = [[TableDataSource alloc] initWithItems:@[@"1", @"2", @"3"]  
  8.                                                            CellIdentifier:@"foo"  
  9.                                                        ConfigureCellBlock:cellConfigureBlock];  
  10.       
  11.     // 2.创建mock table view  
  12.     id mockTableView = [OCMockObject mockForClass:[UITableView class]];  
  13.       
  14.     // 3.断言  
  15.     XCTAssertEqual([tableSource tableView:mockTableView numberOfRowsInSection:0], (NSInteger)3, @"Mock table returns a bad number of rows in section 0");  
  16. }  

1.首先创建data source,用于下文中调用numberOfRowsInSection方法。注意这里Table View中的内容@[@"1", @"2", @"3"]是需要我们手动配置的。这里也体现了mock的一个局限性,就是mock object的关键属性都要我们自己定制,如果要模拟的对象非常的大,那么创建一个mock object的成本将远远大于单元测试带来的效益。

2.如果要单独测试numberOfRowsInSection方法,我们就需要有一个TableView,因此要通过OCMockObject的mockForClass类方法来创建一个mock table view。

3.通过data source调用方法,并使用断言判断。


如果在测试时,我们只想在控制台中看见这个方法的输出信息,可以点击方法前面的一个小播放按钮:

控制台输出:

[plain] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. Test Suite 'Multiple Selected Tests' started at 2014-03-20 01:58:17 +0000  
  2. Test Suite 'UnitTestDemoTests.xctest' started at 2014-03-20 01:58:17 +0000  
  3. Test Suite 'CellConfigureTests' started at 2014-03-20 01:58:17 +0000  
  4. Test Suite 'CellConfigureTests' finished at 2014-03-20 01:58:17 +0000.  
  5. Executed 0 tests, with 0 failures (0 unexpected) in 0.000 (0.000) seconds  
  6. Test Suite 'MockTableTests' started at 2014-03-20 01:58:17 +0000  
  7. Test Case '-[MockTableTests testNumberOfRows]' started.  
  8. Test Case '-[MockTableTests testNumberOfRows]' passed (0.000 seconds).  
  9. Test Suite 'MockTableTests' finished at 2014-03-20 01:58:17 +0000.  
  10. Executed 1 test, with 0 failures (0 unexpected) in 0.000 (0.000) seconds  
  11. Test Suite 'UnitTestDemoTests' started at 2014-03-20 01:58:17 +0000  
  12. Test Suite 'UnitTestDemoTests' finished at 2014-03-20 01:58:17 +0000.  
  13. Executed 0 tests, with 0 failures (0 unexpected) in 0.000 (0.000) seconds  
  14. Test Suite 'UnitTestDemoTests.xctest' finished at 2014-03-20 01:58:17 +0000.  
  15. Executed 1 test, with 0 failures (0 unexpected) in 0.000 (0.000) seconds  
  16. Test Suite 'Multiple Selected Tests' finished at 2014-03-20 01:58:17 +0000.  
  17. Executed 1 test, with 0 failures (0 unexpected) in 0.000 (0.001) seconds  


下面来编写一个稍微复杂点的mock测试,用来测试UITableViewDataSource中的cellForRowAtIndexPath方法。代码如下:

  1. - (void)testCellConfiguration {  
  2.     // 1.创建Table data source  
  3.     __block UITableViewCell *configuredCell = nil;  
  4.     __block id configuredObject = nil;  
  5.     TableViewCellConfigureBlock block = ^(UITableViewCell *a, id b) {  
  6.         configuredCell   = a;  
  7.         configuredObject = b;  
  8.     };  
  9.     TableDataSource *dataSource = [[TableDataSource alloc] initWithItems:@[@"a", @"b"]  
  10.                                                           CellIdentifier:@"foo"  
  11.                                                       ConfigureCellBlock:block];  
  12.       
  13.     // 2.创建mock table view  
  14.     id mockTableView = [OCMockObject mockForClass:[UITableView class]];  
  15.       
  16.     // 3.设定mock table view的行为  
  17.     UITableViewCell *cell = [[UITableViewCell alloc] init];  
  18.     [[[mockTableView expect] andReturn:cell] dequeueReusableCellWithIdentifier:@"foo" forIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];  
  19. //    [[[mockTableView stub] andReturn:cell] dequeueReusableCellWithIdentifier:@"foo" forIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];  
  20.       
  21.     // 4.主动调用cellForRowAtIndexPath方法  
  22.     id result = [dataSource tableView:mockTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];  
  23.       
  24.     // 5.验证mock table view的行为  
  25.     [mockTableView verify];  
  26.       
  27.     // 6.断言  
  28.     XCTAssertEqual(result, cell, @"Should return the dummy cell.");  
  29.     XCTAssertEqual(configuredCell, cell, @"This should have been passed to the block.");  
  30.     XCTAssertEqualObjects(configuredObject, @"a", @"This should have been passed to the block.");  
  31. }  

1.创建Table data source,用于下文调用cellForRowAtIndexPath方法。

2.创建mock table view。

3.如果mock table view调用了dequeueReusableCellWithIdentifier:@"foo" forIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]方法,那么就返回上面已经创建好的UITableViewCell对象,expect方法表示该方法必须被调用(见5.)。

4.通过Table data source主动调用cellForRowAtIndexPath方法,此时会触发mock table view调用dequeueReusableCellWithIdentifier:forIndexPath:方法。

5.最后要调用verify方法,用于验证mock table view的行为。如果mock table view在某个方法中调用了expect,那么该方法必须在verify之前被调用,否则测试无法通过。如果mock table view调用的是stub,那么verify时OCMock并不关心该方法是否调用过,只会关心调用过程是否发生异常或有测试被拒绝等。

6.断言,在这里进行各种比较。



GHUnit

可能大家都注意到了,在运行测试后,控制台中的输出可以用惨不忍睹来形容。这时我们可以尝试另一个工具:GHUnit框架,这个工具是有GUI的。

首先给出一些参考资料:

gh-unit / gh-unit:该项目在GitHub上的地址。

Installing in iOS (Xcode 4):在Xcode 4上为项目配置GHUnit,相对Xcode 5来说旧了,但是安装过程还是类似的。

guide_testing Document:编写测试的参考文档。


还是以之前的那个项目为例,进行GHUnit的配置,并编写基于该框架的单元测试。


1.配置GHUnit

1.新建一个Target,选中空的工程模板:



2.选中目标工程为本工程:



将新Target中的冗余文件全部删掉,包括AppDelegate.h/.m,GHUnitTestsTests文件夹,GHUnitTestsTests Target等,注意Supporting Files和Images.xcassets要保留:




3.从GitHub中下载GHUnit项目,下载后可以看到有个Project-iOS目录:



然后打开我们可爱的终端,首先cd到Project-iOS目录下,然后输入make命令,成功后的部分提示如下:

[plain] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ** BUILD SUCCEEDED **  
  2.   
  3. BUILD_DIR="build" BUILD_STYLE="Release" sh ../Scripts/CombineLibs.sh  
  4.   adding: libGHUnitIOS.a (deflated 63%)  
  5. sh ../Scripts/iOSFramework.sh  
  6. Framework: Cleaning framework...  
  7. Framework: Setting up directories...  
  8. Framework: Creating symlinks...  
  9. Framework: Creating library...  
  10. Framework: Copying assets into current version...  
  11.   
  12. The framework was built at: build/Framework/GHUnitIOS.framework  

可以看到GHUnit项目路径/Project-iOS/目录下多了个build文件夹,./build/Framework/下面生成的框架就是我们make的目标:



4.回到原来的工程,Command + Option + A,将生成的framework文件添加到工程中。

打开GHUnitTests Target的Build Settings,搜索Other Linker Flags,将其设置为-all_load和-ObjC:


5.打开main.m,删除#import “AppDelegate.h”

将主函数的return修改如下:

  1. return UIApplicationMain(argc, argv, nil, @"GHUnitIOSAppDelegate");  


完成配置。


2.编写GHUnit单元测试

在GHUnitTests中新建一个Objective-C Class,基类为NSObject,名为FirstGHUnitTests。

将FirstGHUnitTests.h删除,修改FirstGHUnitTests.m代码如下:

  1. #import <GHUnitIOS/GHUnit.h>  
  2. #import "TableDataSource.h"  
  3. #import "TableViewController.h"  
  4.   
  5. @interface MyTest : GHTestCase  
  6.   
  7. @end  
  8.   
  9. @implementation MyTest  
  10.   
  11. - (void)testStrings {  
  12.     NSString *string1 = @"a string";  
  13.     GHTestLog(@"I can log to the GHUnit test console: %@", string1);  
  14.       
  15.     // Assert string1 is not NULL, with no custom error description  
  16.     GHAssertNotNil(string1, nil);  
  17.       
  18.     // Assert equal objects, add custom error description  
  19.     NSString *string2 = @"a string";  
  20.     GHAssertEqualObjects(string1, string2, @"A custom error message. string1 should be equal to: %@.", string2);  
  21. }  
  22.   
  23. - (void)testSimpleFail {  
  24.     GHAssertTrue(NO, nil);  
  25. }  
  26.   
  27. - (void)testDataSourceInitializing {  
  28.     TableViewCellConfigureBlock cellConfigureBlock = ^(UITableViewCell *cell, NSString *item) {  
  29.         cell.textLabel.text = item;  
  30.     };  
  31.       
  32.     TableDataSource *tableSource = [[TableDataSource alloc] initWithItems:@[@"1", @"2", @"3"]  
  33.                                                            CellIdentifier:@"TestCell"  
  34.                                                        ConfigureCellBlock:cellConfigureBlock];  
  35.       
  36.     GHAssertNotNil(tableSource, @"TableView data source should not be nil");  
  37. }  
  38.   
  39. @end  

由于 TableDataSource.h和 TableViewController.h属于另一个Target中的文件,所以这里我们要把对应的实现文件加入到本Target的Compile Sources中(否则会报Undefined symbols for architecture i386: _OBJC_CLASS_$的错误):


在Scheme中选中GHUnitTests中的模拟器:


Command + R,可以看到一个测试界面。点击右上角的Run,就可以运行列表中的所有单元测试:


点击表格中的一行,可以查看测试信息(当然控制台也有输出):


对比起使用XCTest框架在控制台的输出好看多了。


Demo下载地址:点此进入下载页



小结

建议使用GHUnit + OCMock组合进行单元测试,功能强大界面美观。当然也有人是用XCTest + xctool + OCMock的,xctool是Facebook出品,应该也是非常强大的工具,但是小弟在机子上用brew一直装不上xctool(暂时还没找到解决方法),所以这里就不说xctool的部分了。


其它参考资料:

XCode下的iOS单元测试

iOS进行单元测试OCUnit+xctool - yingkong1987

XCode下的iOS单元测试

GHUnit的使用


原文

044、Edge Impulse的音频分类实战 上周调试一块STM32WBA52开发板,板载PDM麦克风死活采不到有效数据。示波器怼上去,时钟线波形漂亮得像教科书,数据线却像心电图——全是毛刺。折腾半天发现是电源纹波干扰,给麦克风单独加了个LC滤波,世界清净了。这种坑,做音频分类的嵌入式工程师迟早要踩一遍。 阅读详情

相关推荐

企查查爬取实战

实战成果完成接口定位、抓包参数拆解、签名逆向、报错修复全流程调试,梳理出企查查多层风控逻辑;最终按照搜索分页规则,规范整理出两页共 20 条结构化企业数据,以标准 JSON 格式本地保存,字段完整、数据排版规范。现存局限平台顶层设备指纹与人机验证风控,纯 requests 网络请求模式无法突破;高频请求还存在账号限流、IP 访问限制风险,爬虫稳定性受平台策略影响较大。技术收获。

czr2026的博客 1127

教程:在iOS项目里面集成使用GHUnit。

单元测试的好处不在本文的讨论范畴之内,让我们开门见山直奔主题,讲讲GHUnit的好处与如何集成使用。     一、使用GHUnit能做什么?     总结一下,1、可以进行基本的断点调试和UI交互测试。2、能够测试多线程代码。3、能够捕获和展示你想要测试的数据。4、测试日志log可以看得很清楚。5、非常方便的UI调试功能。     二、开始集成使用             首先,确

三无程序员 1132

复合材料RVE建模与力学性能分析实战指南

代表体积元(RVE)建模是复合材料多尺度分析的核心技术,通过建立微观结构与宏观性能的定量关联,可准确预测材料力学行为。本文基于ABAQUS平台,详细解析三材料(纤维/基体/界面相)RVE建模全流程,包括参数化几何建模、周期性网格划分策略、材料属性定义技巧等关键技术环节。针对碳纤维增强环氧树脂等典型复合材料,提供网格控制参数建议和材料参数参考表,并重点说明周期性边界条件的实现方法与验证标准。通过Python脚本自动化处理和优化分析流程,可显著提升计算效率,为复合材料设计提供可靠仿真依据。

weixin_34062469的博客 547

IOS学习 使用OCMock单元测试(一)安装

这里最先需要说的是OCMock3.2.2需要支持到IOS8.0以上 在终端输入:pod search OCM (前提是本地安装了Pod工具)结果: -> OCMock (3.2.2)    Mock objects for Objective-C    pod 'OCMock', '~> 3.2.2'    - Homepage: http://ocmo

qw25767889的专栏 1534

Ubuntu 22.04下GNU Radio 3.10全家桶编译避坑实录:从UHD、VOLK到WiFi收发模块gr-ieee802-11

本文详细介绍了在Ubuntu 22.04系统下编译安装GNU Radio 3.10全家桶的完整流程,包括UHD驱动、VOLK优化库以及WiFi信号处理模块gr-ieee802-11的集成。通过逐步指导解决版本兼容性和依赖问题,帮助研究人员快速搭建高效的软件定义无线电开发环境,特别适合使用USRP设备进行无线通信研究的开发者。

weixin_30825199的博客 446

【Linux】U盘配置Ubuntu系统 ——(Win10+Ubuntu20.04)双系统安装教程

Ubuntu系统安装

WS_Change的博客 4327

iOS单元测试GHUnit + OCMock(不使用cocoapods版)

GHUnit GHUnit 是一个开源的单元测试框架,具有可视化界面,功能亦相当强大。 OCMock 是由 Mulle Kybernetik 为 OS X 和 iOS 平台编写的遵循 mock object 理念的单元测试框架。 下面来介绍如何配置 GHUnit 和 OCMock 1,首先,创建一个名为 GHUnitProject 的单视图应用程序,注意:不要选中 Incl

wwh19940131的博客 907

DDR内存条选购避坑指南:单Rank vs 双Rank性能实测对比(附2024年颗粒推荐)

本文深入解析了内存条中单Rank与双Rank设计的原理与性能差异。通过实战测试对比,揭示了双Rank内存在高负载场景(如3D渲染、视频剪辑)中凭借Rank Interleaving技术带来的显著性能优势,并提供了2024年针对不同用户需求的DDR4/DDR5内存选购策略与避坑指南。

ik678901的博客 1122

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

本文介绍了iOS开发中的单元测试框架OCMock的集成与使用方法。文章首先阐述了单元测试的必要性和目的,指出单元测试能够有效验证代码逻辑、发现错误并节省开发时间。随后重点讲解了OCMock框架的九大核心功能:方法置换(存根)、Mock对象生成(NiceMock/StrictMock/PartialMock)、方法调用验证、预期设置、参数约束、网络接口模拟、类恢复、观察者模拟和协议模拟。每种方法都配有具体代码示例和使用场景说明,并对比了不同Mock方式的优缺点。最后文章指出OCMock的使用限制,建议开发者参

2401_86343726的博客 1164

AXI_Bus_Matrix_4x4 设计

Signal Source Width(bits) Description AWID Master AWID_WIDTH 写事务ID AWADDR Master

Starry__的博客 3766

RepHead一种重参数化检测头用于提升YOLOv8在困难样本上的检测性能

在目标检测任务中,困难样本通常是指那些由于特殊背景、遮挡、低分辨率或极度小物体等因素,导致模型难以识别的样本。这类样本对传统YOLO系列模型的影响较大,常常造成漏检或误检。重参数化(Reparameterization)是一种深度学习中常用的技术,旨在通过对网络参数的变换,使得模型在训练过程中能够更加灵活地适应不同的数据特征。通过对原始网络结构的参数进行重新表达,能够引导模型在训练过程中学习到更加有效的特征。本文详细介绍了YOLOv8的改进——RepHead检测头,并深入分析了它在解决困难样本检测中的应用。

博客 1209

XCode 下的 iOS 单元测试

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

飘飘白云 1万+

198、影像系统设计评审流程:从需求评审到 EVT、DVT、PVT 各阶段的关注重点

本文详细介绍了影像系统从需求评审到EVT、DVT、PVT各阶段的设计评审流程及关键点。作者通过实际案例(如IMX766模组偏紫问题)强调硬件工艺的重要性,指出影像系统是功能定义与物理实现的反复拉锯过程。文章分阶段解析:需求评审需将模糊需求转化为物理参数;架构评审要明确接口定义和时序约束;EVT阶段重点关注模组一致性和基础链路;DVT阶段需平衡算法调优与硬件验证;PVT阶段则以量产一致性为核心。最后提出建立"边界条件确认表"和"健康度看板"等实用建议,强调工程师需具备从表象追溯硬件根源的物理直觉。全文贯穿实战

sundong_81的博客 216

Cocoapods + GHUnit + OCMock 实现iOS单元测试

存在只是合理, 并不一定是对的 就像我们现在做iOS没有写单元测试… 负罪感太强烈了.. 觉得还是尽量写吧… 过程(这段可以跳过) 首先我尝试了Xcode自带的单元测试, 很简单, 也能用, 主要是方便, 不过还是建议用一用GHUnit, 这么多人推荐可不是浪得虚名的… 更高级的还有Cocoapods + Jenkins + GHUnit的方式, 我就没试了… 随便给个链

tyforfreedom的专栏 931

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

iOS测试-(二)OCMock和GHUnit

在Xcode 5 单元测试(一)使用XCTest进行单元测试中说了如何在Xcode 5中使用XCTest进行简单的单元测试,本文就来探讨下mock测试和更高级的工具GHUnit。Mock首先科普下什么是mock测试。mock测试是个很神奇而又很酷的技术,在测试过程中,对于一些不容易构造或不容易获取的对象,此时你可以创建一个虚拟的对象(mock object)来完成测试。例如你可能要尝试100次才会

Colin丶 2594

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

IOS 下自动化测试框架 GHUnit 和 OCMock 初探 [一]

IOS下自动化测试的框架主要有 OCUnit, GHUnit ,KIF,Kiwi等。OCUnit 是XCode自带的测试框架。下面我将给大家介绍 另一个强大的 测试框架 GHUnit 相比自带的ocunit,GHUnit可以兼容ocunit的语法,并提供了异步测试的方法。测试target是一个独立的app,可以加断点和可以在真机上运行。可以使用GHAsyncTestCase 支持异步测试。

小九爸爸 1972

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

OCUnit和GHUnit和OCMock

XCode 内置了 OCUnit 单元测试框架,但目前最好用的测试框架应该是 GHUnit。通过 GHUnit + OCMock 组合,我们可以在 iOS 下进行较强大的单元测试功能。本文将演示如何在 XCode 4.2 下使用 OCUnit, GHUnit 和 OCMock 进行单元测试。 OCUnit 在 XCode 下新建一个 OCUnitProject 工程,选中 Includ

zj895033546的博客 425

XCode下的iOS单元测试

From: http://mobile.51cto.com/iphone-337270.htm XCode 内置了 OCUnit 单元测试框架,但目前最好用的测试框架应该是 GHUnit。通过 GHUnit + OCMock 组合,我们可以在 iOS 下进行较强大的单元测试功能。本文将演示如何在 XCode 4.2 下使用 OCUnit, GHUnit 和 OCMock 进行单元测...

移动开发 121

OCUnit and GHUnit

XCode 内置了 OCUnit 单元测试框架,但目前最好用的测试框架应该是 GHUnit。通过 GHUnit + OCMock 组合,我们可以在 iOS 下进行较强大的单元测试功能。本文将演示如何在 XCode 4.2 下使用 OCUnit, GHUnit 和 OCMock 进行单元测试。 OCUnit 在 XCode 下新建一个 OCUnitProject 工程,选中 Include Un

倾城一屁,博妹一笑。 2584

iOS单元测试——OCUnit, GHUnit

XCode 内置了 OCUnit 单元测试框架,但目前最好用的测试框架应该是 GHUnit。通过 GHUnit + OCMock 组合,我们可以在 iOS 下进行较强大的单元测试功能。本文将演示如何在 XCode 4.2 下使用 OCUnit, GHUnit 和 OCMock 进行单元测试。 OCUnit 在 XCode 下新建一个 OCUnitProject 工程,选中 Includ

Secret Island 988
上一篇: Xcode5 使用XCTest进行单元测试
下一篇: iOS runtime (1)
focusjava
博客等级 码龄14年 127粉丝 528原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值