|
|
51CTO旗下网站
|
|
移动端

参考文献注释

《软件测试基础教程》第1章软件测试的基本知识,本章作为一个导引,其目的在于让读者熟悉与软件测试相关的基本概念,建立起全书的框架。在本书后续章节中将要详细阐述的问题,首先在这里被提了出来。读完这章之后,读者就能够在软件测试和软件质量方面提出一些有意义的问题。本节为参考文献注释。

作者:王峰/郭长国/陈振华 等译来源:机械工业出版社|2011-09-17 21:23

参考文献注释

早期工作作为一种技术活动,软件测试与软件是同时出现的。程序与可编程计算机手挽手、肩并肩,从未分离,测试也是这样。较早开展计算机程序测试的人有Gill[169]、Miller和Maloney[329]。Gill提出了在EDSAC计算机上利用硬件特征来检查程序的方法。Miller和Maloney提出了一种系统化的程序分析和测试数据生成的方法。他们建议分支之间的所有交叉都必须测试,每个循环至少被遍历一次,并从程序中每个可能的入口点进入。这样,Miller和Maloney奠定了第6章讨论的面向路径测试充分性准则的基础。

图模型Karp[253]提出利用图理论工具来表示程序,Miller和Maloney[329]对其稍作了修正。后来,其他一些研究人员提出测试技术和面向路径的测试完整性准则[175,233,383,405]。在构造CFG时所用到的概念可以在大多数编译原理书籍中见到,包括Aho等人[16]经典的“龙书”。

决定者与后决定者是几乎每一本编译原理教程中的标准概念。一个计算流图中决定者的简单算法出现在Aho等人的一本书[17]的第671页。Lengauer和Tarjan[286]开发了一个较快的算法,Appel[26]对其进行了详细解释。Buchsbaum等人[60]实现了一个计算CFG中决定者的线性时间算法。注意,计算CFG中控制依赖性时所需的后决定者,可以通过对逆向流图应用决定者算法计算出来。

软件测试学科软件测试是一门新兴的学科。Elmendorf的关于软件测试的先驱性文献出现在1969年。Elmendorf通过因果图引入了系统测试的概念[140],这项技术被用于操作系统的测试。3本早期的软件测试专著是由Hetzel[216]、Miller、Howden[328]以及Myers[340]编著的。许多的研究者定义过软件质量特性,如Boehm、Brown、Lipow[53],McCall、Richards、Walters[323],Adrion、Barnstad和Cherniavsky[4]。Moreira、Araújo和Brito[333]以及其他一些人定义了软件需求的质量特性。

另一段与操作系统测试相关的早期工作出现在Brinch Hansen的论文[194]中,该论文描述了对多道程序系统的测试。在该论文中,Brinch Hansen提出了测试RC 4000计算机的实验操作系统的测试方法和测试机制,以及测试用例、测试输出、增量测试的概念。有趣的是,被测程序是在测试机制确定之后编写的。Brinch Hansen的工作似乎指出,Naur早在Gier Algol编译器的测试中就采用了简单而又系统化的测试技术[347]。

术语术语错误(error)、缺陷(defect)、故障(fault)和失效(failure)已在ANSI/IEEE软件工程术语标准[243]中进行了定义。ANSI/IEEE软件测试文档标准[452]详细规定了测试规格说明和测试计划的编写格式。ANSI/IEEE Std 1008-1987[242]是关于单?馐缘谋曜肌T诒曜蓟埃踔聊壳霸诜钦降慕涣髦校3S檬跤铩癰ug”代替了术语“错误”、“缺陷”、“故障”,或除了这些术语之外,还用bug(参见文献[405]的图1)。术语bug,由来已久,但是在1945年海军少将Grace Murray Hopper博士在哈佛大学一个与飞蛾相关的事件中采用之后,才流行起来的。

大量的研究工作分析了程序员所犯的错误,包括语法和语义方面的文献[54,133,206,208,263,294,418,427,492,541],某些研究工作将在本书第二卷中介绍。Hatton所做的T实验[207]特别突出,因为这个大规模的研究工作涉及大约500万行用Fortran和C语言写的科学计算软件,并且还报告了很多故障和缺陷[207]。

测试生成Howden提出了一种生成测试数据的方法以及通过边界的测试完整性的思想——内部测试[233]。Goodenough和Gerhart发表了一篇标志性的论文,为测试数据选择奠定了理论基础[174~176],他们用可靠并有效的测试选择准则将测试完整性思想形式化。他们还分析了一个由Naur开发的公开的、已证明是正确的文本排版程序[348]。通过他们的分析,发现Naur的程序存在7个错误和问题,进一步证明:测试与验证是相互补充的活动,即证明程序正确并不一定意味着该程序实际上是正确的。极力推荐所有的测试人员阅读关于测试与正确性证明争论的文献[120,121,162,239,257]。

测试预言构造测试预言是软件测试中一个重要而又困难的任务。目前已经有一些从软件规范构造测试预言的技术。Peters和Parnas提出了一种从程序文档生成测试预言的方法[393],而程序文档本身是形式化的,并且是用他们描述的LD关系产生的。Memon和Qing提出了一种为事件驱动系统构造测试预言的技术,对于这种系统,一个测试用例包含了一系列的事件作为其输入[326]。McDonald等人[324]论述了从用Object-Z[451]写的形式规范生成C++测试预言的工具支持。

在模型检测方面已开展了颇有意义的研究工作,虽然本书并未涉及模型检测,但还是存在一些优秀的专著和论文。Clarke等人[92]撰写了一本关于模型检测的导论性书籍,并配以示例。Holzmann[222]撰写的一本专著描述了著名的SPIN模型。

我们在第1.18节中提到了一些测试技术。Beizer的书是一本优秀的关于各种不同测试技术的汇编[35],该书几乎涵盖了第1.18节中提到的每一种测试技术,只是详细程度与关注点不同罢了。Juristo等人也提出一种测试技术分类方法[249]。他们提供7个不同的技术簇,每个簇包含一种或多种测试技术,例如,功能测试是一个簇,包含了等价类划分和边界值分析两种技术。除了提供测试技术的分类之外,Juristo等人还对关于不同测试技术效率和复杂性的各种经验研究进行了调查。

软件度量针对软件度量的定义和评价已进行了大量的研究工作。著名的圈复杂度就是McCabe提出来的[322]。Baker和Zweben比较了各种不同的软件复杂性度量方法[27]。Conte等人的一本精彩专著[104]详细介绍了Halstead的软件科学度量模型,并且带有示例。第1.6.4小节中用于估计软件开发中发现错误数量的公式是由Schneider提出的[436]。Halstead的软件科学度量模型是有争论的[549]。Kavi和Jackson报告了他们的研究工作[255],该研究调查了说明语句对软件度量的影响结果。

Weyuker提出了一套用于评价从程序句法结构导出的度量的属性[508]。Gustafson和Prasad也研究了软件度量的属性[186]。Chidamber和Kemerer提出了一套针对OO设计的复杂性度量准则,称作CK度量[81]。Voas提出了一个动态测试复杂性度量准则,又称作暴露故障的能力,它以程序隐藏与语义变异相关故障的能力为基础[487]。语义变异是由于在软件执行中发生状态变化而产生的,该技术不同于第7章介绍的用来产生语法变异的技术。

Chidamber等人也描述了OO度量的管理用途[80]。Darcy和Kemerer总结了CK度量的一个子集在商业软件中的应用情况,他们还列出了一系列市场上能获得的工具,可用来收集C++、Java、Visual Basic的OO度量信息。现在,许多组织已在各种级别上广泛开展了度量工作。例如,Natwick描述了Harris公司在CMM(Capability Maturity Model)环境下进行度量的情况[346]。

Xu等人提出了一个在组织中进行基于CMMI的过程度量的过程模型[536]。Li提供了一个关于产品度量的辅导材料[291]。Kan等人描述了测试的内部过程度量[250],他们的论文报告了在IBM Rochester AS/400软件开发实验室开展的测试的内部过程度量情况。Rosenberg等人研究了需求、测试以及度量之间的关系[420]。

大量经验研究考察了度量的预测能力。Basili等人研究了OO度量与软件质量之间的相互关系[32]。Nagappan等人的论文报告了用测试内部过程度量进行早期软件质量评价的情况[342]。Li和Henry研究了用OO度量预测维护工作量的能力[292]。

测试过程本章提到了一些与软件测试过程相关的基本术语和概念。螺旋测试的概念是由Davis在基于原型技术的应用系统开发背景下提出的[109]。Manhart和Schneider描述了敏捷过程和测试在Daimler-Chrysler的商业开发项目中的应用情况。存在大量的工具和过程用于缺陷管理。Chillarege等人研究了正交缺陷分类法(Orthogonal Defect Classification,ODC),这是一种流行的缺陷分类方法。Krawczyk和Wiszniewski研究了一种针对并发程序的缺陷分类模式[273]。Li等人的论文报告了在ABB公司应用缺陷预测技术的经验[290]。Biffl比较了各种不同的缺陷评价模型[47]。Grossman等人的论文报告了在Web开发环境中应用极限编程(XP)和敏捷开发的经验[183]。Müller和Padberg研究了一种对XP项目实用的评价方法[335]。

可测试性本章中关于可测试性的定义来源于IEEE的术语词汇表[244]。一些研究工作提出了度量一个软件产品可测试性的方法。Voas为进行可测试性分析定义了一个动态复杂性度量[487],并提供了一个可测试性评价工具[488]。Voas和Miller提供了一个与本章前面给出的稍有不同的可测试性定义[489]。按照Voas和Miller的定义,“软件可测试性是指在随机测试中源代码暴露现存缺陷的趋势”。根据这个定义,他们提出了改进软件开发过程的建议方法。Voas和Miller还讨论了可测试性和验证[490]。

Bieman和Yin建议通过采用自动化的测试预言来改进可测试性[46]。Yin和Bieman证明了如何借助于断言(assertion)来改进可测试性[540]。美国国家标准与技术研究院(NIST)的一份报告讨论了OO系统的可测试性[351]。

针对硬件设计可测试性的定义与改进已经开展了大量的研究工作。Keiner等人提出了对硬件设计的可测试性度量。Trischler提供了一个关于可测试性设计(Design for Testability,DFT)与自动测试模式生成的概览[477]。Raik等人设计了一种计算可测试性度量的方法以及一个在可测试性指导下的测试模式生成模块[403]。Ockunzzi和Papachristou介绍了如何改进电路的可测试性,这些电路具备由诸如if-then-else以及循环结构蕴含的控制流行为[356]。Vranken等人讨论了可用于硬件和软件设计DFT的技术[136]。

硬件测试这是一个已经非常成熟的领域。大量的书籍涉及VLSI测试的原理与技术[500,548]。Abraham和Fuchs提供了一个关于VLSI故障模型的简明辅导材料[2]。Agrawal等人的研究工作解决了VLSI测试中的故障覆盖需求问题[13]。

饱和效应在文献[227]第13章中,Horgan和Mathur对饱和效应进行了系统的表述。该描述是在分析了只基于被评操作剖面的可靠性评价理论的不足的背景下进行的。Ramamoorthy等人从自动软件评价系统中也观察到类似的错误检测和失效饱和行为[405]。

Schick和Wolverton的论文报告了类似于图1-26的饱和区间,他们指出在那里新发现的错误数几乎降低至零,当开始一个新的测试阶段时,新发现的错误数量又增长起来[435]。Wood等人比较了代码阅读,采用等价类划分与边界值分析的功能测试、分支覆盖[526],得出“这些测试技术在相互组合使用时效果会更好”。一些经验研究也证明了饱和效应的存在[372,373]。

【责任编辑:云霞 TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

开源osCommerce 轻松架设专业电子商务平台

osCommerce是一款免费的、开放源代码的专业电子商务解决方案。本书以通俗易懂的语言向读者展示了该软件强大的功能和简易的操作方法,主要内...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊