尽管关于测试驱动开发(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,你也应该有个能够让它重现的测试程序,当日后你回来解决这个问题时,你就能知道该做什么了。

来源:51CTO

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

  1. Java 之父:找Bug最浪费时间,现在不是开源的黄金时代,程序员如何自我学习和成长

    1996年1月,Sun公司发布了Java的第一个开发工具包: 1997年2月,JDK 1.1面世: 1998年12月8日,第二代Java平台的企业版J2EE发布: 2000年5月,JDK1.3.JDK ...

  2. 刘未鹏:读烂书浪费时间,但读好书却节省时间

    "我当年毕业的时候总结了一个公式:第一份工作的月薪=大学四年买过的技术书籍价格的总和." 读好书是如此的重要,因为好书往往带领你去到更好的书,更大的世界. 以下内容,摘自<暗 ...

  3. 编程开发中最浪费时间和资源的7个错误

     编程开发中最浪费时间和资源的7个错误 我在当地几家公司担任过项目经理,项目主要关于一些用PHP制作的中小型网页.在那段历程中,我见识了很多公司常常会犯这样或那样的错误,既浪费时间又浪费资源.下面 ...

  4. “小程序肯定会取代 App!” | 人物志

    作者 | 伍杏玲 出品 | CSDN(ID:CSDNnews) 2017 年 1 月 7 日,微信小程序正式面向 C 端用户上线. 在 2016 年 9 月微信便开始授权 200 位开发者参与小程序内 ...

  5. 技术债务_不要浪费时间跟踪技术债务

    技术债务 在过去的几年中,我们一直在跟踪我们的开发积压中的技术债务 . 将积压的债务添加到待办事项中,使技术债务的成本和风险对团队和产品负责人可见,并在其他工作中优先考虑付款,以确保债务得到清偿 . ...

  6. 不要浪费时间跟踪技术债务

    在过去的几年中,我们一直在跟踪我们的开发积压中的技术债务 . 将积压的债务添加到待办事项中,使技术债务的成本和风险对团队和产品负责人可见,并在其他工作中优先考虑付款,以确保债务得到清偿 . 但是我不认 ...

  7. C++核心准则边译边学-P.9 不要浪费时间和空间

    P.9: Don't waste time or space(不要浪费时间和空间) Reason(原因) This is C++. 我们在用C++. 译者注:之所以选择C++而不是其他语言,就是希望使 ...

  8. Java 之父:找Bug最浪费时间,现在不是开源的黄金时代!

    [CSDN 编者按]在编程工作或是学习中,你最头疼的是什么?你知道吗,Java之父也很讨厌Bug,最让他头疼的事情是数值分析.然而,学生时期的他即便用最差的语言完成作业,成绩照样是A.这样一位看似普通 ...

  9. 入行软件测试3个月,每天平平无奇,感觉在浪费时间怎么办

    所有的事情都是需要积累的,都会走出一条幂率分布图,无论是企业.财富.还是个人的发展.测试生涯当然也不例外. 我们每个人都想财富自由(发财),但如何才能实现财富自由(发财)呢? 世界上有名的富翁,巴菲特 ...

最新文章

  1. Virtual Box+Centos7.0+Kaldi安装
  2. 日记 [2008年03月23日]LINUX网关后面的pptp ***客户机连接***
  3. 【php】php5.0以上,instanceof 用法
  4. 3D图形图像处理软件HOOPS介绍及下载
  5. ajax 微信code获取_获取链接的参数,判断是否是微信打开,ajax获取数据
  6. Java提高篇 —— Java内部类详解
  7. Django视图层:嵌套参数,URLconf在查找什么?指定视图参数的默认值、include()路由转发三种方式、传递额外选项给 include()、传递额外选项给视图
  8. Numpy 基本除法运算和模运算
  9. Spring properties dependency checking
  10. 趣谈网络协议(二)传输层
  11. VS2008整合sp1
  12. 腾讯云短信申请与使用
  13. 轻量级云服务器部署K3S(公网部署)
  14. 互动媒体技术——processing旋转方块(不同角度的旋转)
  15. 产品思维 的四大组成部分
  16. STM32(RFID)阶段三(触屏数字键盘)
  17. 基于Java+Swing+Socket实现中国象棋-网络版
  18. 实验四 负反馈放大电路
  19. ksoftirqid进程CPU100%排查
  20. ESP8266+OLED屏实现天气预报+温度显示+NTP时间同步6屏带中文显示版本迭代持续更新

热门文章

  1. 第一:Java+MyBatis(快速入门)
  2. selenium--特殊元素定位
  3. python导入data-Python通过load data导入MySQL数据
  4. php递归查询 大数组,php 递归 实现无限分类 格式化数组
  5. oracle20g,GaussDB 100 OLTP: 缩减创建数据库的20G空间需求及GS-00714
  6. python中again函数怎么用_Python中的偏函数怎么用?
  7. java线程池 core_Java 线程池 ThreadPoolExecutor 的使用
  8. Spring Data Jpa出现“Table ‘XXX.hibernate_sequence‘ doesn‘t exist”
  9. php请求要通过什么协议,php – 发送多个应用程序协议请求(类似于mailto:)
  10. 英才计划计算机潜质测评试题,员工能力与素质测评题库完整.doc