《需求设计:构建用户想要和需要的产品》——3.8 测试与检验

3.8 测试与检验

大型项目的测试会分成很多层。我们经常能看见那种包含单元测试、功能测试、回归测试、组件测试、性能测试、系统测试及验收测试的项目。无论测试能找到多少bug,它都要耗费大量的资源与时间。在Software Estimating Rules of Thumb这篇文章[19]中,Capers Jones提出了他所总结的“软件开发成本动因定律”(Law of Software Development Cost Drivers),该定律宣称,“对于所有的软件来说,查找及修复bug都是成本最高的活动。”顺便再说一下,对于BDUF项目来说,还有几个成本比较高的活动排在该因素的后面,它们分别是:写文档、写代码、开会和管理。在军事项目中,写文档会升至第一位。在敏捷项目中,第二位和第四位互换。
测试有一个令人失望的特点,那就是它非常低效。其原因有很多:

  • 测试通常致力于证明程序已经实现了它所应该达成的功能,而很少会致力于查找错误。如果我们发现了bug,那就会修复该bug并撰写一项测试,以证明程序现在可以正常运作,然后,这项测试会反复地运行,于是,我们自然就会发现它每次都能够运行通过。简单来说,我们所测试的路径,只不过是程序最有可能走到的那些路径而已。
  • 测试,是由那些熟悉应用程序工作原理的人所编写的。而使用该应用程序的人,并不知道它的工作原理,因此可能会采用一些与测试者不同的方式,来操作该应用程序。早在1989年,Miller等就有一项惊人的发现,他们把一些胡乱生成的内容输入给各种UNIX实用程序[20],然后看到其中有25%~33%的程序无法通过测试。
  • 构建测试所需的工作量很大,因此我们不会构建太多的测试。
  • 测试本身通常也含有一些错误。
  • 有一些错误很难通过测试来检查,例如,时机错误、因数据库中缺失数据所引发的错误,以及由于网络入侵而造成的安全问题等。
  • 大部分的测试,都是在测试应用程序上面运行的,然而还有一些错误,则与版本不符或配置不当有关,这些错误发生在我们把应用程序移动到生产系统中的时候。

公司应该让最优秀的人去实现一套良好的系统测试机制。我们也可以换一种说法:编程本领最强的人,不一定是最能把测试写好的人。最适合写测试的,应该是那种颇具创意,而且特别喜欢把应用程序搞坏的人。
有一次笔者听到这样一种说法:专业的古典音乐家与业余的古典音乐家不同,后者只要能把某段乐谱准确地弹完一遍,就不再继续练习了,而前者则会反复练习,直到毫不出错。这是两种不同的境界,业余人士只满足于我能弹好一遍就行,而专家追求的则是每次都能弹好。测试也与之类似。测试并不是只保证应用程序能达到业余水平,而是要按照专业的水平来要求它。为了暴露程序的故障点,笔者建议你采用以下做法:

  • 试着令应用程序承担大量的负载,尤其是要使应用程序感觉到,这些负载好像是多位用户同时造成的。
  • 试着在程序里面引发故障,而且还要试着在错误恢复的过程之中引发故障。
  • 在接缝处寻找故障,也就是要检查部件之间的每一条依赖关系并对其进行测试。

如果应用程序已经发行,而且数据库里也已经有了真实的数据,那么就试着编写一些采用真实数据来运作的测试,同时可能还需要对这些数据做匿名处理。有许多测试都在反复地使用同一份数据,这些测试的编写者尤其需要注意:如果数据库发生了变化,那么相应的数据可能也会有所改变。
想要制作一款高质量的程序,单靠测试是不够的。还应该采取下列措施:

  • 使用静态分析器去分析代码,以便找出其中从来没有执行过的代码及变量、还没有初始化就直接使用的变量、有可能无法终止的循环,以及潜在的性能及安全问题。
  • 使用代码检查机制。笔者建议执行两个层面的代码检查,第一个层面是由团队内的其他程序员来检查,第二个层面是由系统测试组来检查。前者应该帮助我们消除那些简单的错误以及对系统配置方式的误解,而后者则应该指出安全隐患等更为微妙的问题。

有统计数据表明,上面这些做法和测试一样有效,它也能够检查出bug,而且这些bug还和那些经由测试所检查出来的bug有所不同。
如果我们能够很好地计算出bug的数量,那么可能就会注意到,其中某一部分代码会频繁地出现bug,这部分代码就好像烛光,而这些bug(程序错误/虫子),则像是扑火的飞蛾。这一部分代码需要更为详细地检视,而且有可能需要重写。

时间: 2024-12-05 13:51:51

《需求设计:构建用户想要和需要的产品》——3.8 测试与检验的相关文章

《需求设计:构建用户想要和需要的产品》—— 导读

https://yqfile.alicdn.com/6ec696e3acab5ead903c7f9a25ac9ef090aeb814.png" > 前 言Designing the Requirements: Building Applications that the User Wants and Needs在对IT应用程序开发思考了大约15年之后,我终于写出了这本书.20世纪90年代后期,我开始做IT架构,当时写了一本名叫<IT Architecture and Middlewa

《需求设计:构建用户想要和需要的产品》——第3章 复用现有的方法及做法 3.1 敏捷

第3章 复用现有的方法及做法 笔者在前言中说过,BDUF与敏捷设计是有些冲突的.那么情境驱动设计是不是BDUF设计的一个变种呢?或者说,它是不是也具备一点敏捷开发的气息呢?本章的一项目标,就是要摆正情境驱动设计与其他现有设计方法之间的相对位置.笔者并不打算详细描述敏捷方法及BDUF方法(假如要详细描述它们,那还得再写几本书),但是会讨论这些方法背后的概念.此外,本章还有一项目标,就是要解释现有的这些方法之中,有哪些地方可以吸收到情境驱动设计里面,但愿咱们都能找到很多个可供借鉴之处.笔者知道,看这

《需求设计:构建用户想要和需要的产品》——3.9 把现有的做法运用到情境驱动设计之中

3.9 把现有的做法运用到情境驱动设计之中 上面几节分别谈了迭代.品质以及测试和检验等,其实对于这些内容来说,有人比笔者谈得更为广博,也更为深入.我们可以用一句话来概括前几节的内容,那就是:"要采用最佳的做法."笔者首先拿实现阶段做例子,来讲述我们所应该采用的做法: 以用户界面的设计方案为指导,把工作分成多个单元,并计算每个单元含有多少个功能点.这些单元要尽量划分得小一些,使得每个单元能够在2-4周内完成. 程序员必须把能够运行的代码放在系统测试环境之中顺利演示出来,然后才算完成了这个

《需求设计:构建用户想要和需要的产品》——3.11 小结

3.11 小结 大家可能会发现,笔者在讲述自己的这套IT设计方法时,有很多地方都没有谈到.笔者没有像其他设计方法的讲述者那样,对原则.做法.策略.会议以及任务版等内容进行讲解.之所以这样做,是因为情境驱动设计本身并不想发明一套最佳做法,而是想把其他设计方法之中已有的那些做法移用过来.例如,如果我想把设计阶段做得较为自由一些,那我就会采用类似于当前敏捷项目的做法来进行编程.即便采用设计先行的办法,也依然可以分成多个阶段来发布,依然可以把工作量拆成小块,以便渐进式地进行交付,并且依然可以把最新版本展

《需求设计:构建用户想要和需要的产品》——3.3 用例

3.3 用例 在前面几节之中,笔者对敏捷开发做了批评.除了敏捷开发,目前还有一种比较流行的做法,那就是通过编写用例来捕获需求.这一节要讨论用例与情境设计之间的区别. 用例,本质上是用一系列带有序号的步骤,来对场景进行简单的文字描述,就此而言,我们可以在各种详略不同的层面上撰写用例.此外,还有一些用例图可以展示每位参与者所使用的用例,以及用例之间的扩展关系,这里所说的参与者(actor),与情境设计之中的用户组有些相似.笔者稍后会讨论什么叫做"扩展".用例图与笔者所说的情境图看起来很像,

《需求设计:构建用户想要和需要的产品》——2.8 这样做真的是工程化的设计吗

2.8 这样做真的是工程化的设计吗 笔者提出的六框设计模型,与经典的工程组件分解图并不完全相同.因此,有人会问,这样做真的能像第1章所说的那样,实现工程化的设计吗?这个问题不能简单地用是或否来回答.在建筑学和机械工程学之中,宏观设计图与组件设计图的绘制方式是相同的,都需要确定一些形状及表面,而且所有的组件都有其尺寸及重量.此外,从顶层设计到底层设计之间的层数,是没有限制的,换句话说,可以把组件分成子组件,再把子组件分成更小的子组件,这种划分可以多次执行.然而,对IT软件开发所做的设计,却不是这样

《需求设计:构建用户想要和需要的产品》——2.3 集成设计

2.3 集成设计 集成设计的主要目标是: 把任务划分到各个应用程序与服务之中. 决定数据表与数据库之间的指派关系. 以应用程序之间所传递的消息为视角,来定义集成方面的需求. 对于其他更为详细设计的来说,集成设计确定了这些设计的范围.用户界面设计可以针对每个应用程序或服务分别来做(对于服务来说,其用户指的是另一个程序),数据库设计可以针对每个数据库分别来做.尽管技术设计也可以针对每个应用程序或服务分别来做,但是在大多数的公司里面,我们都可以令多个应用程序与服务共用同一套技术设计.图2-5演示了如何

《需求设计:构建用户想要和需要的产品》——2.4 技术设计

2.4 技术设计 集成设计之下的那一层,可以分为三个领域:技术设计.用户界面设计与数据库设计.本节讨论技术设计.技术设计有两大目标:1.设计出可以满足非功能型需求的解决方案.2.设计出可以尽量简化功能编程的解决方案.非功能型的需求,是指那种与业务工作并没有直接支持关系的需求.它们包括: 所应满足的吞吐量及响应时间. 可用性方面的目标. 灾难恢复方面的要求. 安全设计.你需要知道应用程序的安全漏洞.修复这些漏洞的办法,以及系统监控与系统管理工作的执行方式与执行地点. 系统操作和系统管理的易用性.

《需求设计:构建用户想要和需要的产品》——第1章 情境驱动设计入门1.1 对需求进行设计

第1章 情境驱动设计入门 本书讲的是如何设计IT应用程序.笔者写这本书,是想建议大家采用与原来不同的办法去做设计,尤其是想进行下列三项变革: 要使人意识到自己并不是在收集IT应用程序的需求,而是在设计它们.对应用程序所做的设计工作,正是建立在这样一种认知之上. 要把程序的设计做得像工程学一样,特别是要在实现之前先对设计进行分析,并寻找其中的缺陷. 要确保当前所开发的应用程序能够与现有的或同时开发的其他应用程序协同运作,以创建出一套连贯的IT架构. 本书要谈论如何思考应用程序的设计,以及如何对设计