一、单元测试的概念
定义
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
单元测试应仅用于测试“受开发者控制的”代码,即不包括与数据库、文件或网络系统等基础设施的交互。
特点
- 单元测试几乎都是用单元测试框架编写的
- 单元测试一般又开发人员编写
- 单元测试容易编写,能快速运行
- 单元测试可靠、可读、可维护
- 只要产品代码不发生变化,单元测试的结果是稳定的
二、为什么要做单元测试?
编写单元测试可以给开发过程带来众多优点,包括可以让开发者尽早发现错误,具有可回归性,提供文档以及帮助改善软件设计。下面将一一进行详述:
- 让故障被尽早发现
单元测试是在开发阶段进行的一种测试,也就是在整个开发周期较早的时期。按照统计,软件故障发现的越晚,修改的成本越高,到后期几乎是呈指数上升。良好的单元测试可以让故障在第一时间发现,避免故障留到后期因为定位和修复难度的增加而带来更大的损失。 - 减少进行功能测试的时间
进行功能测试十分耗时,包括打开软件,按照步骤执行等,少则几秒钟,多则几分钟,单元测试可能只需要几毫秒。使用单元测试不需要执行人对系统有所了解,只需要点击鼠标就可以运行单元测试,整个单元测试由计算机执行,减少了人为的错误。需要注意的是,虽然单元测试很强大,但是不能完全替代功能测试。 - 具有可回归性
软件开发过程中,添加新功能、修改bug、重构等多个过程都可能引入错误,改变软件原有行为,此时需要进行回归测试,测试原有功能,保证其没有改变。此时单元测试就是一个很好的工具,可以节省大量时间,并保证准确性。 - 提供使用文档
有时开发者希望知道为函数的某个值时会返回什么样的结果,这时就可以利用单元测试,每个测试用例解释了某一输入和对应的预期输出,这就可以作为一份接口使用的文档提供给用户。 - 帮助产生低耦合的代码
单元测试可以帮助改善软件设计,促进产生松耦合的代码设计和实现。因为高耦合的代码难以测试,为了进行单元测试,会迫使开发人员重新审视自己的代码,并进行解耦。 - 提高底层代码的正确性和稳定性
底层代码通常不便于用功能测试验证其正确性,良好的单元测试可以提高底层代码的正确性和稳定性,进而提高软件整体的正确性和稳定性。如果在底层代码的开发阶段就能定位到错误,及时解决,比等到用户(库程序的用户)发现错误再进行排查要容易得多。
https://docs.microsoft.com/en-us/dotnet/core/testing/unit-testing-best-practices
三、什么样的单元测试是好的?
- 运行速度快
成熟软件项目可能有成千上万个单元测试,每个单元测试的执行时间是毫秒级的(视接口类型而异)。 - 独立的
单元测试应该可以独立运行,不相互依赖,并且不依赖于文件系统或数据库等外部因素。 - 可重复的
在不更改测试用例的情况下,每次运行单元测试应该返回相同的结果。 - 自检
单元测试应该可以在无人为干预的情况下,自动检测测试用例是通过还是失败。 - 及时
编写单元测试应该非常简单迅速。
四、关于代码覆盖率(Code Coverage)
代码覆盖率是之指单元测试覆盖到的代码数量占代码总数的比例。高代码覆盖率通常与高质量代码相关联。但是这项指标并不能决定代码的质量的高低。
“一个测试是否值得编写取决于你对平均无故障时间(MTBF)衡量的仔细程度。如果你想让起搏器程序的MTBF从10年延伸至100年的话,那么对那些极不可能发生的条件和条件组合进行测试就是有意义的。” ——《测试驱动开发》
“测试驱动开发对测试的观点就是注重实效。在测试驱动开发