测试的重要性

最近的一件事情让我认识到测试的重要性。一个月前,年会负责人要找一个人来开发公司年会时使用的抽奖系统,我就举手报名了。毕竟这不是什么大型项目,也不是很复杂,经过几天的开发就开发好了。一切进展的都很顺利,直到年会开完后,我接到通知,二等奖被多抽了 40 个人,后果就是多出了十几万的奖金。

听到结果后我非常震惊,因为没有想到会在人数上出问题。再后来,我觉得出这样的问题也实属必然,即使此次不出错,下次开发也会出错。也就是说在稍具规模的软件开发中,没有测试的保障,很难保证不出问题,而测试可以将错误尽早地暴露出来。

在开发过程中,需求变更过几次,问题就出在,在需求更新后未能完全同步设定的人数,导致其中一项的数量出错。且二等奖因为人数众多,在观察抽奖结果的时候如果不细数,不易发现问题。当数据导出后,在 Excel 中打开后错误就暴露出来了。

此事发生之后,我对测试的认识发生了改变,在我心中测试变得更为重要了。因为测试至少能够保证以下几点:

1. 明确每次修改的影响范围

在软件开发的过程中,通常是基于模块来开发,在开发过程中可能要对某个模块经过多次细微调整。经过细微调整后,开发者可能觉得修改后没有什么副作用。而实际情况往往是,改变后对某个地方产生了不易察觉的问题,这个问题就此隐藏了起来,它会在你向顾客展示软件的时候出现。

2. 保证软件功能复合预期

在开发这个抽奖系统的时候,我关注最多的是抽奖是否公平,是否在每次抽奖后正确地更新奖池。而人数设定的是否正确,我竟然几乎没有进行检查。因为在观察页面的时候,我看到页面 UI 表现正常,交互也正常,而对于人数我竟然丝毫没有怀疑它可能存在问题。如果存在测试,对于软件的基本功能进行单元测试,这起码能够保证软件在大的方向上不会出现问题。想象一下如果涉及的是几千万的资金,那时如果出了问题,后果真不敢想象。保证软件的功能复合预期,这首先就避免了出现重大的问题。

3. 保证代码质量和可靠性

测试软件在各个边界情况下的表现,并保证软件在这样的极端情况下也能正常。很多时候软件不出错只是因为使用了最常见的数据进行测试,当软件投入使用以后,面临的可能是非常极端的情况。如果不能正确地处理这些极端情况,那么一来可能给特殊需求的用户带来麻烦,二来这样的错误可能会被人恶意利用,带来进一步的损失。

编写可测试的代码,要求开发者在写代码的时候尽可能少地与其他模块产生耦合,保证自己的代码容易进行单元测试。

将这件事情从软件开发引申到实际生活中,也有不少指导意义:

1. 认为不会出错的,往往就出错了

在做一件事情之前,一直担心自己在某个环节出错,那个环节可能是自己的薄弱点,因此在此之前会仔细核查,最后也如自己希望的那样顺利。而恰恰是之前觉得自己十拿九稳的环节,因为投入的时间和精力有限,最后就出错了。因此全面的复盘,在某些时候就显得很重要。

2. 做完一件事情之后,完整地梳理一下整个流程

做一件稍微复杂的事情,中间都会经过多个环节,很多人丢三落四,还有一些人干净利落。稍微复杂点的事情,是不是应该时常回顾,对过去做的事情进行梳理,明确自己当前的方向是否正确,明确自己是否落下了某个小细节。出现了问题及时修正,时刻把握方向,而不是在最后考核的时候才发现错误。

3. 直觉不是总是可靠,必要的时候让他人介入检查

自己常常发现不了自己存在的问题,因为自己不觉得那是问题。正如这次的抽奖系统,就算再给我一周时间来开发,我可能还是会关注抽奖逻辑是否公平,而对人数上的错误视而不见。这是因为自己在心理层面就默认了人数是对的,在检查的时候心里会想:“人数没错,赶快检查下一个”。这很容易让人想到中学时期考试的场景,对试卷上的错误视而不见,当被人提示出来后才追悔莫及。这个时候如果能够找到一个人来帮助自己检查问题,我想错误很快就会暴露出来。因为在测试过程中,这个人时刻保持审视的态度,没有任何心理干扰。

以上是我对此次事件的反思,这个 BUG 也是职业生涯写出最贵的 BUG 了。有了这次的教训,我想我会变得更加细心,更合理地使用测试来避免同类问题。

#总结