目录
- 概述
- 🤔什么是单元测试
- 🤔为什么要写单元测试
- 🤔什么时候写单元测试
- 单元测试要写多细?
- 附录
概述
软件开发中的测试通常分为以下三类:单元测试、集成测试和端到端测试
具体各个环节的作用如下图
🤔什么是单元测试
单元测试(unit testing),由两个组成:单元和测试
🤔什么是单元?
实际情况不同含义不同,如 C 语言中单元指一个函数,Java 里单元指一个类。通常在软件开发中,单元就是人为规定的最小的被测功能模块
🤔什么是测试?
测试就是检查,用来检验相应的代码是否应该存在它本应该提供的功能,或者是否存在潜在的 BUG
单元测试是软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试
🤔为什么要写单元测试
使用单元测试可以有效地降低程序出错的机率,提供准确的文档,并帮助我们改进设计方案等等
👍以下列举了一些使用单元测试的好处:
- 允许你对代码做出较任何改变,因为你了解单元测试会在你的预期之中
- 单元测试可以有效地降低程序出现 BUG 的机率;
- 帮助你更深入地理解代码–因为在写单元测试的时候,你需要明确程序所有的执行流程及对应的执行结果等等;
- 允许在任何时候代码重构,而不必担心破坏现有的代码。这使得我们编写程序更灵活;
- 确保你的代码的健壮性,因为所有的测试都是通过了的
- 文档记录。单元测试就是一种无价的文档,它是展示函数或类如何使用的最佳文档,这份文档是可编译、可运行的、并且它保持最新,永远与代码同步。
- 具有回归性。自动化的单元测试避免了代码出现回归,编写完成之后,可以随时随地地快速运行测试,而不是将代码部署到设备之后,然后再手动地覆盖各种执行路径,这样的行为效率低下,浪费时间
🤔什么时候写单元测试
✨写单元测试的时机不外乎三种情况:
在实现代码之前先写测试,这是测试驱动开发(TDD)所提倡的一种方式
实现代码与测试同步进行。先写少量功能代码,紧接着写单元测试(重复这两个过程,直到完成功能代码开发)。其实这种方案跟第一种已经很接近,基本上功能代码开发完,单元测试也差不多完成了
编写完功能代码再写单元测试。我的实践经验告诉我,事后编写的单元测试粒度都比较粗。对同样的功能代码,采取前两种方案的结果可能是用 10 个“小”的单测来覆盖,每个单测比较简单易懂,可读性可维护性都比较好(重构时单测的改动不大);而第三种方案写的单测,往往是用 1 个“大”的单测来覆盖,这个单测逻辑就比较复杂,因为它要测的东西很多,可读性可维护性就比较差
👴推荐单元测试与具体实现代码同步(采用方式二进行单元测试),只有对需求有一定的理解后才能知道什么事代码的正确性,才能写出有效的单元测试来验证正确性
单元测试要写多细?
单元测试不是越多越好,而是越有效越好!即代码需要有单元测试覆盖:
逻辑复杂的、容易出错的、不易理解的,即使是自己过段时间也会遗忘的代码最好增加上单元测试,这样有助于理解代码的功能和需求
公共代码最好加上单元测试,比如自定义的所有 http 请求都会经过的拦截器;工具类等。
核心业务代码最好加上单元测试,一个产品里最核心最有业务价值的代码应该要有较高的单元测试覆盖率
✨好的单元测试具有以下特点:可重复执行、独立无依赖、结果不可变
附录
单元测试入门
简书—单元测试规范
浅谈单元测试