一 单元测试是什么?
维基百科对单元测试的定义如下:
在计算机编程中,单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。
在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。
根据不同场景,单元的定义也不一样,通常我们将C语言的单个函数或者面向对象语言的单个类视作测试的单元。在使用单元测试的过程中,我们要知道这一点:
==单元测试并不是为了证明代码的正确性,它只是一种用来帮助我们发现错误的手段==
单元测试不是万能药,它确实能帮助我们找到大部分代码逻辑上的bug,同时,为了提高测试覆盖率,这能逼迫我们对代码不断进行重构,提高代码质量等。
二 单元测试好处在哪里?
- 单元测试使工作完成的更轻松
- 经过单元测试的代码,质量能够得到保证
- 单元测试发现的问题很容易定位。
- 修改代码犯的错,经过单元测试易发现
- 单元测试可以在早期就发现性能问题
- 单元测试使你的设计更好
- 大大减少花在调试上的时间
三 如果不进行单元测试会造成什么后果?
- 代码会暗藏很多缺陷,健壮性不强
- 系统测试发现的缺陷比较难以定位
- 为了修复缺陷而修改代码,很可能会不小心犯错,但是又不能及时发现这些新错误。
- 性能问题很难定位,性能优化的时间很难控制。
四 单元测试准则有哪些?
1.保持单元测试小巧, 快速
理论上, 任何代码提交前都应该完整跑一遍所有测试套件. 保持测试代码执行迅捷能够缩短迭代开发周期.
2.单元测试应该是全自动且无交
测试套件通常是定期执行的, 执行过程必须完全自动化才有意义. 需要人工检查输出结果的测试不是一个好的单元测试.
3. 让单元测试很容易跑起来
对开发环境进行配置,最好是敲条命令或是点个按钮就能把单个测试用例或测试套件跑起来.
4. 对测试进行评估
对执行的测试进行覆盖率分析, 得到精确的代码执行覆盖率, 并调查哪些代码未被执行.
5. 立即修正失败的测试
每个开发人员在提交前都应该保证新的测试用例执行成功, 当有代码提交时, 现有测试用例也都能跑通.如果一个定期执行的测试用例执行失败, 整个团队应该放下手上的工作优先解决这个问题.
6. 把测试维持在单元级别
单元测试即类 (Class) 的测试. 一个 "测试类" 应该只对应于一个 "被测类", 并且 "被测类" 的行为应该被隔离测试. 必须谨慎避免使用单元测试框架来测试整个程序的工作流, 这样的测试既低效又难维护. 工作流测试 (译注: 指跨模块/类的数据流测试) 有它自己的地盘, 但它绝不是单元测试, 必须单独建立和执行.
7. 由简入繁
最简单的测试也远远胜过完全没有测试. 一个简单的 "测试类" 会促使建立 "被测类" 基本的测试骨架, 可以对构建环境, 单元测试环境, 执行环境以及覆盖率分析工具等有效性进行检查, 同时也可以证明 "被测类" 能够被整合和调用.
具体参考准侧请: 参考
五 我们该何时进行单元测试呢?
1、写完代码以后:想要验证一下自己写的代码是否有问题。
2、写代码之前:就是写代码之前所有的功能分模块的设计好,测试通过了再写。(我反正是没用过)
3、修复某个bug后:一般修复完某个bug,为了确保修复是成功的,会写测试。
六 我们该如何进行单元测试呢?
第一步:创建一个工程
第二步 工程建好了,我们找到系统单元测试Testes文件夹中.m文件看中会到看到几个方法,我们来看下这个几个方法是什么时候调用和他们各自的作用,如图所示.
第三步 我们在viewController.h里面定义一个简单的方法.
第四步 我们在viewController.m里面实现它.
第五步 方法创建完了,我们在测试的文件中导入ViewController.h,同时把申明成一个属性如图所示:
第六步 测试用例实现
- 正常情况
设置好了,我们command+u快捷方式运行,或者produce–>test运行.
结果显示:
- 假如返回的结果与我们设定值不等时,结果又会出现什么情况?
第七步 性能测试用例实现
七 总结
单元测试的使用与概念是相当简单的一个东西,难点在于不知道怎么用,这就需要我们持续的使用练习才能更好的服务于我们的开发。此外,常用的第三方框架例如YYModel、AFNetworking、Alamofire等等优秀框架中也有对框架自身编写的单元测试,学习仿写这些单元测试也是快速提升自己的一种手段。
很多时候,我们的项目中难免发生多个类之间的交互处理,而这种操作非常的不好调试。单元测试的原则之一就在于我们用来测试的代码要求功能很单一,这其实与良好的代码设计的思想是非常相符的。一方面来说,良好的代码结构设计可以让我们的测试用例的构建更加快速简单;反过来单元测试逼着我们去想办法减少类之间的耦合以此来减少甚至排除测试的干扰。无论如何,如果你想成为更好的开发者,单元测试是我们快速提升代码认知的重要手段之一。