使用OCUnit测试框架iOS单元测试框架

原则上,是否使用测试框架都不会影响单元测试结果,但是“工欲善其事,必先利其器”使用单元测试框架更便于我们测试和分析结果。

主要的iOS单元测试框架有:

OCUnit,是开源测试框架,与Xcode工具集成在一起使用非常方便,测试报告以文本形式输出到输出窗口;

GHUnit,是开源测试框架,它可以将测试报告以应用形式可视化输出到设备或模拟器上,也可以以文本形式输出到输出窗口;GHUnit可以测试OCUnit编写的测试用例;

OCMock,是开源测试框架,它主要为测试提供Mock对象(伪对象)。

添加OCUnit到工程

添加OCUnit到工程中有两种方法,一种是在创建工程时添加,勾选“include Unit Tests”;另一种是在现有工程中添加“Cocoa Touch Unit Testing Bundle”Target来实现。下面我们详细介绍这两种添加过程。

1、创建工程时候勾选“include Unit Tests”

该种方式添加的单元测试属于应用测试(Application Testing)。在创建一个工程时,如果采用“Single View Application”模板,在选项中勾选“include Unit Tests”即可在工程中添加OCUnit框架。

iOS开发那些事--OCUnit测试框架 _iOS测试框架

工程创建完,在导航面板中会多一个PITaxTests组(<工程名>Tests),包含PITaxTests测试类。在右边的Target栏中多了一个PITaxTests Target。

iOS开发那些事--OCUnit测试框架 _iOS测试_02

但是打开Scheme列表还只有一个PITax,这是我们需要注意的。运行它可以通过:选择菜单Product→Test或工具栏中Test按钮(下拉Run按钮选择)或快捷键command+U等几种方式。

如果打开Frameworks组会发现添加了SenTestingKit.framework,SenTestingKit.framework就 是OCUnit框架。因为单元测试框架一般命名为xUnit,如Java的单元测试框架是JUnit,.NET单元测试框架是NUnit等,OCUnit 是Objective-C单元测试框架之意。

2、现有工程中添加Target实现

该种方式添加的单元测试,属于逻辑测试(Logic Testing)。在一个现有工程中,选择菜单File→New→Target…,选择模板iOS→Other中的 “Cocoa Touch Unit Testing Bundle”。

iOS开发那些事--OCUnit测试框架 _iOS测试框架_03

点击Next按钮,在Product Name项目中输入LogicTest,创建完成后,在导航面板中多出了一个LogicTest组,包含LogicTest测试类。在右边的Target栏中多了一个LogicTest Target。

iOS开发那些事--OCUnit测试框架 _iOS开发_04

与上一种添加方式不同的是,在Scheme列表中会添加一个LogicTest,这也是我们需要注意的,这也是应用单元测试和逻辑单元测试的另一个 不同之处。运行它需要选择Scheme中LogicTest的iPhone 6.0 Simulator(或iPad 6.0 Simulator)运行,但是不能选择iOS Device,逻辑单元测试只能在模拟器中运行。然后再选择菜单Product→Test、工具栏中Test按钮(下拉Run按钮选择)和快捷键 command+U等几种方式运行。

无论那种方式添加,默认生成的测试类基本都是一样的,下面代码是默认生成的LogicTest测试类中的LogicTest.h和LogicTest.m文件。

 

  1. // 
  2.  
  3. //  LogicTest.h 
  4.  
  5. //  LogicTest 
  6.  
  7. // 
  8.  
  9. #import <SenTestingKit/SenTestingKit.h> 
  10.  
  11.   
  12.  
  13. @interface LogicTest : SenTestCase 
  14.  
  15.   
  16.  
  17. @end 
  18.  
  19. // 
  20.  
  21. //  LogicTest.m 
  22.  
  23. //  LogicTest 
  24.  
  25. // 
  26.  
  27. #import “LogicTest.h” 
  28.  
  29.   
  30.  
  31. @implementation LogicTest 
  32.  
  33.   
  34.  
  35. - (void)setUp 
  36.  
  37.  
  38. [super setUp]; 
  39.  
  40. // Set-up code here. 
  41.  
  42.  
  43.   
  44.  
  45. - (void)tearDown 
  46.  
  47.  
  48. // Tear-down code here. 
  49.  
  50. [super tearDown]; 
  51.  
  52.  
  53.   
  54.  
  55. - (void)testExample 
  56.  
  57.  
  58. STFail(@”Unit tests are not implemented yet in LogicTest”); 
  59.  
  60.  
  61.   
  62.  
  63. @end 

作为OCUnit测试类需要引入<SenTestingKit/SenTestingKit.h>头文件,并继承 SenTestCase父类。testExample方法是一般的测试方法,方法名必须test开头,测试方法的个数没有限制,方法中STFail是 OCUnit框架定义的一个宏,是无条件断言失败,实际使用时候要修改这个方法中的代码。

在m文件中需要重新方法setUp和tearDown,我们自己编写的测试类一样,setUp方法是初始化方法,tearDown方法是释放资源的 方法,setUp和tearDown方法在每次调用测试方法之前和之后调用,因此在测试类运行的生命周期中这两个方法可能多次运行,它们的时序图

iOS开发那些事--OCUnit测试框架 _OCUnit_05