-
新建项目-引入单元测试功能
在我们新建项目的时候,会有三个选项
- Use Core Data:数据库
- Include Unit Tests:单元测试
- Include UI Tests:UI测试
根据需求选择一个我们要使用的功能来创建新项目
-
新建项目-识别项目结构
在左侧文件列表中,多了两个文件夹,targets下面也多了两个target,分别是刚才新建时选择的单元测试和UI测试的target
在左侧文件列表中可以看出来,单元测试类是没有.h
文件的,只有一个.m
实现文件 -
新建项目-调试单元测试代码
平时开发的时候,这个被我们遗忘的按钮,其实是调试单元测试代码的入口。文件列表中出现的文件都是系统帮我们创建好的一些文件。每个文件中的单元测试方法列表也在左侧显示出来。
我们可以看到每个类都有导入一个#import <XCTest/XCTest.h>
文件,而且都是继承于XCTestCase
这个类。这个类是什么?这个类怎么用?后面会讲解到,这里只要知道我们iOS的单元测试是这个类提供的。 -
怎么运行单元测试
程序员的第一次都是交给"hello world!"的,我们也来看看单元测试中的"hello world!"- 当我们将鼠标悬浮在方法名左侧的菱形按钮上时,这个按钮就变成了一个播放按钮,点击运行即可。
- 在文件列表出显示出两个测试方法的结果,一个测试通过,绿色的勾,一个测试失败,大写的红叉。
- 在代码36行处有一个失败的提示
- 提示内容
failed
左侧,((str) equal to (@"hello oc"))
,这个正是我们要比较的内容 - 提示内容
failed
右侧,: ("<c8b03e1f 01000000>") is not equal to ("<48b13e1f 01000000>")
,告诉我们失败的原因
- 提示内容
-
查看测试结果
-
选中这次test可以查看整体结果
- 测试总时长:0.671s
- 测试通过数:2个,通过率67%
- 测试失败数:1个,失败率33%
- 下面列表中也能看出来是哪个方法测试失败
-
选中这个失败的方法
- 点击左侧箭头,可以展开查看失败信息
- 点击右侧箭头,可以跳转到失败的测试方法
test下面有两个选项
Build:常规build时产生的日志
-
Log:输出测试失败的信息日志
-
-
断言
XCTAssertEqual
细心的同学会发现这里使用了XCTAssertEqual
这个方法,Assert
在我们平时开发中也有用到,是断言用的,只在开发环境下起作用。那么在单元测试里面的这个断言是告诉我们测试结果和预期结果是否匹配,也即我们测试是成功还是失败,都是由这个断言来告诉我们的。xcode也没有让我们失望,提供了大量的断言方法供我们使用。具体如何使用这些断言,后面会进行详细介绍。
-
新建一个测试类
-
cmd+n
,选择Unit Test Case Class
即可新建一个单元测试类 -
将新建的类添加到单元测试的target中,而不是第一个项目target中
-
-
认识新建测试类
和我们新建项目时一样,系统已经添加了四个方法。请注意,这里我说的是四个方法而不是四个测试方法。因为四个测试方法中,只有最后两个方法前面才有那个菱形按钮。下面具体看下这四个方法有什么用处
测试方法必须以test开头
测试方法必须以test开头
测试方法必须以test开头-
- (void)setUp
Put setup code here. This method is called before the invocation of each test method in the class.
- setUp是设置初始化代码的位置
- setUp方法在每个测试方法调用之前调用
以上两个特征表明我们需要在这里重置数据,防止上一个测试完成留下的数据对当前测试方法造成影响。
-
- (void)tearDown
Put teardown code here. This method is called after the invocation of each test method in the class.
- tearDown是清理代码的位置
- tearDown方法在每个测试方法调用之后调用
以上两个特征表明我们测试完成之后需要在这里释放数据,防止遗留数据对下一次测试造成影响
-
- (void)testExample
This is an example of a functional test case.
Use XCTAssert and related functions to verify your tests produce the correct results.- 这是一个测试用例的例子
- 使用XCTAssert断言来判断你要测试的方法的结果是否是准确的结果
-
- (void)testPerformanceExample
This is an example of a performance test case.
Put the code you want to measure the time of here.- 这是一个测试性能的测试用例
- 将需要测试时间的代码放在block里面,也就是将一些耗时、耗性能的测试方法放在block里面
-