测试是浪费时间,我的程序肯定没问题

尽管关于测试驱动开发(TDD)的书和文章有成百上千之多,仍然有很多人从未感受过测试的强大力量。

之所以不愿意去写测试程序不外乎有以下几个理由:

  1. 太费时间。
  2. 不值得。
  3. 我很懒。
  4. 我不知道如何做。
  5. 我知道我的程序好用,我运行过一次,没出问题。
  6. 我是超人,我从来不犯错误。

除非你的答案是6.(如果是这样,我很羡慕你),否则,你应该继续读下去。

让我们从一个简单的例子开始。就说你要写一个Email地址校验程序。

你也许会使用正则表达式,或手工实现每个字符的对比,来完成这个任务。

现在你想验证一下你的代码是否有效。你会怎么做?你可以手工输入不同的值来验证它是否符合你的要求,结果你就测试了像下面的这些东西:

foo
foo@bar
foo@bar.baz
...

如果你要改变/调整校验算法会发生什么?你需要把之前所有的过程全部重复一遍,把每个值都再输入一遍,看看校验的结果。如果让计算机自动的帮你校验这些是不是会更好些呢?

通过把测试过程自动化,你可以在任何时候对程序进行任何遍次的测试。这不仅仅在以后会节省你大量的时间,而且会增加你的自信心,因为每次当你感觉到程序可能出错时,只要运行一下你的测试程序,看看测试结果就行了。

现在设想一下你正在编写一个更加复杂的程序,比如XML解析器。

你不可能编写出解析器后不去测试它,问题是,你如何测试它?通常,你会创建一个XML样板文件,把它输入解析器里,手工检查解析的结果。当你看到解析器按照要求输出了你期望的结果后,你确信你完成了任务,解析器没问题。

问题就在于如果你发现了一个Bug。那你就需要去修改你的代码,再验证一次它是否好用。可是我们程序员都是一群懒人,我们会只测试我们遇到的这个Bug,几乎从来不会去测试解析器的其它部分。这会产生什么问题呢?你能确保没有把什么东西改坏?

当你写了单元测试程序后,这个工作流程会变的怎样?

首先,你已经对程序进行过测试,之前你必须对每个函数进行手工的测试,手工的检查输出结果。如果这种事情你只需要做一次,那也没什么了,但当有东西出错时,你不想一遍一遍的重复做这个事情,没有人喜欢来回重复的做相同的事情,特别是无聊的事情。

另一种情况,你为你的解析器里的每个功能都写了自动测试程序。在这个例子中,你已经测试过你的程序,对这个过程你并不陌生。你需要做的是把手工的检查改为assertions,它们会为你自动测试程序。

当Bug出现时,巨大的变化发生了。

如果没有自动化测试,你必须手工的检查所有的东西来确保你在修正一个Bug时不会引入其它的错误。当有数个Bug出现时,你会变得极不耐烦,你开始不再检查其它部分的代码,只关注你的这个Bug。但假如你为程序写好了自动化测试,你唯一要做的就是点击一次按钮,让所有的测试程序运行起来,你马上就能看到测试结果,几乎不需要在其它任何事情。

当有了测试程序后,修改Bug是怎样进行的?

首先,你需要重现这个Bug。无论如何,在你修改前,你必须要认定这个Bug是否真实的存在。如何做到这些?你要写出一个测试用例来重现这个bug,这个必须要在你做任何的修改这个bug的工作之前完成。

如果这个bug不能重现,问题就可能出自其它地方,如果不能用自动化测试来重现这个bug,你可能在错误的地方修改了这个bug,很可能改坏了你的程序。当你写出测试程序,你必须先运行它确保它会失败。如果测试没有失败,什么地方可能出了问题,你没能正确的重现它。

当你修改了这个Bug,你也有了针对它的测试程序,你可以立即发现这个bug是否还会出现。

当你这时又发现另外一个bug时该怎么做?

相同的做法。写一个测试程序,重现这个bug。即使你没有时间来立即修正这个bug或者这不是个致命的bug,你也应该有个能够让它重现的测试程序,当日后你回来解决这个问题时,你就能知道该做什么了。

原文发布于微信公众号 - java一日一条(mjx_java)

原文发表时间:2016-01-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大愚Talk

为什么要用Redis

最近阅读了《Redis开发与运维》,非常不错。这里对书中的知识整理一下,方便自己回顾一下Redis的整个体系,来对相关知识点查漏补缺。

2922
来自专栏Java学习网

测试是浪费时间,我的程序肯定没问题

测试是浪费时间,我的程序肯定没问题 尽管关于测试驱动开发(TDD)的书和文章有成百上千之多,仍然有很多人从未感受过测试的强大力量。 之所以不愿意去写测试程序不...

2625
来自专栏PingCAP的专栏

性能测试工具的 Coordinated Omission 问题

很早之前就看过 Gil 大神的一篇文章《Your Load Generator Is Probably Lying To You - Take The Red ...

2875
来自专栏程序人生 阅读快乐

细说PHP(第2版) - 高洛峰

《细说PHP(第2版)》共六个部分,分为30个章节,每一章都是PHP独立知识点的总结。内容涵盖了动态网站开发的前台技术(HTML+CSS)、PHP编程语言的语法...

1062
来自专栏张善友的专栏

BlackPearl 的 ServiceObject 开发部署

K2“BlackPearl”提供一个平台,用于管理和利用现有的跨越任何数量的业务系统的业务信息,以降低成本。它考虑到决策的制定,线路的排定以及报告,并根据360...

1999
来自专栏腾讯架构师的专栏

多核处理器下数据库系统日志管理器优化技术探讨

传统数据库的设计假设磁盘为主要存储设备,其性能取决于基于I/O代价模型的优化。然而,当前数据库运行的平台已逐渐转移到由多核处理器、大内存和以闪存为代表的低延迟存...

2531
来自专栏张善友的专栏

MongoDB 1.6.1发布

Mongodb发布了1.6.0版本,这是其继1.0,1.2,1.4版本后的第四个主要稳定版本,8月17日发布了1.6.1版本。 本版本主要着重在增强动态扩容(s...

2086
来自专栏大数据人工智能

ZStack--工作流引擎

在IaaS软件中的任务通常有很长的执行路径,一个错误可能发生在任意一个给定的步骤。为了保持系统的完整性,一个IaaS软件必须提供一套机制用于回滚先前的操作步骤。...

4894
来自专栏IT技术精选文摘

客服系统微服务架构的演化

微服务要求 ? ? ? ? 服务协作 ? 服务治理 ? 服务治理 ? ? ? 1 怀疑第三方 坚持一条信念:“所有第三方服务都不可靠”,不管第三方什么天花乱坠...

4595
来自专栏樊华恒的专栏

海量之道系列文章之弱联网优化 (五)

在客户端接入服务器调度策略的演化过程中,我们最早采用了“就近接入”的策略,在距离客户端更近的地方部署服务器或使用CDN,期望通过减少RTT来提高网络交互响应性能...

7120

扫码关注云+社区

领取腾讯云代金券