资源预览内容
第1页 / 共97页
第2页 / 共97页
第3页 / 共97页
第4页 / 共97页
第5页 / 共97页
第6页 / 共97页
第7页 / 共97页
第8页 / 共97页
第9页 / 共97页
第10页 / 共97页
亲,该文档总共97页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第7章 软件测试软件工程软件测试软件工程软件测试内容提要内容提要7.1 软件测试概述7.2 软件测试用例的设计7.3 软件测试的实施7.4 软件测试的面向对象方法简述7.5 本章小结软件工程软件测试软件工程软件测试软件测试软件测试 软件系统的开发体现了人们智力劳动的成果。在软件开软件系统的开发体现了人们智力劳动的成果。在软件开发过程中,由于人的主观认知能力的局限性和所开发软件的发过程中,由于人的主观认知能力的局限性和所开发软件的复杂性,尽管人们利用了许多旨在改进、保证软件质量的方复杂性,尽管人们利用了许多旨在改进、保证软件质量的方法去分析、设计和实现软件,在软件生命周期的每个阶段还法去分析、设计和实现软件,在软件生命周期的每个阶段还是不可避免地会产生错误。因此,在软件正式投入运行之前,是不可避免地会产生错误。因此,在软件正式投入运行之前,必须通过严格的测试,来发现并纠正软件中的错误,从而保必须通过严格的测试,来发现并纠正软件中的错误,从而保证软件的质量。大量的实践证明,测试是一项很艰苦的工作,证软件的质量。大量的实践证明,测试是一项很艰苦的工作,据统计,软件测试的工作量往往占软件开发总工作量的据统计,软件测试的工作量往往占软件开发总工作量的40%以上。目前,程序的正确性证明在技术上尚未得到根本的解以上。目前,程序的正确性证明在技术上尚未得到根本的解决,软件测试仍然是发现软件中错误和缺陷的主要手段。因决,软件测试仍然是发现软件中错误和缺陷的主要手段。因此,必须高度重视软件测试工作。此,必须高度重视软件测试工作。软件工程软件测试软件工程软件测试软件测试软件测试 软件测试是软件质量保证的关键步骤,它包括分析、设软件测试是软件质量保证的关键步骤,它包括分析、设计和编码的最终检查。软件测试的结果也是分析软件可靠性计和编码的最终检查。软件测试的结果也是分析软件可靠性的重要依据。本章着重讨论软件测试的概念、传统软件和面的重要依据。本章着重讨论软件测试的概念、传统软件和面向对象软件的测试问题。向对象软件的测试问题。软件工程软件测试软件工程软件测试 7.1 软件测试概述软件工程软件测试软件工程软件测试软软件件测试测试概述概述7.1.1 软软件件测试测试的目的目标标及原及原则则 测试测试是是对软对软件分析、件分析、设计设计、编码进编码进行行查错查错和和纠错纠错的活的活动动。正确理解正确理解软软件件测试测试的概念和目的概念和目标标,对对保保证软证软件件测试测试的成功的成功实实施起着极其重要的作用。从表面上来看,施起着极其重要的作用。从表面上来看,软软件件测试测试是具有是具有“破坏破坏”性性质质的,因的,因为为在在测试阶测试阶段,段,测试测试人人员员努力努力设计设计出一系出一系列列测试测试方案,竭力方案,竭力发现发现和和证证明程序中明程序中错误错误的存在。而的存在。而软软件工件工程的其他程的其他阶阶段都是段都是“建建设设性性”的,的,软软件工程件工程师师力力图图从抽象的概从抽象的概念出念出发发,逐步,逐步设计设计出出软软件件蓝图蓝图,再,再经过编码经过编码而而实现软实现软件件产产品。品。当然,当然,这这种反常种反常仅仅仅仅是表面的或是心理上的,暴露是表面的或是心理上的,暴露问题问题并不并不是是软软件件测试测试的最的最终终目的,目的,发现问题发现问题是是为为了改了改进软进软件件设计设计或或纠纠正程序的正程序的错误错误。测试阶测试阶段的根本目段的根本目标标是尽可能多地是尽可能多地发现发现并排并排除除软软件中潜在的件中潜在的错误错误,最,最终终把一个高把一个高质质量的量的软软件系件系统统交交给给用用户户使用。使用。软件工程软件测试软件工程软件测试软件测试概述软件测试概述以下三点可以看作是以下三点可以看作是测试测试的目的目标标:1.测试测试是是为为了了发现发现程序中的程序中的错误错误而而执执行程序的行程序的过过程。程。 2.好的好的测试测试方案是尽可能方案是尽可能发现发现至今至今为为止尚未被止尚未被发现发现的的错误错误的的测试测试方案。方案。3.成功的成功的测试测试是是发现发现了至今了至今为为止尚未被止尚未被发现发现的的错误错误的的测试测试。由此可以看出,由此可以看出,测试测试的正确含的正确含义义是是“为为了了发现发现程序中的程序中的错误错误而而执执行程序的行程序的过过程程”。这这和某些人想像的和某些人想像的“测试测试是是为为了了证证明程明程序是正确的序是正确的”,“成功的成功的测试测试是没有是没有发现错误发现错误的的测试测试”等是完等是完全相反的。明确全相反的。明确测试测试的目的是一件非常重要的事情,因的目的是一件非常重要的事情,因为为在在实际实际工作中工作中对测试对测试工作存在着工作存在着许许多模糊或多模糊或错误错误的看法,的看法,这这些些看法看法严严重影响着重影响着测试测试工作的工作的顺顺利利进进行。行。测试测试的目的目标标决定了决定了测测试试方案的方案的设计设计,如果,如果为为了表明程序是正确的,就会了表明程序是正确的,就会设计设计一些一些不易暴露不易暴露错误错误的的测试测试方案。相反,如果方案。相反,如果测试测试是是为为了了发现发现程序程序中的中的错误错误,就会力求,就会力求设计设计出最容易暴露出最容易暴露错误错误的的测试测试方案。方案。软件工程软件测试软件工程软件测试软件测试概述软件测试概述 基于以上的叙述,在设计软件测试方案前,软件开发基于以上的叙述,在设计软件测试方案前,软件开发者必须理解软件测试的基本原则。这些测试原则是者必须理解软件测试的基本原则。这些测试原则是: (1)坚持)坚持“尽早地和不断地进行软件测试尽早地和不断地进行软件测试”的原则。的原则。 不应把软件测试仅仅看作是软件开发的一个独立阶段,不应把软件测试仅仅看作是软件开发的一个独立阶段,而应当把它贯穿到软件开发的各个阶段中。坚持软件开发的而应当把它贯穿到软件开发的各个阶段中。坚持软件开发的各个阶段的技术评审,这样才能在开发过程中尽早发现和预各个阶段的技术评审,这样才能在开发过程中尽早发现和预防错误,把出现的错误克服在早期,杜绝某些错误发生的隐防错误,把出现的错误克服在早期,杜绝某些错误发生的隐患。患。软件工程软件测试软件工程软件测试软件测试概述软件测试概述(2)测试用例应由测试输入数据和与之对应的预期输出结)测试用例应由测试输入数据和与之对应的预期输出结果这两部分组成。果这两部分组成。 测试以前应当根据测试的要求选择测试用例,用来检测试以前应当根据测试的要求选择测试用例,用来检验程序员编制的程序,因此不但需要测试的输入数据,而且验程序员编制的程序,因此不但需要测试的输入数据,而且需要针对这些输入数据的预期输出结果。需要针对这些输入数据的预期输出结果。(3)程序员应避免测试自己的程序。)程序员应避免测试自己的程序。 由于思维定势和心理因素的影响,程序员并不是测试的由于思维定势和心理因素的影响,程序员并不是测试的最佳人选。这不能与程序的调试相混淆,调试由程序员自己最佳人选。这不能与程序的调试相混淆,调试由程序员自己来做可能更有效。而程序员以及程序开发小组应尽可能避免来做可能更有效。而程序员以及程序开发小组应尽可能避免测试自己编写的程序。为了达到最佳效果,最好建立独立的测试自己编写的程序。为了达到最佳效果,最好建立独立的软件测试小组或测试机构。软件测试小组或测试机构。(4)在设计测试用例时,应当包括合理的输入条件和不合)在设计测试用例时,应当包括合理的输入条件和不合理的输入条件。理的输入条件。软件工程软件测试软件工程软件测试软软件件测试测试概述概述(5)充分注意测试中的群集现象。)充分注意测试中的群集现象。 软件测试的实践表明软件测试的实践表明:测试后模块中残存的错误数目与该测试后模块中残存的错误数目与该模块的错误检出率成正比,即错误群集。根据这个规律,应模块的错误检出率成正比,即错误群集。根据这个规律,应当对发现错误较多的模块进行重点测试,以提高测试效率。当对发现错误较多的模块进行重点测试,以提高测试效率。(6)严格执行测试计划,排除测试的随意性。)严格执行测试计划,排除测试的随意性。(7)应当对每个测试结果做全面检查。)应当对每个测试结果做全面检查。 有些错误的征兆在输出测试结果时已经明显地出现了,有些错误的征兆在输出测试结果时已经明显地出现了,但是如果不仔细地、全面地检查测试结果,就会使这些错误但是如果不仔细地、全面地检查测试结果,就会使这些错误被遗漏掉。所以必须对预期的输出结果明确定义,对测试的被遗漏掉。所以必须对预期的输出结果明确定义,对测试的结果仔细分析检查,暴露错误。结果仔细分析检查,暴露错误。(8)妥善保存测试计划、测试用例、出错统计和最终分析)妥善保存测试计划、测试用例、出错统计和最终分析报告,为维护提供方便。报告,为维护提供方便。软件工程软件测试软件工程软件测试软软件件测试测试概述概述7.1.2 软软件件错误产错误产生的原因及分生的原因及分类类 软软件开件开发发是一是一项项极其复极其复杂杂的智力活的智力活动动,由于主,由于主观认观认知能知能力的局限性和所解决力的局限性和所解决问题问题的复的复杂杂性,在表达、理解、性,在表达、理解、验证验证用用户户需求,需求,软软件件设计设计以及程序以及程序编编写的写的过过程中,都不可避免地会程中,都不可避免地会出出现现各式各各式各样样的的错误错误,这这些些错误贯错误贯穿在穿在软软件生命周期的各个件生命周期的各个阶阶段。段。 由于人由于人们对错误们对错误有不同的理解和有不同的理解和认识认识,基于不同的角度,基于不同的角度,有着不同的有着不同的错误错误分分类类方法,所以目前方法,所以目前还还没有一个没有一个统统一的一的错误错误分分类类方法。下面分方法。下面分别别从从错误错误的影响和后果、的影响和后果、错误错误的性的性质质和范和范围围、错误产错误产生的生的阶阶段作段作简单简单介介绍绍。软件工程软件测试软件工程软件测试软软件件测试测试概述概述 1.按按错误错误的影响和后果分的影响和后果分类类 (1)较较小小错误错误:只只对对系系统统的的输输出有一些非出有一些非实质实质性影响。例性影响。例如,如,输输出的数据格式不符合要求等。出的数据格式不符合要求等。 (2)中等)中等错误错误:对对系系统统的运行有局部影响。如的运行有局部影响。如输输出的某些出的某些数据有数据有错误错误或出或出现现冗余。冗余。 (3)较严较严重重错误错误:系系统统的行的行为为因因错误错误的干的干扰扰而出而出现现异常异常现现象。例如,象。例如,错误错误的的输输入数据。入数据。 (4)严严重重错误错误:系系统统运行不可跟踪,一运行不可跟踪,一时时不能掌握其不能掌握其规规律,律,时时好好时时坏。坏。 (5)非常)非常严严重的重的错误错误:系系统统运行中突然停机,其原因不明,运行中突然停机,其原因不明,无法无法软软启启动动。 (6)最)最严严重的重的错误错误:系系统统运行运行导导致运行致运行环环境破坏,或是造境破坏,或是造成事故,引起生命、成事故,引起生命、财产财产的的损损失。失。软件工程软件测试软件工程软件测试软软件件测试测试概述概述 2.按按错误错误的性的性质质和范和范围围分分类类 (1)功能性)功能性错误错误 规规格格说说明明错误错误:规规格格说说明可能不完全,有二明可能不完全,有二义义性或自相性或自相矛盾。矛盾。 功能功能错误错误:程序程序实现实现的功能与用的功能与用户户的要求不一致。的要求不一致。 测试错误测试错误:软软件件测试测试的的设计设计与与实实施施发发生生错误错误,软软件件测试测试自身也可能自身也可能发发生生错误错误。 测试标测试标准引起的准引起的错误错误:若若测试标测试标准太复准太复杂杂,则导则导致致测试测试过过程出程出错错的可能性就大。的可能性就大。软件工程软件测试软件工程软件测试软软件件测试测试概述概述(2)系统错误)系统错误 硬件接口错误硬件接口错误:软件运行相关的外部设备错误,导致系软件运行相关的外部设备错误,导致系统运行故障。统运行故障。 软件接口错误软件接口错误:数据输入数据输入.输出格式错误,软件通信协议输出格式错误,软件通信协议错误等。错误等。 操作系统错误操作系统错误:非法使用访问操作系统指令,访问指令非法使用访问操作系统指令,访问指令错误。错误。 硬件结构错误硬件结构错误:非法访问硬件指令。非法访问硬件指令。 软件结构错误软件结构错误:软件体系结构设计不合理,导致负载较软件体系结构设计不合理,导致负载较高时,系统运行不正常。高时,系统运行不正常。 控制与顺序错误控制与顺序错误:不合理的控制流程,导致某路径永远不合理的控制流程,导致某路径永远不能执行。不能执行。 资源管理错误资源管理错误:多任务环境中,由于资源共享,资源管多任务环境中,由于资源共享,资源管理不当,导致系统死锁。理不当,导致系统死锁。软件工程软件测试软件工程软件测试软软件件测试测试概述概述(3)加工错误)加工错误 算术与操作错误。算术与操作错误。初始化错误。初始化错误。 控制和次序错误。控制和次序错误。静态逻辑错误。静态逻辑错误。软件工程软件测试软件工程软件测试软软件件测试测试概述概述(4)数据错误)数据错误 动态数据错误。动态数据错误。 静态数据错误。静态数据错误。 数据内容错误。数据内容错误。 数据结构错误。数据结构错误。 数据属性错误。数据属性错误。软件工程软件测试软件工程软件测试软软件件测试测试概述概述(5)代码错误)代码错误 主要包括语法错误、打字错误、对语句或指令的不正确主要包括语法错误、打字错误、对语句或指令的不正确理解所产生的错误。理解所产生的错误。软件工程软件测试软件工程软件测试软软件件测试测试概述概述3.按按软软件生命周期件生命周期阶阶段分段分类类 (1)需求分析)需求分析错误错误 这类错误这类错误主要是指在理解和表达需求主要是指在理解和表达需求时产时产生的生的错误错误。 不一致性不一致性错误错误:规规格格说说明中功能明中功能说说明与需求明与需求发发生矛盾。生矛盾。 冗余性冗余性错误错误:规规格格说说明中的某些功能是多余的。明中的某些功能是多余的。 不完整性不完整性错误错误:规规格格说说明中缺少某些必要的功能明中缺少某些必要的功能说说明。明。 不可行不可行错误错误:规规格格说说明中有些功能要求是不可行的。明中有些功能要求是不可行的。 不可不可测试错误测试错误:有些功能的有些功能的测试测试要求是不要求是不现实现实的。的。软件工程软件测试软件工程软件测试软软件件测试测试概述概述(2)设计错误)设计错误 这类错误主要是指在设计阶段产生的与需求规格说明中这类错误主要是指在设计阶段产生的与需求规格说明中的功能说明不相符的错误。的功能说明不相符的错误。设计不完全错误设计不完全错误:某些功能没有被设计,或设计得不完全。某些功能没有被设计,或设计得不完全。模块接口错误模块接口错误:模块结构不合理,模块与外部数据库以及模块结构不合理,模块与外部数据库以及模块之间的界面不一致。模块之间的界面不一致。控制逻辑错误控制逻辑错误:控制流程与规格说明不一致,控制结构不控制流程与规格说明不一致,控制结构不合理。合理。算法错误算法错误:算法选择不合适。算法选择不合适。数据结构错误数据结构错误:数据设计不合理,与算法不匹配,数据结数据设计不合理,与算法不匹配,数据结构不满足规格说明要求。构不满足规格说明要求。软件工程软件测试软件工程软件测试软软件件测试测试概述概述(3)编码错误)编码错误 数据说明、数据使用错误。数据说明、数据使用错误。 计算错、比较错。计算错、比较错。 控制流错误。控制流错误。 界面错误。界面错误。 输入、输出错误。输入、输出错误。 其他错误。其他错误。 在不同的开发阶段,错误的表现形式是不同的,故应当在不同的开发阶段,错误的表现形式是不同的,故应当采用不同的方法和策略来进行测试。采用不同的方法和策略来进行测试。软件工程软件测试软件工程软件测试软软件件测试测试概述概述7.1.3 软软件件测试测试的的过过程和策略程和策略 软软件件测试实测试实践表明,践表明,软软件件测试测试是一是一项项极其复极其复杂杂而又繁而又繁重的重要工作,是保重的重要工作,是保证软证软件件质质量的重要量的重要环节环节。软软件件测试测试的成的成功与否与功与否与软软件件测试测试人人员员的的经验经验、知、知识识、能力以及管理水平有、能力以及管理水平有关。关。软软件件测试还测试还需遵循正确的需遵循正确的测试过测试过程,掌握科学的程,掌握科学的测试测试方方法以及在法以及在测试过测试过程中程中实实施合理的施合理的测试测试策略。策略。软软件件测试测试既是一既是一门门工程工程艺术艺术,也是一种科学方法。,也是一种科学方法。软件工程软件测试软件工程软件测试软软件件测试测试概述概述1.软件件测试的流程的流程 软件件测试是一是一项极其复极其复杂的工作,它是一系列的工作,它是一系列测试活活动的集合,必的集合,必须按照一定的按照一定的测试流程,才能流程,才能发现更多的更多的错误。软件件测试流程包括流程包括设计测试方案,方案,实施施测试,纠正正错误,分,分析析测试数据、建立可靠性模型等几个步数据、建立可靠性模型等几个步骤,如,如图7.1所示。所示。软件工程软件测试软件工程软件测试软软件件测试测试概述概述图7.1 软件测试的流程软件工程软件测试软件工程软件测试软软件件测试测试概述概述2.软件件测试的信息流的信息流 软件件测试过程中,需要程中,需要3类测试信息流,如信息流,如图7.2所示。所示。 图7.2 软件件测试的信息流的信息流软件工程软件测试软件工程软件测试软软件件测试测试概述概述测试信息流:测试信息流:(1)软件配置)软件配置:包括软件需求规格说明、软件设计规格说明、包括软件需求规格说明、软件设计规格说明、源代码等。源代码等。(2)测试配置)测试配置:包括测试计划、测试用例、测试驱动程序等。包括测试计划、测试用例、测试驱动程序等。(3)测试工具)测试工具:测试工具为测试的实施提供某种服务。测试工具为测试的实施提供某种服务。软件工程软件测试软件工程软件测试软软件件测试测试概述概述 测试之后,用测试结果与预期结果进行比较。如发现不测试之后,用测试结果与预期结果进行比较。如发现不一致的数据,就要进行纠正。对已经发现的错误进行错误定一致的数据,就要进行纠正。对已经发现的错误进行错误定位并确定出错性质,然后纠正这些错误,同时修改相关的文位并确定出错性质,然后纠正这些错误,同时修改相关的文档。修改后的文档一般都要经过再次测试,直到通过测试为档。修改后的文档一般都要经过再次测试,直到通过测试为止。止。 通过收集和分析测试结果数据,对软件建立可靠性模型。通过收集和分析测试结果数据,对软件建立可靠性模型。如果测试发现不了错误,那么可以肯定测试配置考虑得不够如果测试发现不了错误,那么可以肯定测试配置考虑得不够细致充分,错误仍然潜伏在软件中。这些错误最终只能由用细致充分,错误仍然潜伏在软件中。这些错误最终只能由用户在使用中发现,并在维护时由开发者去改正。但在那时改户在使用中发现,并在维护时由开发者去改正。但在那时改正错误的费用将比在开发阶段改正错误的费用要高出若干倍。正错误的费用将比在开发阶段改正错误的费用要高出若干倍。软件工程软件测试软件工程软件测试软软件件测试测试概述概述 3.测试的的过程程 图7.3描述了描述了测试的的过程。从程。从图中可知,中可知,测试过程分程分为4个步个步骤,即,即单元元测试、组装装测试、确、确认测试和系和系统测试。 图7.3 测试的的过程程软件工程软件测试软件工程软件测试软软件件测试测试概述概述 首先是单元测试,根据设计的测试用例,对每个程序模首先是单元测试,根据设计的测试用例,对每个程序模块进行测试,检查每个程序模块是否正确实现了规定的功能。块进行测试,检查每个程序模块是否正确实现了规定的功能。然后,把测试过的模块,通过组装技术,测试软件的体系结然后,把测试过的模块,通过组装技术,测试软件的体系结构以及实现的功能是否符合设计说明的要求。确认测试是要构以及实现的功能是否符合设计说明的要求。确认测试是要检查已经实现的软件能否满足需求说明规定的用户需求以及检查已经实现的软件能否满足需求说明规定的用户需求以及软件配置是否完全、正确。最后是系统测试,把经过确认的软件配置是否完全、正确。最后是系统测试,把经过确认的软件纳入实际的运行环境,与应用环境组合在一起进行测试,软件纳入实际的运行环境,与应用环境组合在一起进行测试,以检查软件能否正确、稳定地运行。以检查软件能否正确、稳定地运行。 测试的每个过程,都可以采用灵活的测试方法和测试测试的每个过程,都可以采用灵活的测试方法和测试策略,通常在单元测试中采用白盒测试方法,而在组装测试策略,通常在单元测试中采用白盒测试方法,而在组装测试中采用黑盒测试方法。中采用黑盒测试方法。软件工程软件测试软件工程软件测试7.2 软件测试用例的设计软件工程软件测试软件工程软件测试软件测试用例的设计软件测试用例的设计7.2.1 软软件件测试测试用例和用例和对对象象设计设计 要要进进行行测试测试,除了要有,除了要有测试测试数据外,数据外,还应还应同同时给时给出出该组该组测试测试数据数据应该应该得到怎得到怎样样的的输输出出结结果,我果,我们们称它称它为预为预期期结结果。果。在在测试时测试时将将实际输实际输出出结结果与果与预预期期结结果比果比较较,若不同,若不同则则表示表示发发现现了了错误错误。因此。因此测试测试用例是由用例是由测试测试数据和数据和预预期期结结果果组组成的。成的。测试测试的目的是的目的是为为了了发现软发现软件中的件中的错误错误,而且,而且发现发现的的错误错误越多越多越好,那么是否可以把越好,那么是否可以把软软件中件中隐隐藏的藏的错误错误全部找出来呢全部找出来呢?或或者者说说能不能把所有可能做的能不能把所有可能做的测试测试毫无毫无遗遗漏地一一做完,也就漏地一一做完,也就是是说经过穷举测试说经过穷举测试,从而找出所有的,从而找出所有的错误错误呢呢?软件工程软件测试软件工程软件测试软件测试用例的设计软件测试用例的设计 假定一个简单程序假定一个简单程序P有输入量有输入量X和和Y及输出量及输出量Z,见图,见图7.4。在字长为在字长为32位的计算机上运行。如果位的计算机上运行。如果X和和Y只取整数,考虑只取整数,考虑把所有的把所有的X,Y值都作为测试数据,这样可能的测试数据的值都作为测试数据,这样可能的测试数据的最大数目是最大数目是 232 * 232 = 264 如果程序如果程序P测试一组数据测试一组数据X,Y需要需要1毫秒,并假定一天毫秒,并假定一天工作工作24小时,一年工作小时,一年工作365天,要完成天,要完成264 组数据测试,需组数据测试,需要要5亿年。亿年。图7.4黑盒测试软件工程软件测试软件工程软件测试软件测试用例的设计软件测试用例的设计 以上分析表明,即使对一个算法明确的简单程序,实行以上分析表明,即使对一个算法明确的简单程序,实行穷举测试在实际上也是不可能的。因此,为了节省时间和资穷举测试在实际上也是不可能的。因此,为了节省时间和资源,提高测试效率,就必须精心设计测试用例,也就是要从源,提高测试效率,就必须精心设计测试用例,也就是要从数量极大的可用测试用例中精心地选择尽量少的测试数据,数量极大的可用测试用例中精心地选择尽量少的测试数据,使采用这些测试数据能够达到最佳的测试效果,或者说它们使采用这些测试数据能够达到最佳的测试效果,或者说它们能够高效率地把隐藏的错误暴露出来。能够高效率地把隐藏的错误暴露出来。 以上事实说明,软件测试有一个致命的缺陷,即测试的以上事实说明,软件测试有一个致命的缺陷,即测试的不完全、不彻底性。由于任何程序只能进行少量的有限测试,不完全、不彻底性。由于任何程序只能进行少量的有限测试,所以在发现错误时,能够说明程序有错误,在未发现错误时,所以在发现错误时,能够说明程序有错误,在未发现错误时,也不能说明程序中没有错误,这点是必须要明确的。也不能说明程序中没有错误,这点是必须要明确的。软件工程软件测试软件工程软件测试软件测试用例的设计软件测试用例的设计7.2.2 黑盒黑盒测试测试法法 黑盒黑盒测试测试是把程序看成是一个不透明的是把程序看成是一个不透明的“黑盒子黑盒子”,测试测试时时完全不考完全不考虑虑程序的内部程序的内部结结构和构和处处理理过过程,只按照程,只按照规规格格说说明明书书所所规规定的功能来定的功能来设计测试设计测试用例,也就是用例,也就是检查检查程序是否符合程序是否符合它的功能要求。黑盒它的功能要求。黑盒测试测试是在程序接口上是在程序接口上进进行的行的测试测试,又称,又称为为功能功能测试测试。常用的黑盒。常用的黑盒测试测试技技术术有等价有等价类类划分、划分、边边界界值值分分析、析、错误错误推断法等。推断法等。软件工程软件测试软件工程软件测试软件测试用例的设计软件测试用例的设计1.等价等价类类划分划分 等价等价类类划分是用黑盒划分是用黑盒设计测试设计测试方案的一种技方案的一种技术术。前面。前面讲讲过过,穷穷尽的黑盒尽的黑盒测试测试需要使用所有有效的和无效的需要使用所有有效的和无效的输输入数据入数据来来测试测试程序,通常程序,通常这这是不是不现实现实的。因此,只能的。因此,只能选选取少量最具取少量最具有代表性的有代表性的输输入数据,目的是要用入数据,目的是要用较较小的代价暴露出小的代价暴露出较较多的多的程序程序错误错误。 如果把所有可能的数据(有效的和无效的)划分成若干如果把所有可能的数据(有效的和无效的)划分成若干个等价个等价类类,则则可以做出下述假定可以做出下述假定:每个每个类类中的一个典型中的一个典型值值在在测试测试中的作用与中的作用与这这一一类类中所有其他中所有其他值值的作用相同。因此,可的作用相同。因此,可以从每个等价以从每个等价类类中只取一中只取一组组数据作数据作为测试为测试数据。数据。这样选这样选取的取的测试测试数据最具有代表性,最有可能数据最具有代表性,最有可能发现发现程序中的程序中的错误错误。软件工程软件测试软件工程软件测试软件测试用例的设计软件测试用例的设计 使用等价类划分方法设计测试方案首先需要划分输入数使用等价类划分方法设计测试方案首先需要划分输入数据的等价类,为此需要研究程序的功能说明,从而确定输入据的等价类,为此需要研究程序的功能说明,从而确定输入数据的有效等价类和无效等价类。在确定输入数据的等价类数据的有效等价类和无效等价类。在确定输入数据的等价类时常常还需要分析输出数据的等价类,以便根据输出数据的时常常还需要分析输出数据的等价类,以便根据输出数据的等价类导出对应的输入数据等价类。等价类导出对应的输入数据等价类。软件工程软件测试软件工程软件测试软件测试用例的设计软件测试用例的设计 为了正确划分等价类,一是要注意积累经验,二是要正为了正确划分等价类,一是要注意积累经验,二是要正确分析被测程序的功能。此外,在划分无效的等价类时还必确分析被测程序的功能。此外,在划分无效的等价类时还必须考虑编译程序的检错功能,一般来说,不需要设计测试数须考虑编译程序的检错功能,一般来说,不需要设计测试数据用来暴露编译程序肯定能发现的错误。最后说明一点,上据用来暴露编译程序肯定能发现的错误。最后说明一点,上面列出的启发式规则虽然都是针对输入数据说的,但是其中面列出的启发式规则虽然都是针对输入数据说的,但是其中绝大部分也同样适用于输出数据。绝大部分也同样适用于输出数据。软件工程软件测试软件工程软件测试软件测试用例的设计软件测试用例的设计 划分出等价类以后,根据等价类设计测试方案时主要使划分出等价类以后,根据等价类设计测试方案时主要使用下面两个步骤用下面两个步骤: (1)设计一个新的测试方案,以尽可能多地覆盖尚未被)设计一个新的测试方案,以尽可能多地覆盖尚未被覆盖的有效等价类,重复这一步骤直到所有有效等价类都被覆盖的有效等价类,重复这一步骤直到所有有效等价类都被覆盖为止。覆盖为止。 (2)设计一个新的测试方案,使它覆盖一个而且只覆盖)设计一个新的测试方案,使它覆盖一个而且只覆盖一个尚未被覆盖的无效等价类,重复这一步骤直到所有无效一个尚未被覆盖的无效等价类,重复这一步骤直到所有无效等价类都被覆盖为止。等价类都被覆盖为止。 注意注意: 通常程序发现一类错误后就不再检查是否还有其通常程序发现一类错误后就不再检查是否还有其他错误,因此,应该使每个测试方案只覆盖一个无效的等价他错误,因此,应该使每个测试方案只覆盖一个无效的等价类。类。软件工程软件测试软件工程软件测试软件测试用例的设计软件测试用例的设计2.边边界界值值分析分析 经验经验表明,表明,处处理理边边界情况界情况时时程序最容易程序最容易发发生生错误错误。例。例如,如,许许多程序多程序错误错误出出现现在下在下标标、数据、数据结结构和循构和循环环等的等的边边界附界附近。因此,近。因此,设计设计使程序运行在使程序运行在边边界情况附近的界情况附近的测试测试方案,暴方案,暴露出程序露出程序错误错误的可能性更大一些。的可能性更大一些。 使用使用边边界界值值分析方法分析方法设计测试设计测试方案首先方案首先应该应该确定确定边边界情界情况,况,这这需要需要经验经验和和创创造性,通常造性,通常输输入等价入等价类类和和输输出等价出等价类类的的边边界,就是界,就是应该应该着重着重测试测试的程序的程序边边界情况。按照界情况。按照边边界界值值分析分析方法,方法,应该选应该选取取刚刚好等于、稍小于和稍大于等价好等于、稍小于和稍大于等价类边类边界界值值的的数据作数据作为测试为测试数据,而不是数据,而不是选选取每个等价取每个等价类类内的典型内的典型值值和任和任意意值值作作为测试为测试数据。数据。设计测试设计测试方案方案时总时总是是结结合使用等价合使用等价类类划划分和分和边边界界值值分析两种技分析两种技术术。软件工程软件测试软件工程软件测试软件测试用例的设计软件测试用例的设计3.错误错误推断法推断法 使用使用边边界界值值分析和等价分析和等价类类划分技划分技术术,可以帮助我,可以帮助我们设计们设计出具有代表性的,因而也就容易暴露程序出具有代表性的,因而也就容易暴露程序错误错误的的测试测试方案。方案。但是,不同但是,不同类类型不同特点的程序通常又有一些特殊的容易出型不同特点的程序通常又有一些特殊的容易出错错的情况。此外,有的情况。此外,有时时分分别别使用每使用每组测试组测试数据数据时时程序都能正程序都能正常工作,但常工作,但这这些些输输入数据的入数据的组组合却可能合却可能检测检测出程序的出程序的错误错误。一般一般说说来,即使是一个比来,即使是一个比较较小的程序,可能的小的程序,可能的输输入入组组合数也合数也十分巨大,因此必十分巨大,因此必须须依靠依靠测试测试人人员员的的经验经验和直和直觉觉,从各种可,从各种可能的能的测试测试方案中方案中选选出一些最可能引起程序出出一些最可能引起程序出错错的方案。推的方案。推测测程序中可能存在程序中可能存在错误错误的的类类型,是挑型,是挑选测试选测试方案所依据的一个方案所依据的一个重要因素。重要因素。软件工程软件测试软件工程软件测试软件测试用例的设计软件测试用例的设计 错误推断法在很大程度上靠直觉和经验进行,它的基本错误推断法在很大程度上靠直觉和经验进行,它的基本想法是列举出程序中可能有的错误和容易发生错误的特殊情想法是列举出程序中可能有的错误和容易发生错误的特殊情况,并且根据它们选择测试方案。对于程序中容易出错的情况,并且根据它们选择测试方案。对于程序中容易出错的情况也有一些经验总结出来,例如,输入数据为零或输出数据况也有一些经验总结出来,例如,输入数据为零或输出数据为零往往容易发生错误为零往往容易发生错误;如果输入或输出的数目允许变化如果输入或输出的数目允许变化(例如,被检索的或生成的表的项数),则输入或输出的数(例如,被检索的或生成的表的项数),则输入或输出的数目为目为0和和1的情况(例如,表为空或只有一项)是容易出错的情况(例如,表为空或只有一项)是容易出错的情况。此外还应该仔细分析程序规格说明书,注意找出其的情况。此外还应该仔细分析程序规格说明书,注意找出其中遗漏或省略的部分,以便设计相应的测试方案,检测程序中遗漏或省略的部分,以便设计相应的测试方案,检测程序员对这部分的处理是否正确。员对这部分的处理是否正确。软件工程软件测试软件工程软件测试软件测试用例的设计软件测试用例的设计 等价类划分方法和边界值分析方法都只是孤立地考虑各等价类划分方法和边界值分析方法都只是孤立地考虑各个输入数据的测试功效,而没有考虑多个输入数据的组合效个输入数据的测试功效,而没有考虑多个输入数据的组合效应,这样可能会遗漏输入数据易于出错的组合情况。利用判应,这样可能会遗漏输入数据易于出错的组合情况。利用判定表或判定树是选择输入组合的一条有效途径,列出输入数定表或判定树是选择输入组合的一条有效途径,列出输入数据各种组合与程序应做的动作(即相应的输出结果)之间的据各种组合与程序应做的动作(即相应的输出结果)之间的对应关系,然后为判定表的每一列至少设计一个测试用例。对应关系,然后为判定表的每一列至少设计一个测试用例。软件工程软件测试软件工程软件测试软件测试用例的设计软件测试用例的设计 选择输入组合的另一条有效途径是把计算机测试和人工选择输入组合的另一条有效途径是把计算机测试和人工检查代码结合起来。例如,通过代码检查,发现程序中两个检查代码结合起来。例如,通过代码检查,发现程序中两个模块使用并修改某些共享的变量,如果一个模块对这些变量模块使用并修改某些共享的变量,如果一个模块对这些变量的修改不正确,则会引起另一个模块出错,这是程序发生错的修改不正确,则会引起另一个模块出错,这是程序发生错误的又一个可能原因。应该设计测试方案,在程序的一次运误的又一个可能原因。应该设计测试方案,在程序的一次运行中同时检测这两个模块,特别要着重检测一个模块修改了行中同时检测这两个模块,特别要着重检测一个模块修改了共享变量后,另一个模块能否像预期的那样正常使用这些变共享变量后,另一个模块能否像预期的那样正常使用这些变量。反之,如果两个模块相互独立,则没有必要测试它们的量。反之,如果两个模块相互独立,则没有必要测试它们的输入组合情况。输入组合情况。软件工程软件测试软件工程软件测试软件测试用例的设计软件测试用例的设计7.2.3 白盒白盒测试测试法法 白盒白盒测试测试是把程序看成一个透明的盒子,是把程序看成一个透明的盒子,测试测试人人员员完全完全了解程序的内部了解程序的内部结结构和构和处处理理过过程,程,测试时测试时是根据程序的内部是根据程序的内部逻辑逻辑来来设计测试设计测试用例的,即用例的,即检验检验程序中的每条路径是否都能程序中的每条路径是否都能按按预预定的要求正确工作。白盒定的要求正确工作。白盒测试测试是在程序是在程序结结构上构上进进行的行的测测试试,所以白盒,所以白盒测试测试也称也称为结为结构构测试测试。白盒。白盒测试测试常用的技常用的技术术是是逻辑逻辑覆盖,即考察用覆盖,即考察用测试测试数据运行被数据运行被测测程序程序时对时对程序程序逻辑逻辑的的覆盖程度。主要的覆盖覆盖程度。主要的覆盖标标准有六种准有六种:语语句覆盖、判定覆盖、句覆盖、判定覆盖、条件覆盖、判定条件覆盖、判定.条件覆盖、条件条件覆盖、条件组组合覆盖和路径覆盖。合覆盖和路径覆盖。为为了提高了提高测试测试效率,我效率,我们们希望希望选择选择最少的最少的测试测试用例来用例来满满足指定足指定的覆盖的覆盖标标准。准。软件工程软件测试软件工程软件测试软件测试用例的设计软件测试用例的设计1.语语句覆盖句覆盖 为为了暴露程序中的了暴露程序中的错误错误,至少每个,至少每个语语句句应该执应该执行一次。行一次。语语句覆盖的含句覆盖的含义义是是选择选择足足够够多的多的测试测试数据,使被数据,使被测测程序中每程序中每个个语语句至少句至少执执行一次。行一次。2.判定覆盖判定覆盖 判定覆盖又叫分支覆盖,它的含判定覆盖又叫分支覆盖,它的含义义是不是不仅仅每个每个语语句必句必须须至少至少执执行一次,而且每个判定各种可能的行一次,而且每个判定各种可能的结结果都果都应该应该至少至少执执行一次,也就是每个判定的各个分支都至少行一次,也就是每个判定的各个分支都至少执执行一次。行一次。软件工程软件测试软件工程软件测试软件测试用例的设计软件测试用例的设计3.条件覆盖条件覆盖 条件覆盖的含条件覆盖的含义义是不是不仅仅每个每个语语句至少句至少执执行一次,而且判行一次,而且判定表达式中的每个条件都取到各种可能的定表达式中的每个条件都取到各种可能的结结果。果。4.判定判定/条件覆盖条件覆盖 既然判定覆盖不一定包含条件覆盖,条件覆盖也不一定既然判定覆盖不一定包含条件覆盖,条件覆盖也不一定包含判定覆盖,自然会提出一种能同包含判定覆盖,自然会提出一种能同时满时满足足这这两种覆盖两种覆盖标标准准的的逻辑逻辑覆盖,覆盖,这这就是判定就是判定.条件覆盖。它的含条件覆盖。它的含义义是是选选取足取足够够多的多的测试测试数据,使得判定表达式中的每个条件都取到各种可数据,使得判定表达式中的每个条件都取到各种可能的能的值值,而且每个判定表达式也都取到各种可能的,而且每个判定表达式也都取到各种可能的结结果。果。软件工程软件测试软件工程软件测试软件测试用例的设计软件测试用例的设计 5.条件条件组合覆盖合覆盖 条件条件组合覆盖是更合覆盖是更强的的逻辑覆盖覆盖标准,它要求准,它要求选取足取足够多的多的测试数据,使得每个判定表达式中条件的各种可能数据,使得每个判定表达式中条件的各种可能组合合都至少出都至少出现一次。一次。 显然,满足条件组合覆盖标准的测试数据,也一定满足显然,满足条件组合覆盖标准的测试数据,也一定满足判定覆盖、条件覆盖和判定判定覆盖、条件覆盖和判定.条件覆盖标准。因此,条件组条件覆盖标准。因此,条件组合覆盖是前述几种覆盖标准中最强的。但是,满足条件组合合覆盖是前述几种覆盖标准中最强的。但是,满足条件组合覆盖标准的测试数据并不一定能使程序中的每条路径都执行覆盖标准的测试数据并不一定能使程序中的每条路径都执行到。到。软件工程软件测试软件工程软件测试软件测试用例的设计软件测试用例的设计 6.路径覆盖路径覆盖 路径覆盖的含路径覆盖的含义是,是,选取足取足够多的多的测试数据,使程序的数据,使程序的每条可能路径都至少每条可能路径都至少执行一次(如果程序行一次(如果程序图中有中有环路,路,则要要求每个求每个环路至少路至少经过一次)。一次)。 路径覆盖是相当强的逻辑覆盖标准,它保证程序中每条路径覆盖是相当强的逻辑覆盖标准,它保证程序中每条可能的路径都至少执行一次,因此这样的测试数据更有代表可能的路径都至少执行一次,因此这样的测试数据更有代表性,暴露错误的能力也更强。但是,路径覆盖只是考虑到每性,暴露错误的能力也更强。但是,路径覆盖只是考虑到每个判定表达式的取值,并没有检验表达式中条件的各种可能个判定表达式的取值,并没有检验表达式中条件的各种可能组合情况。如果把路径覆盖和条件组合覆盖结合起来,可以组合情况。如果把路径覆盖和条件组合覆盖结合起来,可以设计出检错能力更强的测试数据。设计出检错能力更强的测试数据。软件工程软件测试软件工程软件测试软件测试用例的设计软件测试用例的设计7.2.4 测试实测试实例分析例分析 以上以上简单简单介介绍绍了了设计测试设计测试方案的几种基本方法,使用每方案的几种基本方法,使用每种方法都能种方法都能设计设计出一出一组组有用的有用的测试测试方案,但是没有一种方法方案,但是没有一种方法能能设计设计出全部出全部测试测试方案。此外,不同方法各有所方案。此外,不同方法各有所长长,用一种,用一种方法方法设计设计出的出的测试测试方案可能最容易方案可能最容易发现发现某些某些类类型的型的错误错误,而,而对对另外一些另外一些类类型的型的错误错误可能不易可能不易发现发现。 因此,因此,对软对软件系件系统进统进行行实际测试时实际测试时,应该联应该联合使用各种合使用各种设计测试设计测试方案的方法,形成一种方案的方法,形成一种综综合策略。通常的做法是,合策略。通常的做法是,用黑盒法用黑盒法设计设计基本的基本的测试测试方案,再用白盒法方案,再用白盒法补补充一些必要的充一些必要的测试测试方案。方案。软件工程软件测试软件工程软件测试软件测试用例的设计软件测试用例的设计具体地说,可以使用下述策略结合各种方法具体地说,可以使用下述策略结合各种方法: (1)在任何情况下都应该使用边界值分析的方法。经验)在任何情况下都应该使用边界值分析的方法。经验表明,用这种方法设计出的测试方案暴露程序错误的能力最表明,用这种方法设计出的测试方案暴露程序错误的能力最强。注意,应该既包括输入数据的边界情况又包括输出数据强。注意,应该既包括输入数据的边界情况又包括输出数据的边界情况。的边界情况。 (2)必要时用等价类划分法补充测试方案。)必要时用等价类划分法补充测试方案。 (3)必要时再用错误推断法补充测试方案。)必要时再用错误推断法补充测试方案。 (4)对照程序逻辑,检查已经设计出的测试方案。可以)对照程序逻辑,检查已经设计出的测试方案。可以根据对程序可靠性的要求采用不同的逻辑覆盖标准,如果现根据对程序可靠性的要求采用不同的逻辑覆盖标准,如果现有测试方案的逻辑覆盖程度没有达到所要求的覆盖标准,则有测试方案的逻辑覆盖程度没有达到所要求的覆盖标准,则应再补充一些测试方案。应再补充一些测试方案。软件工程软件测试软件工程软件测试软件测试用例的设计软件测试用例的设计 应该强调指出,即使使用上述综合策略设计测试方案,应该强调指出,即使使用上述综合策略设计测试方案,仍然不能保证测试能发现一切程序错误,但是,这个策略确仍然不能保证测试能发现一切程序错误,但是,这个策略确实是在测试成本和测试效果之间的一个合理的折中。通过前实是在测试成本和测试效果之间的一个合理的折中。通过前面的叙述可以看出,软件测试确实是一件十分艰巨繁重的工面的叙述可以看出,软件测试确实是一件十分艰巨繁重的工作。作。软件工程软件测试软件工程软件测试7.3 软件测试的实施软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施7.3.1 单单元元测试测试 单单元元测试测试也称模也称模块测试块测试,是,是对软对软件最小件最小单单元的元的测试测试,也,也是是对对程序模程序模块进块进行正确性行正确性检验检验的的测试测试,其目的在于,其目的在于发现发现各模各模块块内部可能存在的各种差内部可能存在的各种差错错。通常。通常单单元元测试测试可以放在可以放在编码阶编码阶段,程序段,程序员员在在编编写好一个模写好一个模块块后,后,应该对应该对自己自己编编写的模写的模块进块进行行测试测试,检查检查它是否它是否实现实现了了详细设计说详细设计说明明书规书规定的模定的模块块功能功能和算法。和算法。单单元元测试测试需要从程序的内部需要从程序的内部结结构出构出发设计测试发设计测试用例,用例,通常采用白盒通常采用白盒测试测试方法。多个模方法。多个模块块可以平行地可以平行地进进行行单单元元测试测试。软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施 1.单单元元测试测试的内容的内容 (1)模)模块块接口接口测试测试:对对通通过过被被测测模模块块的数据流的数据流进进行行测试测试。为为此,此,对对模模块块接口,包括参数表、接口,包括参数表、调调用子模用子模块块的参数、全程的参数、全程数据、文件数据、文件输输入入.输输出操作等都必出操作等都必须进须进行行检查检查。 (2)局部数据)局部数据结结构构测试测试:设计测试设计测试用例来用例来检查检查数据数据类类型型说说明、初始化、缺省明、初始化、缺省值值等方面的等方面的问题问题,还还要要查查清全局数据清全局数据对对模模块块的影响。的影响。 (3)路径)路径测试测试:选择选择适当的适当的测试测试用例,用例,对对模模块块中重要的中重要的执执行路径行路径进进行行测试测试。对对基本基本执执行路径和循行路径和循环环路径路径进进行行测试测试可以可以发现发现大量的路径大量的路径错误错误。软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施(4)错误处理测试)错误处理测试:检查模块的错误处理功能是否包含有错检查模块的错误处理功能是否包含有错误或缺陷。例如误或缺陷。例如:是否拒绝不合理的输入,出错的描述是否是否拒绝不合理的输入,出错的描述是否难以理解,是否对错误定位有误,是否对出错原因报告有误,难以理解,是否对错误定位有误,是否对出错原因报告有误,是否对错误条件的处理有误,在对错误处理之前错误条件是是否对错误条件的处理有误,在对错误处理之前错误条件是否已经引起系统的干预,等等。否已经引起系统的干预,等等。(5)边界测试)边界测试:要特别注意数据流、控制流中刚好等于、大要特别注意数据流、控制流中刚好等于、大于或小于确定的比较值时出错的可能性。对这些地方要仔细于或小于确定的比较值时出错的可能性。对这些地方要仔细地选择测试用例,认真加以测试。地选择测试用例,认真加以测试。 此外,如果对模块运行时间有要求的话,还要专门进行此外,如果对模块运行时间有要求的话,还要专门进行关键路径测试,以确定最坏情况下和平均意义下影响模块运关键路径测试,以确定最坏情况下和平均意义下影响模块运行时间的因素。这类信息对于性能评价是十分有用的。行时间的因素。这类信息对于性能评价是十分有用的。软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施2.单单元元测试测试的步的步骤骤 通常通常单单元元测试测试在在编码阶编码阶段段进进行。在源程序代行。在源程序代码编码编制完制完成,成,经过评审经过评审和和验证验证,确,确认认没有没有语语法法错误错误之后,就开始之后,就开始进进行行单单元元测试测试的的测试测试用例用例设计设计。利用。利用设计设计文档,可以文档,可以设计设计出出验证验证程序功能,找出程序程序功能,找出程序错误错误的多个的多个测试测试用例。用例。对对于每一于每一组测试组测试用例,用例,应应有有预预期的正确期的正确结结果。果。 模模块块并不是一个并不是一个绝对绝对独立的程序,在考独立的程序,在考虑测试虑测试模模块时块时,同同时时要考要考虑虑它和外界的它和外界的联联系,用一些系,用一些辅辅助模助模块块去模去模拟拟与被与被测测模模块块相相联联系的其他模系的其他模块块。这这些些辅辅助模助模块块有有驱动驱动模模块块和和桩桩模模块块。软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施 (1)驱动模块)驱动模块:相当于被测模块的主程序。用它接收测试相当于被测模块的主程序。用它接收测试用例的测试数据,把这些数据传送给被测模块,最后输出测用例的测试数据,把这些数据传送给被测模块,最后输出测试结果。试结果。 (2)桩模块(也称连接模块)桩模块(也称连接模块):用以代替被测模块所调用用以代替被测模块所调用的子模块。桩模块可以做少量的数据操作,不需要把子模块的子模块。桩模块可以做少量的数据操作,不需要把子模块的所有功能都带进来,但不允许什么事情也不做。的所有功能都带进来,但不允许什么事情也不做。软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施 被测模块、相关的驱动模块和桩模块共同构成了一个被测模块、相关的驱动模块和桩模块共同构成了一个“测试环境测试环境”,如图,如图7.6所示。所示。 图7.6 单元测试的测试环境软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施 为了进行单元测试必须编写测试软件,但是通常并不把为了进行单元测试必须编写测试软件,但是通常并不把它们作为软件产品的一部分交给用户。许多模块不能用简单它们作为软件产品的一部分交给用户。许多模块不能用简单的测试软件充分测试,为了减少开销可以使用下面将要介绍的测试软件充分测试,为了减少开销可以使用下面将要介绍的渐增式测试方法,在组装测试的过程中同时完成对模块的的渐增式测试方法,在组装测试的过程中同时完成对模块的详尽测试。详尽测试。 模块的内聚程度直接影响单元测试的测试过程,显然,模块的内聚程度直接影响单元测试的测试过程,显然,高内聚的模块设计将会明显减少设计测试用例的数目,也更高内聚的模块设计将会明显减少设计测试用例的数目,也更容易预测和发现模块中的错误。容易预测和发现模块中的错误。软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施7.3.2 组组装装测试测试 组组装装测试测试也称集成也称集成测试测试,是在,是在单单元元测试测试的基的基础础上,将上,将所有模所有模块块按照按照软软件件设计设计要求要求组组装成装成为为系系统统并并进进行行测试测试的的过过程。程。组组装装测试测试主要通主要通过检查过检查模模块间块间的的结结构和通信构和通信发现软发现软件件设计阶设计阶段段产产生的生的错误错误,通常采用黑盒,通常采用黑盒测试测试方法。在方法。在组组装装测试过测试过程中,程中,需要考需要考虑虑如下几个如下几个问题问题:在把各个模在把各个模块连块连接起来的接起来的时时候,穿候,穿越模越模块块接口的数据是否会接口的数据是否会丢丢失。一个模失。一个模块块的功能是否会的功能是否会对对另另一个模一个模块块的功能的功能产产生不利的影响。各个子功能生不利的影响。各个子功能组组合起来,能合起来,能否达到否达到预预期要求的父功能。全局数据期要求的父功能。全局数据结结构是否有构是否有问题问题。软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施 单个模块的误差累积起来,是否会放大,以至于达到不单个模块的误差累积起来,是否会放大,以至于达到不能接受的程度。单个模块的错误是否会导致数据库错误。能接受的程度。单个模块的错误是否会导致数据库错误。 选择什么方式把模块组装起来形成一个可运行的系统,选择什么方式把模块组装起来形成一个可运行的系统,直接影响到测试用例的形式、测试工具的类型、模块编号的直接影响到测试用例的形式、测试工具的类型、模块编号的次序和测试的顺序以及生成测试用例的费用和调试的费用。次序和测试的顺序以及生成测试用例的费用和调试的费用。通常把模块组装成为系统的方式有两种。通常把模块组装成为系统的方式有两种。软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施 1.非非渐增式增式组装方式装方式 这种种组装方式也叫做整体拼装。使用装方式也叫做整体拼装。使用这种方式,首先种方式,首先对每个模每个模块分分别进行模行模块测试,然后再把所有模,然后再把所有模块组装在一起装在一起进行行测试,最,最终得到要求的得到要求的软件系件系统。由于程序中不可避免。由于程序中不可避免地存在涉及模地存在涉及模块间接口、全局数据接口、全局数据结构等方面的构等方面的问题,所以,所以一次一次试运行成功的可能性并不是很大。运行成功的可能性并不是很大。软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施2.渐渐增式增式组组装方式装方式 渐渐增式增式组组装方式也称增殖式方式。装方式也称增殖式方式。这这种方式是将种方式是将单单元元测测试试和和组组装装测试测试合并在一起使用,根据模合并在一起使用,根据模块结块结构构图图,按某种次,按某种次序序选选一个尚未一个尚未测试测试的模的模块块,把它同已,把它同已经测试经测试好的模好的模块组块组合在合在一起一起进进行行测试测试,每次增加一个模,每次增加一个模块块,直至所有模,直至所有模块块全部全部组组装装在系在系统统中。在中。在组组装的装的过过程中程中边连边连接接边测试边测试,以便,以便发现连发现连接接过过程中程中产产生的生的问题问题,通,通过这过这种方法可以逐步种方法可以逐步组组装成装成为满为满足要求足要求的的软软件系件系统统。渐渐增式增式组组装方式有两种装方式有两种:自自顶顶向下和自底向上向下和自底向上的增殖的增殖组组装方式。装方式。软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施 7.3.3 确确认测试认测试 组组装装测试测试已已经经按照按照设计设计把所有模把所有模块组块组装成一个完整的装成一个完整的软软件系件系统统,接口,接口错误错误也已也已经经基本排除了,接着就基本排除了,接着就应该进应该进一步一步验证软验证软件的有效性,即件的有效性,即验证软验证软件的功能、性能及其他特性是件的功能、性能及其他特性是否与用否与用户户的要求一致。的要求一致。这这就是确就是确认测试认测试。在。在软软件需求件需求规规格格说说明明书书中描述了全部用中描述了全部用户户可可见见的的软软件属性,其中有一件属性,其中有一节节叫做有叫做有效性准效性准则则,它包含的信息就是,它包含的信息就是软软件确件确认测试认测试的基的基础础。通。通过过有有效性效性测试测试以及以及软软件配置复件配置复查查和安装和安装测试测试,然后通,然后通过专过专家家鉴鉴定,定,才能成才能成为为可交付使用的可交付使用的软软件。件。软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施1.有效性有效性测试测试 有效性有效性测试测试是在模是在模拟拟的的环环境(可能就是开境(可能就是开发发的的环环境)境)下,运用黑盒下,运用黑盒测试测试的方法,的方法,验证验证被被测软测软件是否件是否满满足需求足需求规规格格说说明明书书所列出的需求。所列出的需求。为为此,需要首先制定此,需要首先制定测试计测试计划,划,规规定定所做所做测试测试的种的种类类。还还需要制定一需要制定一组测试组测试步步骤骤,描述具体的,描述具体的测测试试用例。通用例。通过实过实施施预预定的定的测试计测试计划和划和测试测试步步骤骤,确定,确定软软件的件的特性是否与需求相符,确保所有的特性是否与需求相符,确保所有的软软件功能需求都能得到件功能需求都能得到满满足,所有的足,所有的软软件性能需求都能达到,所有的文档都是正确且件性能需求都能达到,所有的文档都是正确且便于使用的。同便于使用的。同时时,对软对软件其他需求,例如可移植性、兼容件其他需求,例如可移植性、兼容性、出性、出错错自自动动恢复、可恢复、可维护维护性等,也都要性等,也都要进进行行测试测试,确,确认认是是否否满满足要求。足要求。软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施2.软软件配置复件配置复查查 软软件配置复件配置复查查的目的是保的目的是保证软证软件配置的所有成分都件配置的所有成分都齐齐全,全,各方面的各方面的质质量都符合要求,具有量都符合要求,具有维护阶维护阶段所必需的段所必需的细节细节,而,而且已且已经编经编排好分排好分类类的目的目录录。 除了按合同的内容和要求,由人工除了按合同的内容和要求,由人工审查软审查软件配置之外,件配置之外,在确在确认测试认测试的的过过程中,程中,应应当当严严格遵守用格遵守用户户手册和操作手册中手册和操作手册中规规定的使用步定的使用步骤骤,不能以,不能以“做一日和尚撞一天做一日和尚撞一天钟钟”的的态态度来度来检检查这查这些文档些文档资资料的完整性和正确性,必料的完整性和正确性,必须须仔仔细记录发现细记录发现的的遗遗漏和漏和错误错误,并且适当地加以,并且适当地加以补补充和改正。充和改正。软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施3. 测试测试和和测试测试 在在软软件交付使用之后,用件交付使用之后,用户户将如何将如何实际实际使用程序,使用程序,对对于于开开发发者来者来说说是无法是无法预测预测的。因的。因为为用用户户在使用在使用过过程中常常会程中常常会对对使用方法使用方法产产生生误误解,使用异常的数据解,使用异常的数据组组合以及合以及产产生生对对某些用某些用户户来来说说似乎是清晰的但似乎是清晰的但对对另一些用另一些用户户来来说说却是却是难难以理解的以理解的输输出等。如果出等。如果软软件是件是为为多个用多个用户户开开发发的,那么的,那么让让每个用每个用户户逐个逐个执执行正式的行正式的验验收收测试测试是不切是不切实际实际的。因此很多的。因此很多软软件件产产品生品生产产者采用一种称之者采用一种称之为为测试测试和和测试测试的的测试测试方法,以方法,以发现发现可能可能只有最只有最终终用用户户才能才能发现发现的的错误错误。软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施 测试测试是由一个用是由一个用户户在开在开发环发环境下境下进进行的行的测试测试,也可以,也可以是公司内部的用是公司内部的用户户在模在模拟实际拟实际操作操作环环境下境下进进行的行的测试测试。测测试试是在受控制的是在受控制的环环境下境下进进行的。行的。测试测试的目的是的目的是评评价价软软件件产产品的功能,如可使用性、可靠性和支持性等性能,尤其注重品的功能,如可使用性、可靠性和支持性等性能,尤其注重产产品的界面和特色。品的界面和特色。测试测试人人员员是除了是除了产产品开品开发发人人员员之外首之外首先先见见到到产产品的人,他品的人,他们们提出的功能要求和修改意提出的功能要求和修改意见见是特是特别别有有价价值值的。的。测试测试可以从可以从软软件件产产品品编码结编码结束之束之时时,或是模,或是模块块(子系(子系统统)测试测试完成之后开始,也可以在完成之后开始,也可以在测试过测试过程中确程中确认产认产品达到一定的品达到一定的稳稳定和可靠程度之后再开始。定和可靠程度之后再开始。软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施 测试测试是由是由软软件的多个用件的多个用户户在一个或多个用在一个或多个用户户的的实际实际使使用用环环境下境下进进行的行的测试测试。与。与测试测试不同的是,开不同的是,开发发者通常不在者通常不在测试现场测试现场。因而,。因而,测试测试是在开是在开发发者无法控制的者无法控制的环环境下境下进进行行的的软软件件现场应现场应用。在用。在测试测试中,由用中,由用户记户记下遇到的所有下遇到的所有问题问题,包括真包括真实实的以及主的以及主观认观认定的,定期向开定的,定期向开发发者者报报告,开告,开发发者在者在分析用分析用户户的的报报告之后,修正告之后,修正软软件件错误错误,并最,并最终终将将软软件件产产品品发发布布给给全体用全体用户户使用。使用。测试测试着重于着重于产产品的支持性,包括文档、品的支持性,包括文档、客客户户培培训训和支持和支持产产品生品生产产能力。只有当能力。只有当测试测试达到一定的可达到一定的可靠程度靠程度时时,才能开始,才能开始测试测试。软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施 由于它处在整体测试的最后阶段,所以不能指望这时发由于它处在整体测试的最后阶段,所以不能指望这时发现主要问题。同时产品的所有手册文本也应该在此阶段完全现主要问题。同时产品的所有手册文本也应该在此阶段完全定稿。由于定稿。由于测试的主要目标是测试可支持性,所以测试的主要目标是测试可支持性,所以测试测试应尽可能由主持产品发行的人员来管理。确认测试把软件系应尽可能由主持产品发行的人员来管理。确认测试把软件系统作为单一的实体进行测试,测试内容与系统测试基本类似。统作为单一的实体进行测试,测试内容与系统测试基本类似。但是,它是在用户的积极参与下进行的,而且可能主要使用但是,它是在用户的积极参与下进行的,而且可能主要使用实际数据(系统将来要处理的数据)进行测试。确认测试的实际数据(系统将来要处理的数据)进行测试。确认测试的目的是验证系统确实能够满足用户的需要,在这个测试步骤目的是验证系统确实能够满足用户的需要,在这个测试步骤中发现的错误往往是系统需求说明书中的错误。中发现的错误往往是系统需求说明书中的错误。软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施4.验验收收测试测试 在通在通过过了系了系统统的有效性的有效性测试测试及及软软件配置复件配置复查查之后,接下之后,接下来来进进行系行系统统的的验验收收测试测试。验验收收测试测试是以用是以用户为户为主的主的测试测试,同,同时软时软件开件开发发人人员员和和QA(Quality Assurance,质质量保量保证证)人人员员也也应应参加。由用参加。由用户户参与参与设计测试设计测试用例,使用用用例,使用用户户界面界面输输入入测试测试数据,并分析数据,并分析测试测试的的输输出出结结果,一般使用生果,一般使用生产产中的中的实实际际数据数据进进行行测试测试。在。在测试过测试过程中,除了考程中,除了考虑软虑软件的功能和性件的功能和性能外,能外,还应对软还应对软件的可移植性、兼容性、可件的可移植性、兼容性、可维护维护性、性、错误错误的的恢复功能等恢复功能等进进行确行确认认。软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施5.确确认测试结认测试结果果 在全部确在全部确认测试认测试的的测试测试用例运行完后,所有的用例运行完后,所有的测试结测试结果果可以分可以分为为两两类类: (1)测试结测试结果与果与预预期的期的结结果相符,果相符,这说这说明明软软件的件的这这部分部分功能或性能特征与需求功能或性能特征与需求说说明明书书相符合,从而相符合,从而这这部分程序可以部分程序可以接受。接受。 (2)测试结测试结果与果与预预期的期的结结果不符,果不符,这说这说明明软软件的件的这这部分部分功能或性能特征与需求功能或性能特征与需求说说明明书书不一致,因此需要开列一不一致,因此需要开列一张软张软件各件各项项缺陷表或缺陷表或软软件件问题报问题报告,通告,通过过与用与用户户的交流,解决所的交流,解决所发现发现的缺陷和的缺陷和错误错误。软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施7.3.4 系系统测试统测试 所所谓谓系系统测试统测试,是将通,是将通过过确确认测试认测试的的软软件作件作为为基于整个基于整个计计算机系算机系统统的一个元素,与的一个元素,与计计算机硬件、外算机硬件、外设设、某些支持、某些支持软软件、数据和人件、数据和人员员等其他系等其他系统统元素元素结结合在一起,在合在一起,在实际实际运行运行环环境下,境下,对计对计算机系算机系统进统进行一系列的行一系列的组组装装测试测试和确和确认测试认测试。 系系统测试统测试的目的在于通的目的在于通过过与系与系统统的需求的需求说说明做比明做比较较,发发现软现软件与系件与系统统定定义义不符合或相矛盾的地方。系不符合或相矛盾的地方。系统测试统测试的的测试测试用例用例应应根据需求根据需求说说明明书书来来设计设计,并在,并在实际实际运行运行环环境中运行。境中运行。软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施7.3.5 软软件件纠错纠错 测试测试是找出是找出软软件外部的件外部的错误错误,纠错纠错是在是在测试测试出出错错的基的基础础上分析上分析错误错误的性的性质质与原因,找出出与原因,找出出错错的位置,即找到内部的位置,即找到内部错误错误,再加以,再加以纠纠正,直到正,直到测试测试没有没有错误为错误为止。概括地止。概括地说说,这这种根据种根据测试发现错误测试发现错误的外因,通的外因,通过过分析找到分析找到错误错误的内部原因的内部原因并加以改正的人工活并加以改正的人工活动动称称为纠错为纠错。软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施 1.纠错纠错的步的步骤骤 纠错纠错作作为测试为测试的后的后继继工作,工作,应该应该按照一定的步按照一定的步骤骤来来进进行。行。(1)从)从错误错误的外部表的外部表现现形式入手,确定程序出形式入手,确定程序出错错位置。位置。(2)研究有关部分的程序,找出)研究有关部分的程序,找出错误错误的内在原因。的内在原因。(3)修改)修改设计设计和代和代码码,以排除,以排除这这个个错误错误。(4)重复使用暴露)重复使用暴露这这个个错误错误的原始的原始测试测试数据数据测试测试或某些有或某些有关关测试测试,以确,以确认该错误认该错误是否被排除以及是否引是否被排除以及是否引进进了新的了新的错误错误。(5)如果所做的修正无效,)如果所做的修正无效,则则撤撤销这销这次改次改动动,重复上述,重复上述过过程,直到找到一个有效的解决方法程,直到找到一个有效的解决方法为为止。止。软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施2.纠错纠错方法方法 (1)强强行行纠错纠错法法 强强行行纠错纠错法是通法是通过过系系统统的的调试调试跟踪工具,将信息打印或跟踪工具,将信息打印或显显示出来,逐一地示出来,逐一地查查找找错误错误的原因,并的原因,并进进行行纠错纠错的的过过程。程。这这是一种很普遍的使用方法,但效率比是一种很普遍的使用方法,但效率比较较低,而且缺乏系低,而且缺乏系统统的的分析分析过过程。程。软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施(2)回溯法纠错)回溯法纠错 采用回溯法纠错时,首先分析错误征兆,确定最先发现采用回溯法纠错时,首先分析错误征兆,确定最先发现“症状症状”的位置。然后沿程序的控制流程,回溯跟踪源程序的位置。然后沿程序的控制流程,回溯跟踪源程序代码,直到找到错误根源或确定错误产生的范围为止。例如,代码,直到找到错误根源或确定错误产生的范围为止。例如,程序中发现错误的地方是某个打印语句。通过输出值可推断程序中发现错误的地方是某个打印语句。通过输出值可推断出程序在这点上的变量值,再从这一点出发,回溯程序的执出程序在这点上的变量值,再从这一点出发,回溯程序的执行过程,反复考虑行过程,反复考虑“如果程序在这点上变量的值是这样,那如果程序在这点上变量的值是这样,那么程序在上一点上变量的值应该是这样么程序在上一点上变量的值应该是这样”,直到找到错,直到找到错误的位置,即在其状态是预期的点与第一个状态不是预期的误的位置,即在其状态是预期的点与第一个状态不是预期的点之间的程序位置。点之间的程序位置。 实践证明,回溯法对小程序是很有效的纠错方法。通过实践证明,回溯法对小程序是很有效的纠错方法。通过回溯,往往能把错误范围缩小到程序中的一小段代码,仔细回溯,往往能把错误范围缩小到程序中的一小段代码,仔细分析这段代码不难确定错误的准确位置。但对于大程序,由分析这段代码不难确定错误的准确位置。但对于大程序,由于回溯的路径数目较多,回溯会很困难。于回溯的路径数目较多,回溯会很困难。软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施 归纳的思考过程是从特殊到一般,从对个别事物的认识归纳的思考过程是从特殊到一般,从对个别事物的认识当中,通过抽象概括出事物的共同特点,得出一般性的规律当中,通过抽象概括出事物的共同特点,得出一般性的规律的过程。归纳法就是从线索(错误征兆)出发,通过分析这的过程。归纳法就是从线索(错误征兆)出发,通过分析这些线索之间的关系而找出错误的一种系统化的思考方法。归些线索之间的关系而找出错误的一种系统化的思考方法。归纳法包括下述四个步骤,收集相关数据、纳法包括下述四个步骤,收集相关数据、 组织数据、提出组织数据、提出假设、证明假设。假设、证明假设。软件工程软件测试软件工程软件测试软件测试的实施软件测试的实施(4)演绎法纠错)演绎法纠错 演绎法是一种从一般原理或前提出发,经过排除和精确演绎法是一种从一般原理或前提出发,经过排除和精确化的过程推导出结论的思考方法。演绎法是测试人员首先根化的过程推导出结论的思考方法。演绎法是测试人员首先根据已有的测试用例,设想及枚举出所有可能的出错原因作为据已有的测试用例,设想及枚举出所有可能的出错原因作为假设,然后再用原始测试数据或新的测试数据,逐个排除不假设,然后再用原始测试数据或新的测试数据,逐个排除不可能正确的假设,最后再用测试数据验证余下的假设的确是可能正确的假设,最后再用测试数据验证余下的假设的确是出错的原因。演绎法有以下四个步骤,如图出错的原因。演绎法有以下四个步骤,如图7.10所示。所示。排除不当原因推断保留假设证明假设枚举可能原因收集更多数据纠正错误有剩余无剩余不能能图7.10 演绎法纠错过程软件工程软件测试软件工程软件测试7.4 软件测试的面向对象方法简述软件工程软件测试软件工程软件测试软件测试的面向对象方法简述软件测试的面向对象方法简述 面向对象技术是一种全新的软件开发技术,正逐渐代替面向对象技术是一种全新的软件开发技术,正逐渐代替被广泛使用的面向过程的开发方法,被看成是解决软件危机被广泛使用的面向过程的开发方法,被看成是解决软件危机的新兴技术。面向对象技术能产生更好的系统结构,更规范的新兴技术。面向对象技术能产生更好的系统结构,更规范的编程风格,极大地优化了数据使用的安全性,提高了程序的编程风格,极大地优化了数据使用的安全性,提高了程序代码的可重用性。应该看到,尽管面向对象技术的基本思想代码的可重用性。应该看到,尽管面向对象技术的基本思想保证了软件应该有更高的质量,但实际情况却并非如此,因保证了软件应该有更高的质量,但实际情况却并非如此,因为无论采用什么样的编程技术,编程人员的错误都是不可避为无论采用什么样的编程技术,编程人员的错误都是不可避免的,而且由于面向对象技术开发的软件代码重用率高,更免的,而且由于面向对象技术开发的软件代码重用率高,更需要严格测试,避免错误的繁衍。所以,软件测试并没有因需要严格测试,避免错误的繁衍。所以,软件测试并没有因为面向对象编程的兴起而丧失它的重要性。为面向对象编程的兴起而丧失它的重要性。软件工程软件测试软件工程软件测试软件测试的面向对象方法简述软件测试的面向对象方法简述7.4.1 面向面向对对象象测试测试的基本概念的基本概念 面向面向对对象程序的象程序的结结构不再是构不再是传统传统的功能模的功能模块结块结构,作构,作为为一个整体,原有一个整体,原有组组装装测试测试所要求的逐步将开所要求的逐步将开发发的模的模块块搭建搭建在一起在一起进进行行测试测试的方法已成的方法已成为为不可能。而且,面向不可能。而且,面向对对象象软软件件抛弃了抛弃了传统传统的开的开发发模式,模式,对对每个开每个开发阶发阶段都有不同于以往的段都有不同于以往的要求和要求和结结果,所以也不可能用功能果,所以也不可能用功能细细化的化的观观点来点来检测检测面向面向对对象分析和象分析和设计设计的的结结果。因此,果。因此,传统传统的的测试测试模型模型对对面向面向对对象象软软件已件已经经不再适用。不再适用。针对针对面向面向对对象象软软件的开件的开发发特点,特点,应该应该有一有一种新的种新的测试测试模型。模型。软件工程软件测试软件工程软件测试软件测试的面向对象方法简述软件测试的面向对象方法简述 1.面向面向对象象测试模型模型 面向面向对象的开象的开发模型突破了模型突破了传统的瀑布模型,将开的瀑布模型,将开发分分为面向面向对象分析(象分析(OOA)、面向)、面向对象象设计(OOD)和面向)和面向对象象编程(程(OOP)三个)三个阶段。分析段。分析阶段段产生整个生整个问题空空间的抽象描述,在此基的抽象描述,在此基础上,上,进一步一步归纳出适用于面向出适用于面向对象象编程程语言的言的类和和类结构,最后形成代构,最后形成代码。由于面向。由于面向对象的特点,象的特点,采用采用这种开种开发模型能有效地将分析模型能有效地将分析设计的文本或的文本或图表代表代码化,化,不断不断适应用户需求的变动。针对这种开发模型,结合传统的适应用户需求的变动。针对这种开发模型,结合传统的测试步骤的划分,在开发过程中不断地进行测试,使开发阶测试步骤的划分,在开发过程中不断地进行测试,使开发阶段的测试与编码完成后的单元测试、组装测试、系统测试成段的测试与编码完成后的单元测试、组装测试、系统测试成为一个整体。为一个整体。软件工程软件测试软件工程软件测试软件测试的面向对象方法简述软件测试的面向对象方法简述2.面向面向对对象分析的象分析的测试测试(OOA Test) OOA直接映射直接映射问题问题空空间间,将,将问题问题空空间间中中实现实现的功能抽的功能抽象化。将象化。将问题问题空空间间中的中的实实例抽象例抽象为对为对象(不同于象(不同于C+中的中的对对象概念),用象概念),用对对象的象的结结构反映构反映问题问题空空间间的复的复杂实杂实例和复例和复杂杂关关系,用属性和服系,用属性和服务务表示表示实实例的特性和行例的特性和行为为。OOA的的结结果是果是为为后面后面阶阶段中段中类类的的选选定和定和实现实现以及以及类层类层次次结结构的构的组织组织和和实现实现提供平台。因此,如果提供平台。因此,如果OOA对问题对问题空空间间的分析抽象不完整,的分析抽象不完整,则则会影响会影响软软件的功能件的功能实现实现,导导致致软软件开件开发发后期大量的修后期大量的修补补工工作作;而一些冗余的而一些冗余的对对象或象或结结构会影响构会影响类类的的选选定、程序的整体定、程序的整体结结构,增加程序构,增加程序员员不必要的工作量。不必要的工作量。软件工程软件测试软件工程软件测试软件测试的面向对象方法简述软件测试的面向对象方法简述对对OOA的测试是复杂的测试活动的序列,通常可以划分为的测试是复杂的测试活动的序列,通常可以划分为以下五个方面以下五个方面: (1)对认定的对象的测试。)对认定的对象的测试。OOA中认定的对象是对问题中认定的对象是对问题空间中的结构、其他系统、设备,被记忆的事件、系统涉及空间中的结构、其他系统、设备,被记忆的事件、系统涉及的人员等实际实例的抽象。的人员等实际实例的抽象。 (2)对认定的结构的测试。认定的结构指的是多种对象)对认定的结构的测试。认定的结构指的是多种对象的组织方式,用来反映问题空间中的复杂实例和复杂关系。的组织方式,用来反映问题空间中的复杂实例和复杂关系。认定的结构分为两种认定的结构分为两种:分类结构和组装结构。分类结构体现分类结构和组装结构。分类结构体现了问题空间中实例的一般与特殊关系,组装结构体现了问题了问题空间中实例的一般与特殊关系,组装结构体现了问题空间中实例的整体与局部关系。空间中实例的整体与局部关系。软件工程软件测试软件工程软件测试软件测试的面向对象方法简述软件测试的面向对象方法简述 (3)对认定的主题的测试。主题是在对象和结构的基础)对认定的主题的测试。主题是在对象和结构的基础上更高一层的抽象,是为了提供上更高一层的抽象,是为了提供OOA分析结果的可见性,分析结果的可见性,如同文章对各部分内容的概要。如同文章对各部分内容的概要。 (4)对定义的属性和实例关联的测试。属性是用来描述)对定义的属性和实例关联的测试。属性是用来描述对象或结构所反映的实例的特性。而实例关联是反映实例集对象或结构所反映的实例的特性。而实例关联是反映实例集合间的映射关系。合间的映射关系。 (5)对定义的服务和消息关联的测试。定义的服务,就)对定义的服务和消息关联的测试。定义的服务,就是定义的每一种对象和结构在问题空间中所要求的行为。由是定义的每一种对象和结构在问题空间中所要求的行为。由于问题空间中实例间必要的通信,在于问题空间中实例间必要的通信,在OOA中应相应地定义中应相应地定义消息关联。消息关联。软件工程软件测试软件工程软件测试软件测试的面向对象方法简述软件测试的面向对象方法简述3.面向面向对对象象设计设计的的测试测试(OOD Test) 面向面向对对象象设计设计(OOD)以)以OOA为为基基础归纳础归纳出出类类,并建,并建立立类结类结构或构或进进一步构造成一步构造成类库类库,实现实现分析分析结结果果对问题对问题空空间间的的抽象。抽象。OOD归纳归纳的的类类,可以是,可以是对对象象简单简单的延的延续续,也可以是,也可以是不同不同对对象的相同或相似的服象的相同或相似的服务务。由此可。由此可见见,OOD不是在不是在OOA上的另一思上的另一思维维方式的大方式的大动动干戈,而是干戈,而是OOA的的进进一步一步细细化和更高化和更高层层的抽象。所以,的抽象。所以,OOD与与OOA的界限通常是的界限通常是难难以以严严格区分的。格区分的。OOD确定确定类类和和类结类结构不构不仅仅是是满满足当前需求分足当前需求分析的要求,更重要的是通析的要求,更重要的是通过过重新重新组组合或加以适当的合或加以适当的补补充,能充,能方便方便实现实现功能的重用和功能的重用和扩扩增,以不断适增,以不断适应应用用户户的要求。的要求。软件工程软件测试软件工程软件测试软件测试的面向对象方法简述软件测试的面向对象方法简述因此,对因此,对OOD的测试,应针对功能的实现和重用以及的测试,应针对功能的实现和重用以及OOA结果来进行拓展,从如下三方面来考虑结果来进行拓展,从如下三方面来考虑: (1)对认定的类的测试。)对认定的类的测试。OOD认定的类可以是认定的类可以是OOA中中认定的对象,也可以是对象所需要的服务的抽象,或对象所认定的对象,也可以是对象所需要的服务的抽象,或对象所具有的属性的抽象。认定的类原则上应尽量具有基础特征,具有的属性的抽象。认定的类原则上应尽量具有基础特征,这样才便于维护和重用。这样才便于维护和重用。 (2)对构造的类层次结构的测试。为了能充分发挥面向)对构造的类层次结构的测试。为了能充分发挥面向对象的继承共享特性,对象的继承共享特性,OOD的类层次结构,通常基于的类层次结构,通常基于OOA中产生的分类结构的原则来组织,着重体现父类和子类间的中产生的分类结构的原则来组织,着重体现父类和子类间的一般性和特殊性。在当前的问题空间中,对类层次结构的主一般性和特殊性。在当前的问题空间中,对类层次结构的主要要求是能在解空间中构造实现全部功能的结构框架。要要求是能在解空间中构造实现全部功能的结构框架。软件工程软件测试软件工程软件测试软件测试的面向对象方法简述软件测试的面向对象方法简述 (3)对类库的支持的测试。对类库的支持虽然也属于类)对类库的支持的测试。对类库的支持虽然也属于类层次结构的组织问题,但其强调的重点是再次软件开发的重层次结构的组织问题,但其强调的重点是再次软件开发的重用。由于它并不直接影响当前软件的开发和功能实现,因此,用。由于它并不直接影响当前软件的开发和功能实现,因此,将其单独提出来测试,也可作为对高质量类层次结构的评估。将其单独提出来测试,也可作为对高质量类层次结构的评估。软件工程软件测试软件工程软件测试软件测试的面向对象方法简述软件测试的面向对象方法简述4.面向面向对对象象编编程的程的测试测试(OOP Test) 典型的面向典型的面向对对象程序具有象程序具有继继承、封装和多承、封装和多态态性的新特性,性的新特性,这这使得使得传统传统的的测试测试策略必策略必须须有所改有所改变变才能才能对对面向面向对对象程序象程序进进行行测试测试。封装是。封装是对对数据的数据的隐隐藏,外界只能通藏,外界只能通过过提供的操作来提供的操作来访问访问或修改数据,或修改数据,这样这样降低了数据被任意修改和降低了数据被任意修改和读读写的可能写的可能性,降低了性,降低了传统传统程序中程序中对对数据非法操作的数据非法操作的测试测试。继继承是面向承是面向对对象程序的重要特点,象程序的重要特点,继继承使得代承使得代码码的重用率提高,同的重用率提高,同时时也也使使错误传错误传播的概率增大。播的概率增大。继继承使得承使得传统测试传统测试遇遇见见了了这样这样一个一个难题难题:对继对继承的代承的代码码究竟究竟应该应该怎怎样测试样测试?多多态态性使得面向性使得面向对对象象程序程序对对外呈外呈现现出出强强大的大的处处理能力,但同理能力,但同时时又使得程序内又使得程序内“同同一一”函数的行函数的行为为复复杂杂化,化,测试时测试时不得不考不得不考虑虑不同不同类类型具体型具体执执行的代行的代码码和和产产生的行生的行为为。软件工程软件测试软件工程软件测试软件测试的面向对象方法简述软件测试的面向对象方法简述 面向对象程序把功能的实现分布在类中。能正确实现功面向对象程序把功能的实现分布在类中。能正确实现功能的类,通过消息传递来协同实现设计要求的功能。正是这能的类,通过消息传递来协同实现设计要求的功能。正是这种面向对象程序风格,能将出现的错误精确地限定在某一具种面向对象程序风格,能将出现的错误精确地限定在某一具体的类中。因此,在面向对象编程(体的类中。因此,在面向对象编程(OOP)阶段,应该忽)阶段,应该忽略类功能实现的细则,将测试的目光集中在类功能的实现和略类功能实现的细则,将测试的目光集中在类功能的实现和相应的面向对象程序风格上,主要体现为数据成员是否满足相应的面向对象程序风格上,主要体现为数据成员是否满足类和对象的要求以及数据成员是否满足数据封装的要求两个类和对象的要求以及数据成员是否满足数据封装的要求两个方面。方面。软件工程软件测试软件工程软件测试软件测试的面向对象方法简述软件测试的面向对象方法简述7.4.2 面向面向对对象的象的测试测试策略策略 传统传统的的测试计测试计算机算机软软件的策略是从件的策略是从“小型小型测试测试”开始,逐开始,逐步走向步走向“大型大型测试测试”。用。用软软件件测试测试的行的行话话来来陈陈述,我述,我们们从从单单元元测试测试开始,然后逐步开始,然后逐步进进入入组组装装测试测试,最后是确,最后是确认测试认测试和系和系统统测试测试。在。在传统应传统应用中,用中,单单元元测试测试集中在最小的可集中在最小的可编译编译程序程序单单位,即子程序(如模位,即子程序(如模块块、子例程、子例程、进进程)中,一旦程)中,一旦这这些些单单元元均被独立均被独立测试测试后,它后,它们们就被就被组组装装进进程序程序结结构中,构中,这时这时要要进进行行一系列的回一系列的回归测试归测试以以发现发现由于模由于模块块的接口所的接口所带带来的来的错误错误和新和新单单元加入所元加入所导导致的副作用,最后,系致的副作用,最后,系统统被作被作为为一个整体来一个整体来测测试试以保以保证发现证发现在需求中的在需求中的错误错误。软件工程软件测试软件工程软件测试软件测试的面向对象方法简述软件测试的面向对象方法简述1.在在OO语语境中的境中的单单元元测试测试 当考当考虑虑面向面向对对象象软软件件时时,单单元的概念元的概念发发生了生了变变化。封装化。封装驱动驱动了了类类和和对对象的定象的定义义,这这意味着每个意味着每个类类和和类类的的实实例(例(对对象)象)包装了属性(数据)和操包装了属性(数据)和操纵这纵这些数据的操作(也称些数据的操作(也称为为方法或方法或服服务务),而不是个体的模),而不是个体的模块块。最小的可。最小的可测试单测试单位是封装的位是封装的类类或或对对象,象,类类包含一包含一组组不同的操作,并且某些特殊操作可能作不同的操作,并且某些特殊操作可能作为为其他一些其他一些类类的一部分存在,因此,的一部分存在,因此,单单元元测试测试的意的意义发义发生了生了较较大大变变化。化。软件工程软件测试软件工程软件测试软件测试的面向对象方法简述软件测试的面向对象方法简述 我们不再孤立地测试单个操作(传统的单元测试观点),我们不再孤立地测试单个操作(传统的单元测试观点),而是将操作作为类的一部分。例如,考虑一个层次,其中操而是将操作作为类的一部分。例如,考虑一个层次,其中操作作A针对超类定义并被一组子类继承,每个子类使用操作针对超类定义并被一组子类继承,每个子类使用操作A,并且它被应用于为每个子类定义的私有属性和操作的环境,并且它被应用于为每个子类定义的私有属性和操作的环境内。因为操作内。因为操作A被使用的语境有微妙的不同,有必要在每个被使用的语境有微妙的不同,有必要在每个子类的语境中测试操作子类的语境中测试操作A。这意味着在面向对象的语境内在。这意味着在面向对象的语境内在真空中测试操作真空中测试操作A(即传统的单元测试方法)是无效的。(即传统的单元测试方法)是无效的。 对对OO软件的类测试等价于传统软件的单元测试。和传软件的类测试等价于传统软件的单元测试。和传统软件的单元测试不一样,它往往关注模块的算法细节和模统软件的单元测试不一样,它往往关注模块的算法细节和模块接口间流动的数据,块接口间流动的数据,OO软件的类测试是由封装在类中的软件的类测试是由封装在类中的操作和类的状态行为所驱动的。操作和类的状态行为所驱动的。软件工程软件测试软件工程软件测试软件测试的面向对象方法简述软件测试的面向对象方法简述2.在在OO语语境中的境中的组组装装测试测试 因因为为面向面向对对象象软软件没有件没有层层次的控制次的控制结结构,构,传统传统的自的自顶顶向下和自底向上的向下和自底向上的组组装策略就没有意装策略就没有意义义了,此外,一次集成了,此外,一次集成一个操作到一个操作到类类中(中(传统传统的的渐渐增式方法)一般是不可能的,增式方法)一般是不可能的,这这是由于构成是由于构成类类的成分的直接和的成分的直接和间间接的交互。接的交互。 对对OO软软件的件的组组装装测试测试有两种不同策略。第一种称有两种不同策略。第一种称为为基基于于线线程的程的测试测试,组组装装对应对应系系统统的一个的一个输输入或事件所需的一入或事件所需的一组组类类,每个,每个线线程被程被组组装并分装并分别测试别测试,应应用回用回归测试归测试以保以保证证没有没有副作用副作用产产生。第二种称生。第二种称为为基于使用的基于使用的测试测试,通,通过测试过测试那些几那些几乎不使用服乎不使用服务务器器类类的的类类(称(称为为独立独立类类)来开始构造系)来开始构造系统统,在,在独立独立类测试类测试完成后,下一完成后,下一层层的使用独立的使用独立类类的的类类(称(称为为依依赖类赖类)被被测试测试。这这个依个依赖类层赖类层次的次的测试测试序列一直持序列一直持续续到构造完整个到构造完整个系系统统。序列和。序列和传统组传统组装不同,要尽可能避免使用装不同,要尽可能避免使用驱动驱动程序和程序和桩桩模模块块作作为为替代操作。替代操作。软件工程软件测试软件工程软件测试软件测试的面向对象方法简述软件测试的面向对象方法简述3.在在OO语语境中的确境中的确认测试认测试 在确在确认认或系或系统层统层次,次,类连类连接的接的细节细节消失了。和消失了。和传统传统确确认认一一样样,OO软软件的确件的确认认集中在用集中在用户户可可见见的的动动作和用作和用户户可可识别识别的系的系统输统输出上。出上。为为了了协协助确助确认测试认测试的的导导出,出,测试员应该测试员应该充分充分利用作利用作为为分析模型一部分的使用分析模型一部分的使用实实例,使用例,使用实实例提供了在用例提供了在用户户交互需求中很可能交互需求中很可能发现错误发现错误的一个的一个场场景。景。传统传统的黑盒的黑盒测试测试方法可被用于方法可被用于驱动驱动确确认测试认测试,此外,此外,测试测试用例可以从用例可以从对对象的象的行行为为模型和作模型和作为为OOA一部分的事件流一部分的事件流图图中中导导出。出。软件工程软件测试软件工程软件测试本章小结本章小结 软件测试的目的是尽可能地发现软件中的错误。由于穷软件测试的目的是尽可能地发现软件中的错误。由于穷尽的测试是不可能实现的,所以必须设计有限的测试用例去尽的测试是不可能实现的,所以必须设计有限的测试用例去发现软件中尽可能多的隐藏的错误,测试用例包括测试数据发现软件中尽可能多的隐藏的错误,测试用例包括测试数据和预期的测试结果两部分。常用的测试方法有黑盒测试和白和预期的测试结果两部分。常用的测试方法有黑盒测试和白盒测试方法。黑盒测试是接口级的测试,通常有等价类划分盒测试方法。黑盒测试是接口级的测试,通常有等价类划分测试、边界值测试、错误推断测试等方法。白盒测试是结构测试、边界值测试、错误推断测试等方法。白盒测试是结构级的测试,根据覆盖的程度可分为语句覆盖、判定覆盖、条级的测试,根据覆盖的程度可分为语句覆盖、判定覆盖、条件覆盖、判定件覆盖、判定.条件覆盖、条件组合覆盖、路径覆盖等。条件覆盖、条件组合覆盖、路径覆盖等。软件工程软件测试软件工程软件测试本章小结本章小结 在实施软件测试的过程中,通常是按照单元测试、组装在实施软件测试的过程中,通常是按照单元测试、组装测试、确认测试、系统测试来进行的。单元测试在编码阶段测试、确认测试、系统测试来进行的。单元测试在编码阶段进行,是对每个独立的模块实施单独的测试。组装测试是在进行,是对每个独立的模块实施单独的测试。组装测试是在单元测试的基础上,通过自顶向下组装或自底向上组装的集单元测试的基础上,通过自顶向下组装或自底向上组装的集成方式,将所有模块按照软件设计要求组装成为系统的过程。成方式,将所有模块按照软件设计要求组装成为系统的过程。完成了组装测试的软件,还必须经过确认测试和专家鉴定,完成了组装测试的软件,还必须经过确认测试和专家鉴定,才能交付用户使用。为了提高软件的可靠性和节省测试时间,才能交付用户使用。为了提高软件的可靠性和节省测试时间,需要借助一些常用的测试工具进行测试,利用好这些测试工需要借助一些常用的测试工具进行测试,利用好这些测试工具可以达到事半功倍的效果。不同于传统的面向过程测试,具可以达到事半功倍的效果。不同于传统的面向过程测试,面向对象的测试必须建立面向对象的测试模型。在面向对象面向对象的测试必须建立面向对象的测试模型。在面向对象的测试环境中,单元测试、组装测试以及确认测试都发生了的测试环境中,单元测试、组装测试以及确认测试都发生了本质上的改变。本质上的改变。软件工程软件测试软件工程软件测试
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号