http://www.uml.org.cn/mobiledev/201201093.asp

本地还有个。中文的官方文档。。

长按Run,选择Test。。然后就success喽

 

 
 

Xcode Unit Testing

Tool > Xcode
Vaan • 2009年8月5日

 

Vaan • 电子邮件: ashelia@qq.com 1

 

目录
简介! 2

文档组成 2 将单元测试融入你的工程! 3

配置Xcode工程 3 依赖VS独立 3 创建测试目标 4

创建依赖型的测试目标! 4 将测试用例加入测试目标 5 运行测试 6

使用Obj-C创建测试用例 6 创建测试用例类 6 编写测试用例类 6 管理公用的测试数据 7 常用的宏 8

在Obj-C 中使用Macro! 8 单元测试指南! 9

Vaan • 电子邮件: ashelia@qq.com 1

 

简介

  • !  注意:这还不是一份正式的文档,可能随时更改其中的内容。

  • !  原文地址

  • !  PS:因为我对CPP不熟,所以CPP的部分没有翻译,请见谅。 文档组成

 
 

Vaan • 电子邮件: ashelia@qq.com 2

 

将单元测试融入你的工程

! 从版本2.1开始,Xcode就包含了多种开源的单元测试模块。这些模块都已 被整合进Xcode Tools中,同Xcode一起安装在你的Mac中。你可以通过这些模块向 你的程序中添加自动的单元测试。

! 注意:暂时不支援iPhone OS的应用程式的单元测试。 配置Xcode工程

! 进行单元测试的第一步就是在你的工程中创建一个用于构造和运行测试 的新目标。在Xcode里,你创建一个类型为“Unit Test Bundle”的目标。当联编时, 它会编译你的测试代码和执行一个shell脚本来运行你的测试。在完成所有的测试 后,失败的测试将作为错误在Xcode的控制台中打印。

! 当你配置你的测试目标时,你应该确定你希望你的目标拥有怎样的行 为。你可以以两种不同的执行方式将单元测试包整合进你的Xcode中。一种是配 置你的测试目标脱离你的主执行,以一个独立实体的方式构造与运行测试。另 一种则是你的测试目标依赖于你的主执行,当你每次构造测试目标时都自动的 构造主执行以运行你的测试。

依赖VS独立
! 当你编写测试代码时,你需要决定你的测试目标是独立还是依赖于主执

行。对于这两种方式的优点与缺点,请参考下表。 ! 表1! ! 目标的不同配置的优与缺

 
 
 
 

目标类型

 
 

 
 

独立

容易建立,仅在需要时运行。
 
 
只能手动运行,频繁使
用时不够便捷。
 
 

依赖

容易自动的运行测试。同时,允许选
择与主执行分开。
 
 
建立时需要更多的附加
步骤。
 
 
 
 
 

! 如果你是使用Obj-C,那么在配置依赖型测试目标时也只需要很少的步 骤。相对的,如果使用C/CPP,虽然配置起来会稍显复杂,但还是比较直观的。

Vaan • 电子邮件: ashelia@qq.com 3

 

创建测试目标

! 不管你选择何种类型的测试目标,初始化步骤都是相同的: 1. 打开你的Xcode工程

2. 选择Project > New Target 3. 选择要求的目标类型:

•如果是Obj-C项目,选择Cocoa > Unit Test Bundle target •如果是C/CPP项目,选择Carbon > Unit Test Bundle target,

对于此目标你不需要使用到Carbon库。 4. 键入名称,点击Finish

! 测试目标被初始化的配置为独立目标。如果这就是你要的,那么你就可 以将你的测试用例类加入目标开始构建了。如果你要建立依赖型的目标,那么 继续往下看:

创建依赖型的测试目标

  • !  要创建依赖型的目标,需要遵循以下的步骤:

    1. 选择你的Unit Test Bundle target

    2. 打开target的inspector

    3. 选择general视图

    4. 单击窗口上的+号

    5. 在出现的对话框,选择你依赖的目标,之后点击Add targe。

  • !  如果你构建的是一个应用程序,那么你还必需增加两个步骤,在Bundle Loader和Test Host 的设置中添加你的应用程序的可执行文件的路径。举例来说, 假如为你的应用程序”MyApp.app”配置路径,那么就遵循以下的步骤:

    1. 选择你的Unit Test Bundle target

    2. 打开target的inspector

    3. 选择build视图

    4. 在选择Linking项

Vaan • 电子邮件: ashelia@qq.com 4

 

!

5. 双击Bundle Loader,键入以下字符:”$(BUILT_PRODUCTS_DIR)/ MyApp.app/Contents/MACOS/MyApp”。

  1. 选择Unit Testing

  2. 双击Test Host,键入以下字符:”$(BUILT_PRODUCTS_DIR)/

MyApp.app/Contents/MACOS/MyApp”。 注意:如果你将要测试的是一个框架或者共享库,那么不需要在Test Host

 

中键入上述字符。

! 在一般默认的情形中,Bundle Loader和Test Host并不需要设置上述的内 容。设置Bundle Loader 是为了在连接期时告诉连接器以一个附加框架的方式来对 待指定的执行。(它有助于帮助你在构建你的测试目标时,预防与应用程序类 的未解决的关联。)设置Test Host 则是告诉RunUnitTests脚本(在最后构建阶段 被同步执行) 运行指定的应用程序以及将你的测试文件包注入到其中。

! 在配置完你的测试目标之后,你应该将你的测试用例源文件加入它,使 它成为可活动的目标。下次你构建时,Xcode 将会首先检查你的依赖形测试目标 并构造你的主执行,接着是你的测试目标,再然后运行你的测试。这样的处理 使你的主代码被构建并且相应的测试一定被运行。

! 注意:对于依赖型测试目标,你只能将你的测试用例源文件加入你的目 标。不要加入其他任何的来自于你的主执行的源文件。当测试在执行时,测试 目标文件包会被注入到执行,到时它将会访问测试所要求的任何源代码。

将测试用例加入测试目标

! 在上述的事情做完之后,显然我们需要将测试用例加入测试目标中了。 测试用例会在你的主执行中测试代码块并且报告结果。这之后,就可以将测试 用例返回的结果进行分析了。如果结果符合预期,那么自然测试成功,否则, 就是失败了。

! 注意:如果你的测试目标是独立于你的主执行,你还必须将你想要测试 的源代码加入到你测试目标中。只需将你要被测试的源代码拖入到你的测试目 标内的compile sources里。对于依赖型的测试目标,你就不需要如此做了。

! 注意:此项注意不在源文档中,是我另外添加的说明。当进行的测试是 独立型测试时,如果源文件需要连接到第三方或者外部的库时,同样需要将这 些库拖到你的测试目标内的Link Binary With Libraries里。

 
 
 
 
 
 
 
 
 
 

Vaan • 电子邮件: ashelia@qq.com 5

 

运行测试 使用Obj-C创建测试用例

创建测试用例类

! 对于Obj-C来说,测试用例继承自SenTestCase。在Xcode中创建请参考以下 步骤:

  1. 选择File > New File。

  2. 在文件类型对话框中,选择 Cocoa > Objective-C test case 类,点击

Next。

  1. 输入一个名字,并且确保同时创建了匹配的头文件。

  2. 将类拖到你的测试目标。别放到你的主执行目标里。

  3. 点击Finish。

! 做完以上这些,你创建的类的头文件描述看起来应该是以下这样: #import <SenTestingKit/SenTestingKit.h>
@interface MyTests :SenTestCase
{

}
@end
! 现在,你可以开始实现你的测试用例了。

编写测试用例类

! 事实上,测试方法都会被自动运行,而你只需遵循一些准则,专注于你 的测试用例方法的编写即可。你的测试用例方法必须遵循以下这些准则:

1. 方法名必须以test开头。举例来说,可以是testCase1, testMyBoundsChecking, testMyAlgorithm。

2. 方法不能携带任何的参数。

3. 方法的返回类型必须为void。

! 因此,例如方法testCase1就像如下这样被实现:
Vaan • 电子邮件: ashelia@qq.com 6

 

-(void) testCase1 {
//代码
}

! 基于上述准则定义的方法会被动态的发现并且自动执行。你不需要做任 何事,例如注册你测试或者明确的指示如何调用这些方法。

! 你必须在测试方法里构造你的所有测试数据,在测试完之后,释放这些 数据。如果测试成功,那么测试用例方法将会正常的退出。若是测试失败,你 可以使用宏(定义在SenTestingKit框架中)来得到失败的原因。

管理公用的测试数据

! 当你拥有多个测试用例,而这些用例又使用一些相同的数据结构,那么 你不需要在每个的测试方法中重复那些创建和销毁这些公用测试数据的代 码。SenTestCase 类定义了两个方法用于管理这些公用的测试数据:setUp和 tearDown,它们会在测试用例方法执行的前后被执行。你可以在你的测试用例类 中重载这些方法。它们以以下的方式被实现:

- ( void ) setUp {

//创建测试数据 }

- ( void ) tearDown {

//释放测试数据 }

! 在运行期,setUp方法会在每一个测试用例方法执行之前执行。同 理,tearDown方法将在每一个测试用例执行之后被执行。tearDown方法会将你的 测试数据的值重置。举个例子,为了安全,有时你会希望希望你的所有对象指 针被设为nil。

Vaan • 电子邮件: ashelia@qq.com 7

 

常用的宏

! SenTestingKit 框架定义许多断言宏,能够方便的使你判断测试的成功与失 败。这些宏均被定义在此框架的SenTestCase.h的头文件中,下表列出的是一些最 为常用的宏:

STAssertNotNil ( a1, description, ...) STAssertTrue (expression , description, ...) STAssertFalse (expression , description, ...) STAssertEqualObjects (a1,a2,description,...) STAssertEquals (a1,a2,description,...) STAssertThrows (expression,description,...) STAssertNoThrow (expression, description,...) STFail (description,...)

! 每个宏的description 参数用于当断言失败时,显示一段可以被阅读的字符 串。字符串使用NSString ,同时支援以格式化的方式输出此次测试中实际和预期 的参数值。以下列表举例说明如何在代码中使用这些断言。

在Obj-C 中使用Macro -(void ) testObjectCreation

{
MyObject* theObj = [[MyObject alloc] init];
STAssertNotNil(theObj , @”Could not create instance of my object.”);

}
-(void) testObjectsAreEqual {

NSNumber* theObj =[NSNumber numberWithInt:1]; NSNumber* theObj2=[NSNumber numberWithInt:1];

Vaan • 电子邮件: ashelia@qq.com 8

 

STAssertEqualObjects(theObj,theObj2,@”Objects were not equal.Value 1:%d value 2: %d”,[theObj intValue],[theObj2 intValue]);

}

! 需要关于这些宏的更详细的资料,可以翻阅其文档,可以在SenTestingKit 框架的Resources 目录下查看到。

单元测试指南

Vaan • 电子邮件: ashelia@qq.com 9