什么是单元测试

单元测试是代码层面的测试,由研发自己来编写,用于测试“自己”编写的代码逻辑的正确性。

单元测试主要测试范围:

  1. 函数

单元测试有别于集成测试。

集成测试主要测试范围:

  1. 模块
  2. 系统
  3. 功能块

tip: 单元测试是粒度小的测试。考验程序员思维的缜密程度。

为什么要写单元测试

  1. 单元测试能有效地帮你发现代码中的BUG
    • 写代码的最高境界就是 bug free 的状态。
    • 避免低级 bug 的出现。
    • 保证每一行代码运行良好,逻辑正确。
  2. 写单元测试能帮你发现代码设计上的问题
    • 如果我很难为其编写单元测试,或者单元测试写起来很吃力,那往往就意味着代码设计得不够合理。
    • 如没有使用依赖注入,大量使用静态函数,全局变量,代码调试耦合等情况。
  3. 单元测试是对集成测试的有力补充
    • 集成测试无法覆盖得很全面,复杂系统往往很多模块。需要单元测试加持。
    • 如果我们能保证每个类,每个函数能按照我们的预期来执行,底层bug少了。组装起来的整个系统,bug也相应减少。
  4. 写单元测试的过程本身就是代码重构的过程
    • 单元测试实际上就是落地执行持续重构的一个有效途径。
    • 编写单元测试就相当于对代码的一次自我Code Review。
  5. 阅读单元测试能帮助你快速熟悉代码
    • 单元测试用例就是用户用例,反映了代码的功能和如何使用。
  6. 单元测试是TDD可落地执行的改进方案
    • 单元测试正好是对TDD测试驱动开发的一种改进方案。

如何编写单元测试

每个语言都有不同的写法。如 Golang 只需要以下划线加 test 命名,函数以 Test 开头就是单元测试。

1
2
3
func TestFunc(t *testing.T) {
	// todo
}

还可以使用第三方提供的单元测试框架。如 GoConvey 。

  1. 写单元测试真的是件很耗时的事情。单元测试代码量一般是被测代码本身的1~2倍
  2. 单元测试不会在生产上运行,而且每个类的测试代码比较独立,基本不互相依赖。
  3. 单元测试覆盖率做到 60 ~ 70% 之间算合格。GoConvey 也有提供覆盖率的报告。
  4. 单元测试不依赖被测试函数的具体实现逻辑,它只关心被测函数实现了什么功能。

tip: 对于函数写不写单元测试,工程师要有足够的主人翁意识(ownership)。 也是拉开与其它人差距的“杀手锏“。

测试不友好的代码

  1. 代码中包含未决行为逻辑
  2. 滥用可变全局变量
  3. 滥用静态方法
  4. 使用复杂的继承关系
  5. 高度耦合的代码

关于我

我的博客:https://www.sgfoot.com

欢迎关注我的微信公众号【空树之空】,共同学习,一起进步~ 空树之空