按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
了使测试获得更大的成效,最好对这些容易存在错误的部分进行额外的测试。
原则10:软件测试是一项极富创造性、极具智力挑战性的工作。
测试一个大型软件所需要的创造性很可能超过了开发该软件所需要的创造性。
我们已经看到,要充分地测试一个软件以确保所有错误都不存在是不可能的。本
书后续章节讨论的技术使我们能够为某个软件设计出合理的测试用例集,然而这
些技术仍然需要大量的创造性。
2。4 小结
在阅读本书接下来的内容时,请牢记以下几个重要的测试原则:
o 软件测试是为发现错误而执行程序的过程。
o 尽量避免编码人员测试自己的程序。
o 好的测试用例能够对未发现的错误高度敏感。
o 成功的测试用例能够发现未知的错误。
o 成功的测试需要仔细定义输入输出的期望值。
o 成功的测试需要仔细研究分析测试结果。
…………………………………………………………Page 27……………………………………………………………
第3 章
Chapter 3
代码检查、走查与评审
多年以来,软件界的大多数人都持有一个想法,即编写程序仅仅是为了提供
给机器执行,并不是供人们阅读的,软件测试的惟一方法就是在计算机上执行它。
20世纪70年代早期,一些程序员最先意识到阅读代码对于构成完善的软件测试和
调试手段的价值,通过他们的努力,原有的观念开始发生变化。
今天,并不是所有的软件测试人员都要阅读代码,但是研读程序代码作为测
试工作的一部分,这个观念已经得到了广泛认同。以下几个因素会影响到特定的
测试和调试工作需要人工实际阅读代码的可能性:软件的规模和复杂度、软件开
发团队的规模、软件开发的时限(例如时间安排表是松散还是紧密)等,当然还
有编程小组的技术背景和文化。
基于这些原因,在深入研究较为传统的基于计算机的测试技术之前,我们首
先讨论非基于计算机测试的过程(即“人工测试”)。人工测试技术在查找错误方
面非常有效,以至于任何编程项目都应该使用其中的一种或多种技术。应该在程
序开始编码之后、基于计算机的测试开始之前使用这些方法。同样,也可以在编
程过程的更早阶段就开始设计和应用类似的方法(例如在每个设计阶段的末尾),
但是这些内容超出了本书讨论的范围。
在开始讨论人工测试技术之前,有一条重要的注意事项:由于包含了人为因
素在内,导致很多方法的正规性要差于由计算机执行的数学证明,人们可能会
怀疑某些如此简单和不正规的东西是否有用。反之亦然。这些不正规的方法并
没有妨碍测试取得成功;相反,它们从以下两个方面显著地提高了测试的功效
和可靠性。
首先,人们普遍认识到错误发现得越早,改正错误的成本越低,正确改正错
误的可能性也越大。其次,程序员在开始基于计算机的测试时似乎要经历一个心
…………………………………………………………Page 28……………………………………………………………
16 软件测试的艺术
理上的转变。从内部产生的压力似乎会急剧增长,并产生一个趋势,要“尽可能
快地修正这个缺陷”。由于这些压力的存在,程序员在改正某个由基于计算机测试
发现的错误时所犯的失误,要比改正早期发现的问题时所犯的失误更多一些。
3。1 代码检查与走查
代码检查、走查以及可用性测试是三种主要的人工测试方法。这些测试方
法可以应用在软件开发的任何阶段,包括在一个应用程序编码基本结束或者每
一个模块(单元)编码结束之后(阅读第5章关于模块或单元测试的更多内容)。
本章将主要介绍前两种针对代码的(白盒级别的)测试方法。在第7章我们会
讨论可用性测试。
由于代码走查和检查这两种方法具有很多共同之处,所以在这里我们将讨
论它们的相似点,而它们的不同之处将在后续章节中介绍。
代码检查与走查都要求人们组成一个小组来阅读或直观检查特定的程序。无
论采用哪种方法,参加者都需要完成一些准备工作。准备工作的高潮是在参加者
会议上进行的所谓“头脑风暴会”。“头脑风暴会”的目标是找出错误来,但不必
找出改正错误的方法。换句话说,是测试,而不是调试。
代码检查与走查已经广泛运用了很长时间。我们认为,它们的成功与本书第2
章所述的一些原则有关。
在代码走查中,一组开发人员(三到四人为最佳)对代码进行审核。其中
只有一人是代码的作者。因此,代码走查的主要工作是由其他人,而不是作者
本人完成的,这和软件测试的第2 原则,也即“软件编写者往往不能有效地测
试自己的软件”相符合。(参见第2 章,表2。1 ,本书将陆续涉及表中归纳的10
条测试原则。)
代码检查与走查是对过去桌面检查过程(在提交测试前由程序员阅读自己程
序的过程)的改进。与原方法相比,代码检查与走查更为有效,同样是因为在实
施过程中,除了软件编写者本人,还有其他人参与进来。
代码走查的另一个优点在于,一旦发现错误,通常就能在代码中对其进行精
确定位,这就降低了调试(错误修正)的成本。另外,这个过程通常发现成批的
错误,这样错误就可以一同得到修正。而基于计算机的测试通常只能暴露出错误
的某个表症(程序不能停止,或打印出了一个无意义的结果),错误通常是逐个地
…………………………………………………………Page 29……………………………………………………………
第3章 代码检查、走查与评审 17
被发现并得到纠正的。
在典型的程序中,这些方法通常会有效地查找出30%~70% 的逻辑设计和编码
错误。但是,这些方法不能有效地查找出高层次的设计错误,例如在软件需求分
析阶段的错误。请注意,所谓30%~70% 的错误发现率,并不是说所有错误中多达
70%可能会被找出来,而是讲这些方法在测试过程结束时可以有效地查找出多达
70% 的已知错误。请记住,第2章告诉我们,程序中的错误总数始终是未知的。
当然,可能存在对这些统计数字的批评,即人工方法只能发现“简单”的错
误(即与基于计算机的测试方法相比,所发现的问题显得微不足道),而困难的、
不明显的或微妙的错误只能用基于计算机的测试方法才能找到。然而,一些测试
人员在使用了人工方法之后发现,对于某些特定类型的错误,人工方法比基于计
算机的方法更有效,而对于其他错误类型,基于计算机的方法更有效。这就意味
着,代码检查/ 走查与基于计算机的测试是互补的。缺少其中任何一种,错误检查
的效率都会降低。
最后,不但这些测试过程对于测试新开发的程序有着不可估量的作用,而且
对于测试更改后的程序,这些测试过程具有相同的作用,甚至更大。根据我们的
经验,修改一个现存的程序比编写一个新程序更容易产生错误(以每写一行代码
的错误数量计)。因此,除了回归测试方法之外,更改后的程序还要进行这些人工
方法的测试。
3。2 代码检查
所谓代码检查,是以组为单位阅读代码,它是一系列规程和错误检查技术的
集合。对代码检查的大多数讨论都集中在规程、所要填写的表格等。这里对整个
规程进行简短的概述,之后我们将重点讨论实际的错误检查技术。
3。2。1 代码检查小组
一个代码检查小组通常由四人组成,其中一人发挥着协调作用。协调人应该
是个称职的程序员,但不是该程序的编码人员,不需要对程序的细节了解得很清
楚。协调人的职责包括以下几点:
o 为代码检查分发材料、安排进程。
o 在代码检查中起主导作用。
…………………………………………………………Page 30……………………………………………………………
18 软件测试的艺术
o 记录发现的所有错误。
o 确保所有错误随后得到改正。
第二个小组成员是代码的作者。小组中的其他成员通常是程序的设计人员
(如果设计人员不同于编码人员的话),以及一名测试专家。这名测试专家应该
具备较高的软件测试造诣并熟悉大部分的常见编码错误,下文会就这些常见编
码错误进行讨论。
3。2。2 检查议程与注意事项
在代码检查之前的几天,协调人将程序清单和设计规范分发给其他成员。所
有成员应在检查之前熟悉这些材料。在检查进行时,主要进行两项活动:
1。 由程序编码人员逐条语句讲述程序的逻辑结构。在讲述的过程当中,小组
的其他成员应提问题、判断是否存在错误。在讲述中,很可能是程序编码
人员本人而不是其他小组成员发现了大部分错误。换句话说,对着大家大
声朗读程序,这种简单的做法看来是一个非常有效的错误检查方法。
2。 参考常见的编码错误列表分析程序(错误列表将在下一节中介绍)。
协调人负责确保检查会议的讨论高效地进行、每个参与者都将注意力集中于
查找错误而不是修正错误(错误的修正由程序员在检查会议之后完成)。
会议结束之后,程序员会得到一份已发现错误的清单。如果发现的错误太多,
或者某个错误涉及对程序做根本性的改动,协调人可能会在错误修正后安排对程
序进行再次检查。这份错误清单也要进行分析、归纳,用以提炼错误列表,以便
提高以后代码检查的效率。
如上所述,这个代码检查过程通常将注意力集中在发现错误上,而不是纠正错
误。然而,有些小组可能会发现,当检查出某个小问题之后,有两三个人(包括负
责该代码的程序员本人)会建议对设计进行明显的修补以解决这个特例。那么,对
这个小问题的讨论,反过来会将整个小组的注意力集中在设