单元测试的意义是什么

比如一个函数,接收两个数字作为入参,该函数会对两个数值向下取整并相加,然后输出该结果。假设该函数书写时把向下取整写成了向上取整,因此输入1.2和2.2输出了5

现在对于这个函数做单元测试,等于把上述逻辑在单元测试的代码里又写了一遍,逻辑依然是错的,单元测试输出结果和函数输出结果都是5,单元测试通过

所以不大理解单元测试的意义在哪

阅读 2.1k
1 个回答

我说几点
比如对于下面的函数:

function add(numA, numB){
    numA = Math.max(numA, 0)
    numB = Math.min(numB, 0)
    return numA + numB
}

我们看看需要考虑几种情况:

numA numB
1 1
>=0 <0
<0 >=0
>=0 >=0
... ...

此外,是否我们还需要考虑 numA 和 numB 的类型呢?
此时,如果需要添加一个需求,要求在 =0 的时候做特殊操作,请问:

  1. 修改了这个函数是否会影响函数执行的结果呢?那么这几种情况都需要尝试一遍。
  2. 这个函数的影响面多大,换句话说,会不会影响上层的调用方呢?

所谓的单元测试是考虑一个函数所有的情况,任何一次修改也会重新在所有情况之下修改,而这些所有情况就覆盖了上层的所有调用。这个函数单元测试过了,就说明不影响上层功能。

按照你的说法,结果不变的确不影响。但是单元测试不是一个单元一个测试,而是一个单元无限的测试。所以你的这种情况是单元测试覆盖不够,除了要测试 1.2 和 2.2,还需要考虑 1.9 和 2.9,等等等。

所以吧,大概有以下优点:

  1. 写一个函数,考虑所有情况,一次测试所有情况。
  2. 修改函数功能,更新单元测试,一次测试更多的情况,单测覆盖面越来越广,避免引入新功能导致旧的功能出 bug。
  3. 单元测试层层覆盖,定位快,从顶层到底层,单测覆盖面越广,项目质量越稳定,每一次修改代码,跑一边测试,就能保证不影响旧功能。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进