iOS单元测试1
iOS单元测试分为两种类型的测试:
- 应用测试。应用程序测试可以检查app的代码组件,比如计算机的算术运算的例子。你可以利用应用程序测试来确保你的UI空间控件保持原有位置,并且你的控件和控制器对象能够和对象模型正确地工作。
- 逻辑测试(库测试)。逻辑测试可以检查独立代码的行为是否正确。利用逻辑测试,你可以将整个库的组件放在一起进行测试,通常测试对象是对象和方法。
- 性能测试:所谓性能测试,主要是评估一段代码运行的时间.(自己添加的,个人觉得应该也属于一类测试把)。性能测试的格式:
- (void)testPerformanceExample { [self measureBlock:^{ // Put the code you want to measure the time of here. }]; }
例如要评估一段代码
如何创建测试类?
打开Xcode的导航面板,然后选择测试栏,就是感叹号后面那个。我们会看到左下角有一个加号,点击即可添加测试类。新建的时候需要注意:其中的Subclass of一栏中的父类是XCTestCase。所有测试类都是XCTest框架XCTest类的子类。
我们会看到测试类中有两个方法最常见:
setup
tearDown
这两个方法是必须得。如果类中所有的测试方法都需要相同的代码,你可以定制setUp和tearDown来包含这些代码。
测试执行的流程
在执行测试的过程中,XCTest找到所有继承与XCTestCase的类,为每一个类运行他们的测试代码。对于每个测试类来说,测试开始与运行类setup方法。对于每个测试方法来说,一个新的类实例被创建,它的实例setup方法就会执行。在执行完测试方法之后,实例写在方法。类中这样联系重复执行素有测试方法。
测试方法
测试方法都是以test开头,没有参数,返回值也是void。注意:必须是以test开头,否则测试无法执行该方法。
常用测试框架
常用的iOS单元测试框架有OCUnit、GHUnit和OCMock。(还有苹果如今自带的XCTest,不知道对不对)
XCTest断言
断言的概念:例如我们写一个测试方法,如果里面的测试满足条件,那么就是通过了,否则失败。在单元测试中,这个过程叫做断言。
断言分为:无条件报错、等价测试、nil测试、布尔测试以及异常测试。
执行测试的方法:
- 第一种:你可以在测试面板将鼠标悬停在测试类、测试束或者方法名上,然后出现run按钮,就可以运行某个特定的测试,在不同的束或类或方法上运行不同的测试。
- 也可以Product--->test.(快捷键为command+U)。这样会执行所有的测试。
- 另外在Product--->perform action里面也有好多提供的测试。读者可以自行研究。
查看测试
我们可以在日志导航面板,就是导航面板最后一个标签(类似于发送消息的那个),然后这里我们可以看到所有测试,然后选择Logs,便可以看出测试相关的内容。
另外,我们也可以在控制台直接看到测试输出。
在测试输出的结果中,Test Suite是指测试用例集合;Test Case是指测试用例
具体的测试调试工具
在导航面板中,有一个类似于箭头的标签,在消息那个左边。我们可以点击左下方的加号来添加测试失败断点。这样当遇到失败断言,这个断点会终止测试行为。可以让你定位到测试失败的地方。
基于Server的持续集成测试
Xcode测试可以使用Xcode Server进行自动化测试。
Xcode Server可以自动化应用程序的构建、分析、测试以及归档的一体化过程。它的优点如下:
使用服务器可以进行脱机构建和测试,以缓解开发系统做实施和调试的压力,特别是在全方位测试时可能需要很长的时间来执行。
开发团队的所有成员使用相同的scheme可在服务器上运行相同的测试,从而提高测试的一致性,整个团队也可以构建产品,就像构建和测试报告。
你可以灵活调整调度项目需求和团队的需求。比如,当团队中任意一个成员向源码管理系统提交新工作或者在设定的时间定期提交时测试运行就可以开始了。测试运行也可以按照需要手动启动。
服务器以同样的方式反复运行测试。随着时间的推移,服务器的报告可以让你和你的团队对构建过程中的问题、警告以及测试解决方案有个整体的轮廓。
你的项目可以有更多的目的地进行测试,更具自动性,而且比手动运行测试系统更加经济。例如,您可以有任意数量的iOS设备连接到服务器,使用单一的配置,该系统可以构建和测试库、应用程序、所有测试以及iOS模拟器的多个版本。
我们需要先了解一些关于Xcode Server所用的关键术语:
- scheme:构建计划。
OCUnit过渡到XCTest
从OCUnit过渡到XCTest是一个复杂操作,包括更新源文件、其中包括测试类和修改项目配置设置。在新版Xcode中有一个转换工作流程助手可以帮助转换:
Edit--->Covert---->ToXCTest这样就可以完成OCUnit到XCTest的转换。
在Xcode中已经内建XCTest,但是它只支持Log输出至Console。
XCTest
支持图形界面测试和真机测试,它继承了OCUnit的优点。
常用的XCT断言
函数名 | 简介 |
---|---|
XCTFail | 无条件断言失败 |
XCTAssertEqualObjects | 当两个对象不相等或者是其中一个对象为nil时,断言失败 |
XCTAssertEquals | 当参数1不等于参数2断言失败,用于C中的基本类型测试 |
XCTAssertNil | 当参数不是nil时,断言失败 |
XCTAssertNotNil | 当参数是nil时断言失败 |
XCTAssertTrue | 当表达式为false时断言失败 |
XCTAssertFalse | 当表达式为true时断言失败 |
XCTAssertThrows | 如果表达式没有抛出异常,则断言失败 |
XCTAssertNoThrows | 如果表达式抛出异常,则断言失败 |
OCUnit
不支持真机测试
OCMock
可以使用伪对象进行测试。
GHUnit
GHUnit支持GUI界面,输出的格式比较美观而且易懂。已经好久不更新了。
功能:
*支持运行测试、跟踪断点以及直接与Xcode Debugger进行交互。
- 并行测试;
- 可测试UI组件;
*可捕获并展示测试细节; - 按照关键字搜索过滤测试案例;
- 根据测试案例查看日志;
- 显示堆栈跟踪和有用的调试信息;
- 在项目中作为框架使用;
- 确定视图是否发生了改变;
- 快速记录view changes
- 安装:
- 通过gem安装GHUnit:sudo gem install ghunit
- 找到项目工程文件的根目录,然后执行:ghunit install -n GHunitTest (这里的GHunitTest就是xxxx.xcworkspace的xxxx)。
- 然后将执行得到的内容添加的Podfile:
target:Test do
pod 'GHUnit'
end
添加之后然后执行pod install。这样就安装成功了。 - 执行玩pod install你会看到在Targets里面有一个Test。如果你有一组测试档案,只要输入ghunit add -n ProjectName -f SimpleTest,ProjectName是你的项目名称,SimpleTest是你想要区的测试名称。
- 介绍会使用到的指令
安装Command Line:ghunit install_cli -n ProjectName
安装模拟器:brew install ios-sim
执行单元测试:ghunit run -n ProjectName