单元测试,XCTestCase,查看覆盖率已经知道怎么写一个简单的UT和查看效果
然后我就去项目中新开分支实操,然后就遇到一个方向性问题,诺大的项目,我应该从哪里开始呢?
问题
- 那么多类和函数,到底哪些需要写单元测试?
- 有些关键的逻辑实现函数(私有方法),是否需要写UT去测试?
- 测试类是对应被测试类还是被测试函数?也就是说测试的最小粒度是啥?
测试的原则
- 快速:这样才不会介意去运行
- 独立:一个测试不应该耦合于另一个测试
- 可重复:每次测试的结果应该一致
- 可验证:结果应该是成功/失败,而不是一个解释性的日志文档
测试的内容
- 核心功能测试
- 边界条件
- 错误处理
应该测试的对象
(回答第一个问题)
- 1.数据相关
比如在本地数据存储模块中,我们需要保存不同的数据,这时候我们可以通过单元测试构造不同的测试数据进行保存,查看是否保存成功,数据部分是单元测试最需要覆盖的部分。- 2.逻辑相关
比如在连接模块中,需要对部分请求结果进行过滤,这就是一个逻辑,针对这种逻辑,可以在单元测试中进行测试是否过滤成功,而人工测试则无需关注过滤的逻辑,仅仅需要关注过滤后界面是否正常显示。- 3.多状态的模块
比如在连接模块中,连接的状态就有8种,包括了连通性检查、连接中、已连接等,这些状态能够利用单元测试很好的模拟出来,这样就解决了人工测试下难以模拟不同状态转换的问题。
问题思考
一顿查询了之后,再结合自己的项目。我的项目是一个SDK项目。没有UI,只有对外的功能。
1.没有UI,只有对外暴露的接口,也就是说要保证功能函数没有问题。而这功能函数调用了大量的其他子功能的函数。所以我们要测试的是子功能函数,因为子功能函数最后是不可拆分的函数了(SOLID的S原则)(回答第三个问题)
。
2.尽可能的一个类对应一个UT类,这样当你的UT代码多起来的时候,也能看懂。如果你平时开发的时候删除了对应的功能类或者函数,记得把对应的测试代码也删除了。不然时间久了,呵呵哒
3.对于第二个问题,答案是不需要,既然不用暴露出来,就认为不管你多重要,都不需要外面的调用者关心,不管是真的使用方还是UT。测试case 只关心给的输入是否能对其预期的输出。
好了,搞到这里就继续回项目写了。
XCTest 编写过程中的一些问题和技巧中有一些小例子可以帮助理解
网友评论