在程序员面试中,“谈谈你对单元测试的看法”是一道高频考题。今天,咱们就围绕这个话题,好好唠一唠单元测试在实际开发中的那些事儿,看看它到底有多重要,为啥大家说一套做一套,以及遇到难题该怎么解决。

一、单元测试:口头上的“香饽饽”,行动上的“小透明”

要是你在大街上随机拉住100个程序员,问他们单元测试重不重要,估计99个人都会毫不犹豫地回答:“那肯定重要啊!”这不难理解,单元测试就像是开发过程中的“排雷兵”,能在早期帮我们揪出不少问题,减少程序里恼人的bug。同时,写单元测试的过程,也是在重新梳理业务逻辑,能让我们对业务代码有更深入的理解。这样一来,当把代码交给质量控制(QC)团队时,心里也更有底。

可理想很丰满,现实却有点骨感。实际上,真正能把单元测试做到位的公司少之又少,很多项目的单元测试覆盖率低得可怜。除非公司把写单元测试和绩效挂钩,强制大家去做,不然主动写单元测试的人并不多。为啥会这样呢?大部分程序员都觉得写单元测试太麻烦了。辛辛苦苦写完代码,还要再写一遍测试代码,多耗费精力啊!不少人觉得用Postman跑一跑接口,看看输入参数后有没有问题,这不更直接嘛!就像我自己,现在很多简单接口的自测也是这么干的。

二、复杂场景下,单元测试的不可替代性

不过,这种简单的自测方法只适用于一些简单接口。一旦涉及到复杂接口,场景多且逻辑复杂时,单元测试的优势就凸显出来了。

  1. 减少遗漏,梳理逻辑:写单元测试能帮我们把各种可能的情况都考虑到,不容易遗漏一些边界条件或者特殊场景。在编写测试用例的过程中,我们会不自觉地去梳理代码逻辑,把隐藏的问题提前找出来,从而将bug数量控制在较低水平。
  2. 方便追溯,可视化留存:对于大型项目来说,开发任务繁重,每天都有大量的代码改动。如果只是简单地进行自测,没有留下记录,等正式提测后发现问题,很难回忆起当时的自测情况,排查问题就像大海捞针。但要是有了单元测试代码,就相当于有了一本“测试日记”,直接翻看就能知道当时有没有考虑到某个场景,方便又高效。
  3. 给上级一个交代:在日常开发中,相信大家都没少被领导问:“你这代码到底测没测过?怎么还有这么低级的错误?”这时候,单元测试就成了我们的“底气”。有了它,至少能说明我们认真做过自测,只是可能有些场景没覆盖到,而不是敷衍了事。

三、应对模块耦合:Mock的神奇妙用

有的同学可能会问:“遇到和其他模块耦合的方法,单元测试该咋写啊?”这时候,大名鼎鼎的Mock就派上用场啦!Mock可以用来模拟测试数据、组织输入参数。比如说,有些方法依赖其他模块的数据,但在测试时又不想真的去操作那些复杂的外部模块,就可以用Mock来模拟数据,让测试更方便。像一些需要往数据库里存数据、修改数据的场景,调用起来比较麻烦,用Mock模拟就简单多了,效果也很不错,比直接用JUnit方便很多。