文档章节

iOS进行单元测试OCUnit+xctool

hejunbinlan
 hejunbinlan
发布于 2015/06/04 13:11
字数 1579
阅读 137
收藏 3

感谢原作者    原文出处: http://iiiyu.com/2013/05/23/learning-ios-notes-twenty-three/


单元测试

什么是单元测试

wiki解释

简单说来就是为你的方法多专门写一个测试函数。以保证你的方法在不停的修改开发中。保持正确。如果出错,第一时间让你知道,这样从最小单位开始监控来保证软件的质量。

我为什么要单元测试

其实要开始写单元测试的原因是,由于我的原因格志的存储逻辑一直有问题。 一个是代码写的比较搓,一个是修改存储的逻辑的话。影响面比较大。可能修复了一个bug而引入了未知的多个bug。为了Sumi早日达到国际化大厂的标准。决定上单元测试于格志。其实最根本的目的还是想要项目变的更加可靠。

单元测试的一般方法

关于测试的书,一搜就一大把。都有高深的理论和方法来指导怎么写单元测试的方法。我觉得嘛不用搞了这么复杂。 无非就3种时候会去想写测试:

  1. 代码完成以后

  2. 开始写代码之前

  3. 修复了一个bug以后

第一种是完成了代码,恩我要测试一下我写的这些方法可靠不可靠。那这时候可以写测试。

第二种一个著名的方法论TDD。主要思想就是在写代码之前,就全部设计好借口。函数名字什么的。然后在写能通过测试的函数。

第三种就是发现了bug,我修复了这个bug。为了确保修复是成功的。那就写个测试吧。

我觉得啊,着三种都没有什么好或差。能写测试的少年都是好少年。何必这么在意什么时候去写呢。

一个完整的测试类组成像下图

在一开始可能测试方法里面需要一些上下文环境。这些可以在Setup里面去完成。然后才可是执行自己写的测试方法。 然后测试结束以后,可能产生了一些垃圾数据文件什么的。这时候你可以在TearDown方法里面把他们处理掉。

以上大部分都是我自己的粗浅理解,如果你需要更多关于单元测试请阅读更加系统专业的书籍。

OCUnit

OCUnit是xCode里面自己带的单元测试框架。不必安装第三方的其他库就可以使用。最简单的就是创建项目的时候你把单元测试的那个勾点上。xCode就会自动的为你加入一个单元测试的target。快捷键Command + U。就可以运行测试。最喜欢这样方便又好用的东西了。当然运行OCUnit的测试输出的内容实在惨不忍睹。

创建一个OCUnit的Unit Test

新项目使用OCUnit

选上Unit Test

会自动的建立一个Target

自动的为你添加好需要的类库

为你添加一个Unit Test的类

看一眼Scheme 只有一个。

看看Scheme里面是怎么写的。

用Command + U运行一下测试看看结果。这是没有通过的。因为自动生成的模板就是不通过的。具体一会儿分析代码。

看看终端的输出。渣一般的难看。根本无法高识别度的分清。

已经存在的项目使用OCUnit

这是一个一开始没有选择过Unit Test的项目

点击增加Target

选择Unit testing Bundle

为我们的测试bundle取一个名字

我们可以看到Scehme多出来了一个。这时候如果选择的是App的Scehme。Command + U。是没有运行测试的。要选择我们新建立的Test Scehme。再按Command + U.就运行了测试了。

如何为App的Scehme添加Test。使得不用切换Scehme,就可以运行Unit Test。

然后选择你建立的Unit Test bundle。 打完收工。

OCUnit使用的宏

STAssertEqualObjects(a1, a2, description, …)

STAssertEquals(a1, a2, description, …)

STAssertEqualsWithAccuracy(a1, a2, accuracy,description, …)

STFail(description, …)

STAssertNil(a1, description, …)

STAssertNotNil(a1, description, …)

STAssertTrue(expr, description, …)

STAssertTrueNoThrow(expr, description, …)

STAssertFalse(expr, description, …)

STAssertFalseNoThrow(expr, description, …)

STAssertThrows(expr, description, …)

STAssertThrowsSpecific(expr, specificException, description, …)

STAssertThrowsSpecificNamed(expr, specificException, aName, description, …)

STAssertNoThrow(expr, description, …)

STAssertNoThrowSpecific(expr, specificException, description, …)

STAssertNoThrowSpecificNamed(expr, specificException, aName, description, …)

比较经常使用的宏

STAssertTrue(expr, description, …)
STAssertFalse(expr, description, …)
STAssertNil(a1, description, …)
STAssertNotNil(a1, description, …)
STAssertEqualObjects(a1, a2, description, …)
STAssertEquals(a1, a2, description, …)
STFail(description, …)
STAssertThrows(expr, description, …)

写了几个测试方法的例子

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
- (void)testOne {	NSString *string1 = @"test";	NSString *string2 = @"test";	STAssertThrows([string1 isEqualToString:string2], @"FAILURE");}- (void)testTwo{    int i = 0;    int j = 1;    STAssertTrue(i < j, @" i: %d, j: %d", i,j);}- (void)testThree{        NSString *oneStr = @"hello";    NSString *twoStr = @"world";    STAssertFalse([oneStr isEqualToString:twoStr], @"oneStr:%@, twoStr:%@", oneStr, twoStr);}- (void)testFour{    NSArray *array = nil;    STAssertNil(array, @"array:%@", array);}- (void)testFive{    NSDictionary *dict = @{@"hello": @"word"};    STAssertNotNil(dict, @"dict:%@", dict);}- (void)testSix{    NSNumber *oneNum = @100;    NSNumber *twoNum = @200;    STAssertEqualObjects(oneNum, twoNum, @"oneNum:%@ twoNum:%@",oneNum, twoNum);}- (void)testSeven{    NSArray *oneArray = @[@11, @22, @33];    NSArray *twoArray = [oneArray copy];    STAssertEqualObjects(oneArray, twoArray, @"oneArray:%@, twoArray:%@", oneArray, twoArray);}- (void)testEight{    NSUInteger uint_1 = 4;	NSUInteger uint_2 = 4;	STAssertEquals(uint_1, uint_2, @"FAILURE");}        - (void)testExample{    STFail(@"Unit tests are not implemented yet in HelloAfterAddOCUnitUnitTest");}

一会儿用xctool跑个华丽丽的出来看。

xctool

xctool是什么

xctool是Facebook开源的一个命令行工具,用来替代苹果的xcodebuild工具。

github

官方演示

你可以用它来Build你的App。跑Tests。而且它跑Test输出是华丽丽的彩色。比xCode自带的不知好看多少倍。OCUnit本来被吐槽无数,遇上了xctool以后就逆袭了啊。

世界上最最牛的SNS出品,肯定不会坑爹啊。

安装xctool

最方便 最推荐的是用Homebrew。如果你的Mac里面没有安装Homebrew我觉得是你的损失。

12
brew updatebrew install xctool

使用xctool来跑OCUnit测试

关于如何使用xctool,你去看官方文档肯定要比我结束好的多。 我就是过来跑测试的例子给你看而已。

测试一

1
xctool -project HelloOCUnit.xcodeproj -scheme HelloOCUnit  test

测试二

123
xctool -project HelloAfterAddOCUnit.xcodeproj -scheme HelloAfterAddOCUnit  testxctool -project HelloAfterAddOCUnit.xcodeproj -scheme HelloAfterAddOCUnitUnitTest  test

项目一下载

项目二下载

总结

以上就是OCUnit的使用建议。建议OCunit+xctool。来进行你的单元测试构建。更多信息请阅读相关资料。我这里只是写了入门而已。接下来的测试之路就靠你了。


本文转载自:http://blog.csdn.net/sqc3375177/article/details/40857313

hejunbinlan
粉丝 42
博文 596
码字总数 21569
作品 0
浦东
高级程序员
私信 提问
10 个免费的移动 App 测试框架 (Android/iOS)

功能测试框架 #1: KIF for iOS KIF 的全称是 Keep It Functional ,来自 Square。该测试框架只支持 iOS,所有测试使用 Objective-C 编写,简化了 App 开发者使用。 #2: Fliptest – iOS 的应...

oschina
2013/09/20
15.5K
4
那些在学习iOS开发前就应该知道的事(part 2)

英文原文:Things I wish I had known before starting iOS development—Part 2 如果你还没读这篇文章的第一部分,请先读完了再来看第二部分。 那些在学习iOS开发前就应该知道的事(part 1)...

TomatosX
2015/06/12
132
0
国内知名互联网电商北京招聘无线方面资深java、ios开发

Java高级开发工程师/Java开发工程师 部门:无线业务 工作地点:北京 薪资:12-25k 岗位职责: 1. 负责需求分析和设计、Java核心代码开发和单元测试,对代码质量和进度负责; 2. 带领并指导...

Ken.yuan
2011/12/14
501
2
面试官自述:面向高级开发人员的iOS面试问题

当您准备进行技术性iOS面试时,了解您可能会询问哪些主题以及经验丰富的iOS开发人员期望什么是非常重要的。 这是许多硅谷公司用来衡量iOS候选人资历水平的一系列问题。 这些问题涉及iOS开发的...

菇哒微课
2018/04/26
0
0
spring mvc 单元测试

最近在写单元测试,遇到一些坑和大家分享一下。 之前我们一直有service层的单元测试,但是没有action层的单元测试,正好我们用到spring mvc,所以就用了spring-test做单元测试, spring mvc...

internetafei
2014/12/25
127
0

没有更多内容

加载失败,请刷新页面

加载更多

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
今天
58
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
今天
27
0
全世界到底有多少软件开发人员?

埃文斯数据公司(Evans Data Corporation) 2019 最新的统计数据(原文)显示,2018 年全球共有 2300 万软件开发人员,预计到 2019 年底这个数字将达到 2640万,到 2023 年达到 2770万。 而来自...

红薯
今天
61
0
Go 语言基础—— 通道(channel)

通过通信来共享内存(Java是通过共享内存来通信的) 定义 func service() string {time.Sleep(time.Millisecond * 50)return "Done"}func AsyncService() chan string {retCh := mak......

刘一草
今天
57
0
Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速...

Vincent-Duan
今天
50
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部