iOS进行单元测试OCUnit+xctool

感谢原作者    原文出处: 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, …)

写了几个测试方法的例子

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61
- (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我觉得是你的损失。

1

2
brew update

brew install xctool

使用xctool来跑OCUnit测试

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

测试一

1
xctool -project HelloOCUnit.xcodeproj -scheme HelloOCUnit  test

测试二

1

2

3
xctool -project HelloAfterAddOCUnit.xcodeproj -scheme HelloAfterAddOCUnit  test

xctool -project HelloAfterAddOCUnit.xcodeproj -scheme HelloAfterAddOCUnitUnitTest  test

项目一下载

项目二下载

总结

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

时间: 2024-10-12 09:44:04

iOS进行单元测试OCUnit+xctool的相关文章

iOS开发 使用OCUnit对程序进行单元测试(UnitTest)

所谓单元测试(又称为模块测试, Unit Testing)就是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作. 其实在我们开发的程序实现某个功能的时候我们也有进行测试.只不过,你是在项目代码中直接写的方法,而且在测试的时候,也是点点点,点到相应的界面才触发相应的方法,进行测试,这测试效率,想想也是醉了,不过还好能正常测试,但是如果你想控制不同的输入参数呢?好,你说直接写入到程序.但是,你测试完成了之后呢?好,你说那就注释掉啊.但是,如果后面你改动了又需要再测试一此呢?其实,说了这么

iOS 开发-单元测试

前言 维基百科对单元测试的定义如下: 在计算机编程中,单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作.程序单元是应用的最小可测试部件. 在过程化编程中,一个单元就是单个程序.函数.过程等:对于面向对象编程,最小单元就是方法,包括基类(超类).抽象类.或者派生类(子类)中的方法. 根据不同场景,单元的定义也不一样,通常我们将C语言的单个函数或者面向对象语言的单个类视作测试的单元.在使用单元测试的过程中,我们要知道这一点:

ios shell打包脚本 xctool

#! /bin/bash project_path=$(dirname $0) project_config=Release output_path=~/Desktop build_scheme=YKTicketsApp workspace_name=YKTicketsApp parameter=":p:c:o:s:w:h:" while getopts $parameter optname do case "$optname" in "p" )

iOS UI单元测试编码问题

中文自动生成uitests字符乱码问题 目前查阅资料只有\U变成\u,可以用查找工具替换掉,生成的unicode编码也可以直接用中文替换;

iOS单元测试

图前内容转载自:slegetank 开始之前 本文侧重讲述如何在iOS程序的开发过程中使用单元测试.使用Xcode自带的OCUnit作为测试框架. 一.单元测试概述 单 元测试作为敏捷开发实践的组成之一,其目的是提高软件开发的效率,维持代码的健康性.其目标是证明软件能够正常运行,而不是发现bug(发现 bug这一目的与开发成本是正相关的,虽然发现bug是保证软件质量的一种手段,但是很显然这与降低软件开发成本这一目的背道而驰).它是对软件质量的一 种保证,例如重构之后我们需要保证软件产品的正常运行

iOS中的单元测试(一)

转载自http://www.infoq.com/cn/articles/ios-unit-test-1 导读:本文不讨论单元测试是什么,或者它之于一个工程的利弊,我认为单元测试是一个开发者保证产出代码质量的有效工具.本文从使用者的角度对比当下比较流行的两款单元测试框架,给大家提供一些选用建议.如果你还不甚了解单元测试在工程中所起到的作用,或者还不知道TDD的开发模式,可参考:Test-Driven Development和Unit Testing. 本文对比两个iOS开发中常见的单元测试框架:O

iOS开发之单元测试

开始之前 本文侧重讲述如何在iOS程序的开发过程中使用单元测试.使用Xcode自带的OCUnit作为测试框架. 一.单元测试概述 单元测试作为敏捷开发实践的组成之一,其目的是提高软件开发的效率,维持代码的健康性.其目标是证明软件能够正常运行,而不是发现bug(发现bug这一目的与开发成本是正相关的,虽然发现bug是保证软件质量的一种手段,但是很显然这与降低软件开发成本这一目的背道而驰).它是对软件质量的一种保证,例如重构之后我们需要保证软件产品的正常运行. 很多人认为编写单元测试没有用是认为单元

XCode下的iOS单元测试

XCode 内置了 OCUnit 单元测试框架,但目前最好用的测试框架应该是 GHUnit.通过 GHUnit + OCMock 组合,我们可以在 iOS 下进行较强大的单元测试功能.本文将演示如何在 XCode 4.2 下使用 OCUnit, GHUnit 和 OCMock 进行单元测试. OCUnit 在 XCode 下新建一个 OCUnitProject 工程,选中 Include Unit Tests 选择框, OCUnit 框架则会为我们自动添加 Unit Test 框架代码: XCo

浅谈iOS单元测试

什么是单元测试? 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证.对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等.总的来说,单元就是人为规定的最小的被测功能模块. iOS中单元测试有什么意义? 大型项目开发,功能比较繁琐,代码量比较大,调试某一块功能需要不断的Command+R运行调试,很显然这样的功能是非常非常的低效的,编写过程中以及App功能完成后