无单测、不编码——写单元测试的重要性

无单测、不编码——写单元测试的重要性

最近要写几篇和单测有关的文章,找出来本身好久写的文章。发出来,先作个预告。欢迎交流。程序员

做为一个开发人员。不少人不多写单元测试,甚至不写单元测试。markdown

总结一下开发人员不写单测的缘由无非有如下几种:ide

一、认为写单测浪费时间。

二、认为测试不该该是开发人员来作的。

三、自信我写的代码没有问题,不须要单测。

四、不知道单测的重要性。

五、不知道单测的好处。

那么针对以上这几种观点,今天就逐个分析一下。到底单元测试有没有那么重要。函数

单元测试真的浪费时间吗?


在业务高速发展的今天,不少时候项目来的时候要的都很急。好像要是我不把这个功能在几天以内搞完整个公司都要倒闭了同样。因此,不少开发人员都把主要的时间用在写业务逻辑代码上。不少人都是有时间的时候才会写一些简单的单元测试代码,若是项目比较忙的话就不写单元测试。单元测试

不少程序员的项目都是这样完成的:测试

写代码---->集成测试---->改bug---->集成测试---->预发布测试---->改bug---->正式发布---->发生故障---->改bug---->发布---->改bug---->....google

能够看到,改bug过程贯穿着整个软件的生命周期。改bug不少人都知道怎么改,就是要先定位问题,而后再解决问题。每每定位问题都是比较复杂的,通常都须要很长的时间。编码

若是有了单元测试可能就会节省不少时间,经过单测能够减小不少bug的发生,也能帮助咱们快速的定位问题。只要在集成测试以前作好单元测试。在经过单元测试以后,咱们就能够认为这部分代码是可靠的,那么就能够放心的进行项目集成。debug

固然,有了单元测试,并不能保证代码不出现bug。可是,单元测试能够在软件开发过程的早期就能发现问题。只要单测的测试用例足够好,那么就能够避免不少低级错误。设计

那么,为何仍是不少人认为单元测试浪费时间呢,我的分析缘由多是这样的。开发人员认为个人时间就应该用来写业务逻辑代码。项目出现了bug,我也应该用个人时间来解决这个bug。他们认为个人时间花费在这件事上我是承认的,因此个人时间就不叫浪费。归根结底,他们就是没有意识到单元测试所带来的好处。一旦他们发现,经过单元测试可让我更早的发现问题等等好处,那么他们也会承认把时间花费在写单测上。

在这里,能够先下一个结论:好的单测不只不会浪费时间,还会大大节省咱们的时间。至于为何会节省时间以及什么叫好的单测会在后面介绍。

单元测试应不该该开发人员来写


这里暂不分析到底应不该该有单独的测试人员,这是一个很有争议的话题(一部分人认为,开发就应该是全栈的。还有一部分人认为开发就应该只关注业务写业务代码)。这里只分析单元测试到底应该由谁来作。有人认为,单元测试也是测试的一种手段,应该交给专门的QA去作。也有人认为单元测试应该是开发人员来写,那么,单元测试到底应不该该开发人员写呢?

单元测试必须由最熟悉代码的人来写。这是好的单元测试的标准之一。那么还能有谁比写代码的人更了解代码呢?代码的做者最了解代码的目的、特色和实现的局限性。因此,写单元测试没有比做者更适合的人选了。单独的测试人员进行单元测试,每每工做量大,周期长,耗费巨大,其结果事倍功半。软件的开发者老是应当负责程序的单个单元的测试,保证每一个单元可以完成设计的功能,其实在不少状况下,开发者也应进行集成测试。

个人观点觉得,开发人员写了一个函数,就要对这个函数负责,就有义务保证这个函数能够准确的执行。单测即是一个很好的手段。因此,若是要写单测,就应该开发人员本身来写。

我很自信,我还须要单测吗?


有人能写出天衣无缝的代码么?答案是否认的!

我认为程序员都是天生骄傲的。虽然程序员每每都会说:在我机器上明明是好的呀,是否是你用的方式不对呀。可是,好的程序员应该在说完这句话以后会偷偷的去排查问题。

写代码不是能够一蹴而就的,必须通过各类各样的测试,单元测试只是其中一种。

因此,不管你是一个多么天生骄傲的程序员,你都不是神!因此,你也须要单测。

单测真的有那么重要么?


不少程序员宁愿把时间花费在写业务逻辑代码上,他们多数是有时间的时候才会写一些简单的单元测试代码,若是项目比较忙的话就不写单元测试。据我所知,只有少数的公司会要求项目上线必须达到必定百分比的代码覆盖率(软件测试中的一种度量,描述程式中源代码被测试的比例和程度),大多数公司都不是很重视这一项,全部,不少人就不过重视单元测试。可是,不少发生故障的经验告诉咱们,不少问题是能够经过单元测试避免的。

其实单元测试的重要性很简单,就是一句话:不写单元测试,你怎么知道你的代码写的对不对?没有足够丰富的测试用例,你怎么知道用户会怎么使用到你的代码,你又怎么会知道你的代码应该怎么被执行呢?

因此,单元测试很重要。和写代码同样重要。无单测,不编码!

单元测试有哪些好处?


前面说了这么多,其实以上这些问题都有一个最最根源的问题,那就是不少程序员不写单测的最最根本缘由是他们根本不知道写单测和不写单测的区别。不知道写了单测能带来好处。因此他们会认为写单测是浪费时间,因此他们才会认为单测不该该是由我来写,因此他们才会认为我不须要写单测。

那么,单元测试到底能带来哪些好处呢?

J.Timothy King写过一篇关于先写单元测试有哪些好处的文章:Twelve Benefits of Writing Unit Tests First(先写单元测试的十二个好处),这里挑其中几个显而易见和比较突出的好处介绍一下。

减小bug

单元测试的目的就是经过足够准确的测试用例保证代码逻辑是正确。因此,在单测过程当中,必然能够解决一些bug。由于,一旦某条测试用例没有经过,那么咱们就会修改被测试的代码来保证可以经过测试。

减小修复bug的成本

通常解决bug的思路都是先经过各类手段定位问题,而后在解决问题。定位问题的时候若是没有单元测试,就只能经过debug的方式一点一点的追踪代码。解决问题的时候更是须要想尽各类方法来重现问题,而后改代码,改了代码以后在集成测试。

由于单元规模较小,复杂性较低,于是发现错误后容易隔离和定位,有利于调试工做。

帮助重构,提升重构的成功率

我相信,对一个程序员来讲最痛苦的事就是修改别人的代码。有时候,一个很大的系统会致使不少人不敢改,由于他不知道改了一个地方会不会致使其余地方出错。能够,一旦有了单元测试,开发人员能够很方便的重构代码,只要在重构以后跑一遍单元测试就能够知道是否是把代码“改坏了”

提升开发速度

不写单测也许能让开发速度更快,可是没法保证本身写出来的代码真的能够正确的执行。写单测能够较少不少后期解决bug的时间。也能让咱们放心的使用本身写出来的代码。总体提升开发速度。

后记


据我说知,在facebook是没有QA的,他们的全部代码都是经过单元测试来保证可以正确执行的。在google也很重视单测,国外这样的大公司都会要求单测的代码覆盖率达到一个高的水平,不然是绝对不会容许代码发不到线上的。

因此,经过这样一篇文章,但愿读者能够重视单元测试,并在实际项目中运用起来。可是,也请记得,单测只能在必定程度上减小bug的发生,并非写了单测就不会在发生问题。

无单测,不编码!