Swift 单元测试参考
什么是单元测试
单元测试: 针对程序模块的最小单元来进行正确性检验的测试工作。对于面向对象编码来说,最小单元就是方法
其实就是验证一些基本规则。
基本原则
命名
使用领域命名,用命名直接告诉别人你在测试什么,测试方法某个方法就用test+方法名, 测试操作就用test+操作
其中一个测试文件应该只有一个测试类。
编写短测试
单元测试要短而清晰,目标只有一个,一个测试就像一个细胞
一个Case只测一种情况
一个测试尽量只有一个断言,这样测试目的就很清晰。
可能我们调用的一个API内部有一个if…else…。我建议if一个case,else一个case。分两个不同的case来作测试.这样每个case就很清晰自己在测试什么东西。而如果全部杂糅在一个case中,可读性会降低不少,而且case体积也会变得相对大很多,因为你要Given-When-Then两次。更不建议在case中写for循环验证。有人说我的测试目标函数中有很多if…else…,那么我觉得你应该重构下你的设计了
测试方法遵循Given-When-Then
在测试方法内,一般就是三大步:准备数据 - 操作 - 结果
- (void)testSomeFunction{
//given: 数据准备
_sut.collectionType = 1;
NSIndexPath *path1 = [NSIndexPath indexPathForRow:1 inSection:1];
//when: 操作
BOOL needToShow1 = [_sut needToShowRow:path1];
//then: 结果/断言
assertThatBool(needToShow1,isTrue());
}
不要链接测试
每个测试应该互相独立,不应该互相依赖。
我经常看到人们有链接测试的习惯。这通常是因为准备工作非常困难。但这不是一个解决方案。在测试链中,依赖于其他测试的测试之所以失败,大多数情况下都是因为前面的测试失败了。在这种情况下,你可能会修改代码让测试通过,但你可能会因为测试不完备而引入没有验证到的缺陷。
How
参考 iOS-单元测试详解 单元测试操作和基本理论
Why
为了你以后的工作,请写单元测试
单元测试覆盖率
默认情况下,Xcode不会收集测试范围,但我们可以在设置中很容易打开。首先同时按住
⌥+⌘+U键,调出当前Target的测试设置。然后打开Options选项卡,并选中Code Covetage复选框,如下所示:
这样就设置好了。以后我们每次运行测试后都会生成单元测试覆盖率数据。一种方法是打开Report Navigator(⌘+9)查看,现在将显示每个测试会话的覆盖率报告:
我们还可以在编码窗口显示覆盖率数据。要启用此功能,点击右上角的 Adjust Editor Options,然后点击Code Coverage。平时如果感觉影响开发也可以关闭。开启后你能看到你写的代码哪些被单元测试覆盖到了:
如上图所示,所有尚未测试到的代码右边都被红色突出显示,并且所有代码迭代次数也将显示出来。
参考:
- iOS-单元测试详解 单元测试操作和基本理论
- 编写良好的单元测试 单元测试的理解,提供该怎么单元测试
- 单元测试编码规范 单元测试该怎么命名和基本步骤(Given - When - Then)