软件测试理论和方法ppt课件

上传人:ni****g 文档编号:569416062 上传时间:2024-07-29 格式:PPT 页数:580 大小:6.27MB
返回 下载 相关 举报
软件测试理论和方法ppt课件_第1页
第1页 / 共580页
软件测试理论和方法ppt课件_第2页
第2页 / 共580页
软件测试理论和方法ppt课件_第3页
第3页 / 共580页
软件测试理论和方法ppt课件_第4页
第4页 / 共580页
软件测试理论和方法ppt课件_第5页
第5页 / 共580页
点击查看更多>>
资源描述

《软件测试理论和方法ppt课件》由会员分享,可在线阅读,更多相关《软件测试理论和方法ppt课件(580页珍藏版)》请在金锄头文库上搜索。

1、软件测试软件测试n软件测试的目的和原则n软件测试的重要性n错误的分类n软件测试用例设计n软件测试的过程与策略n软件测试种类n程序的静态测试n程序调试nGUI测试n文档测试n面向对象系统的测试n客户/服务器系统的测试nWEB系统的测试nRUP中的测试工作流软件测试的目的和原则软件测试的目的和原则n n软件测试的目的n n软件测试的原则n n软件测试的对象n n测试信息流n n测试与软件开发各阶段的关系软件测试的目的软件测试的目的软件测试的目的软件测试的目的n n基于不同的立场,存在着两种完全不同的测试目的。n n从用户的角度出发,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,以考虑是否可接受该

2、产品。n n从软件开发者的角度出发,则希望测试成为表明软件产品中不存在错误的过程,验证该软件已正确地实现了用户的要求,确立人们对软件质量的信心。MyersMyers软件测试目的软件测试目的软件测试目的软件测试目的(1) 测试是程序的执行过程,目的在于发现错误;(2) 一个好的测试用例在于能发现至今未发现的错误;(3) 一个成功的测试是发现了至今未发现的错误的测试。n n换言之,测试的目的是换言之,测试的目的是u u 想以最少的时间和人力,想以最少的时间和人力,系统地找出软件系统地找出软件中潜在的各种错误和缺陷中潜在的各种错误和缺陷。如果我们成功。如果我们成功地实施了测试,我们就能够发现软件中的

3、地实施了测试,我们就能够发现软件中的错误。错误。u u 测试的附带收获是,它测试的附带收获是,它能够证明软件的功能够证明软件的功能和性能与需求说明相符合能和性能与需求说明相符合。u u 实施测试收集到的测试结果数据为可靠性实施测试收集到的测试结果数据为可靠性分析提供了依据。分析提供了依据。u u 测试不能表明软件中不存在错误,它只能测试不能表明软件中不存在错误,它只能说明软件中存在错误。说明软件中存在错误。软件测试的原则软件测试的原则软件测试的原则软件测试的原则1. 测试计划可以在需求模型一完成就开始,详细的测试用例定义可以在设计模型被确定后立刻开始。因此所有测试可以在任何代码被产生前进行计划

4、和设计。 应当把“尽早地和不断地进行软件测试”作为软件开发者的座右铭。2. 所有的测试都应追溯到用户需求。软件测试的目标在于揭示错误,而最严重的错误(从用户角度看)是那些导致程序无法满足需求的错误。 3. 测试用例应由测试输入数据和对应的预期输出结果这两部分组成。4. 程序员应避免检查自己的程序。5. 在设计测试用例时,应包括合理的输入条件和不合理的输入条件。6. 测试应从“小规模”开始,逐步转向“大规模”。从单元测试到组装测试再到系统测试7。穷举测试是不可能的,然而充分覆盖程序逻辑,并确保程序设计中使用的所有条件是有可能的。软件测试的原则软件测试的原则软件测试的原则软件测试的原则8. Par

5、eto原则应用于软件测试。Pareto原则暗示着测试发现的错误中80%很可能起源于程序模块中20%。因此应集中精力孤立有疑点的模块,对其进行彻底测试,这对测试的安排很重要。9. 充分注意测试中的群集现象。经验表明,测试后程序中残存的错误数目与该程序中已发现的错误数目成正比。10. 严格执行测试计划,排除测试的随意性。应当对每一个测试结果做全面检查。妥善保存测试计划,测试用例,出错统计和最终分析报告,为维护提供方便。软件测试的原则软件测试的原则软件测试的原则软件测试的原则软软软软件件件件测测测测试试试试的的的的对对对对象象象象n n软件测试并不等于程序测试。软件测试应贯穿于软件定义与开发的整个期

6、间。n n需求分析、概要设计、详细设计以及程序编码等各阶段所得到的文档,包括需求规格说明、概要设计规格说明、详细设计规格说明以及源程序,都应成为软件测试的对象。n n为把握软件开发各个环节的正确性,需要进行各种确认和验证工作。n n确认(Validation),是一系列的活动和过程,目的是想证实在一个给定的外部环境中软件的逻辑正确性。u u 需求规格说明确认u u 程序确认 (静态确认、动态确认) n n验证(Verification),试图证明在软件生存期各个阶段,以及阶段间的逻辑协调性、完备性和正确性。测试信息流测试信息流测试信息流测试信息流测试信息流测试信息流n n软件配置:软件需求规格

7、说明、软件设计规格说明、源代码等;n n测试配置:测试计划、测试用例、测试程序等;n n测试工具:测试数据自动生成程序、静态分析程序、动态分析程序、测试结果分析程序、以及驱动测试的测试数据库等等。n n测试结果分析:比较实测结果与预期结果,评价错误是否发生。n n排错(调试):对已经发现的错误进行错误定位和确定出错性质,并改正这些错误,同时修改相关的文档。n n修正后的文档再测试:直到通过测试为止。n n通过收集和分析测试结果数据,对软件建立可通过收集和分析测试结果数据,对软件建立可靠性模型靠性模型n n利用可靠性分析,评价软件质量:利用可靠性分析,评价软件质量:u u 软件的质量和可靠性达到

8、可以接受的程度;软件的质量和可靠性达到可以接受的程度;u u 所做的测试不足以发现严重的错误;所做的测试不足以发现严重的错误;n n如果测试发现不了错误,可以肯定,测试配置如果测试发现不了错误,可以肯定,测试配置考虑得不够细致充分,错误仍然潜伏在软件中。考虑得不够细致充分,错误仍然潜伏在软件中。这些错误最终不得不由用户在使用中发现,并这些错误最终不得不由用户在使用中发现,并在维护时由开发者去改正。但那时改正错误的在维护时由开发者去改正。但那时改正错误的费用将比在开发阶段改正错误的费用要高出费用将比在开发阶段改正错误的费用要高出4040倍到倍到6060倍。倍。 测试与软件开发各阶段的关系测试与软

9、件开发各阶段的关系测试与软件开发各阶段的关系测试与软件开发各阶段的关系n n软件开发过程是一个自顶向下,逐步细化的过程n n软件计划阶段定义软件作用域n n软件需求分析建立软件信息域、功能和性能需求、约束等n n软件设计n n把设计用某种程序设计语言转换成程序代码n n测试过程是依相反顺序安排的自底向上,逐步集成的过程。传统测试过程建立建立设计设计测试测试测试生命周期建立建立 1 1建立建立 2 2建立建立 3 3建立建立 4 4用户改进迭代测试测试测试测试测试测试测试测试测试需要尽早的开始设计设计无须 “冻结” 规格测试生命周期规格规格测试测试规格规格1 1建立建立 2 2建立建立 3 3建

10、立建立 4 4测试测试规格规格2 2测试测试规格规格3 3测试测试规格规格4 4建立建立 1 1测试生命周期开发生命周期开发生命周期. 维护需求定义应用定义应用开发修订建立 建立测试生命周期开发生命周期开发生命周期. 维护 需求定义应用定义应用开发 修订 建立 建立测试生命周期测试生命周期.执行. 执行执行.测试计划缺陷跟踪测试开发测试设计评估测试生命周期. . . . .执行. 执行测试计划缺陷跟踪测试开发测试设计评估建立 建立 . . . . .执行 建立测试生命周期n测试计划测试计划u定义测试项目的过程,以便测试项目能被正确的度量和定义测试项目的过程,以便测试项目能被正确的度量和控制。控

11、制。u包括测试需求,测试策略,测试资源和测试计划包括测试需求,测试策略,测试资源和测试计划. . . . .执行. 执行.测试计划缺陷跟踪测试开发测试设计评估 建立 建立. . . . .执行.建立测试生命周期n测试设计测试设计u为了最有效的验证测试需求被覆盖,定义自动的测试为了最有效的验证测试需求被覆盖,定义自动的测试. . . . .执行.执行.测试计划缺陷跟踪测试开发测试设计评估建立 建立. . . . .执行.建立测试生命周期n测试开发测试开发u在测试设计期间已被定义,创建或获得自动的测试过程在测试设计期间已被定义,创建或获得自动的测试过程. . . . . .执行.执行.测试计划缺陷

12、跟踪测试开发测试设计评估建立建立. . . . .执行.建立测试生命周期n测试执行测试执行u运行与被测试应用的软件构造相对应的测试过程集,并记运行与被测试应用的软件构造相对应的测试过程集,并记录结果日志,包括缺陷报告和测试日志。录结果日志,包括缺陷报告和测试日志。. . . . .执行. 执行.测试计划缺陷跟踪测试开发测试设计评估建立建立. . . . .执行.建立测试生命周期n测试评估测试评估u分析测试结果,确定是否测试标准被覆盖的过程分析测试结果,确定是否测试标准被覆盖的过程. . . . . .执行. 执行.测试计划缺陷跟踪测试开发测试设计评估建立建立. . . . .执行.建立测试生命

13、周期n缺陷跟踪缺陷跟踪u初始记录测试故障或用户问题,检查测试故障以及提供初始记录测试故障或用户问题,检查测试故障以及提供解决它们的结构的过程。解决它们的结构的过程。测试人人员项目持目持续时间测试人人员100%50%0%完成比率完成比率代代码实现消除缺陷消除缺陷质量量问题延延迟上市上市维护的的费用用1x10x100x软件测试重要性软件测试重要性项目持目持续时间100%50%0%完成比率完成比率消除缺陷消除缺陷消除缺陷消除缺陷保保证软件件质量量缩短上市短上市时间软件测试重要性系系统性能性能应用性能用性能功能功能可靠性可靠性100%软件测试重要性风险风险代代码完成完成可靠性可靠性功能功能应用性能用性

14、能系系统性能性能风险风险越早越早测试越好越好自自动的的测试测试每一个版本每一个版本传统的的测试是在代是在代码实现之后之后进行行软件测试重要性程序错误分类程序错误分类(1) 按错误的影响和后果分类n n较小错误:只对系统输出有一些非实质性影响。如,输出较小错误:只对系统输出有一些非实质性影响。如,输出较小错误:只对系统输出有一些非实质性影响。如,输出较小错误:只对系统输出有一些非实质性影响。如,输出的数据格式不合要求等。的数据格式不合要求等。的数据格式不合要求等。的数据格式不合要求等。n n中等错误:对系统的运行有局部影响。如输出的某些数据中等错误:对系统的运行有局部影响。如输出的某些数据中等错

15、误:对系统的运行有局部影响。如输出的某些数据中等错误:对系统的运行有局部影响。如输出的某些数据有错误或出现冗余。有错误或出现冗余。有错误或出现冗余。有错误或出现冗余。n n较严重错误:系统的行为因错误的干扰而出现明显不合情较严重错误:系统的行为因错误的干扰而出现明显不合情较严重错误:系统的行为因错误的干扰而出现明显不合情较严重错误:系统的行为因错误的干扰而出现明显不合情理的现象。比如开出了理的现象。比如开出了理的现象。比如开出了理的现象。比如开出了0.000.00元的支票,系统的输出完全不元的支票,系统的输出完全不元的支票,系统的输出完全不元的支票,系统的输出完全不可信赖。可信赖。可信赖。可信

16、赖。n n严重错误:系统运行不可跟踪,一时不能掌握其规律,时严重错误:系统运行不可跟踪,一时不能掌握其规律,时严重错误:系统运行不可跟踪,一时不能掌握其规律,时严重错误:系统运行不可跟踪,一时不能掌握其规律,时好时坏。好时坏。好时坏。好时坏。n n非常严重的错误:系统运行中突然停机,其原因不明,无非常严重的错误:系统运行中突然停机,其原因不明,无非常严重的错误:系统运行中突然停机,其原因不明,无非常严重的错误:系统运行中突然停机,其原因不明,无法软启动。法软启动。法软启动。法软启动。n n最严重的错误:系统运行导致环境破坏,或是造成事故,最严重的错误:系统运行导致环境破坏,或是造成事故,最严重

17、的错误:系统运行导致环境破坏,或是造成事故,最严重的错误:系统运行导致环境破坏,或是造成事故,引起生命、财产的损失。引起生命、财产的损失。引起生命、财产的损失。引起生命、财产的损失。 (2) 按错误的性质和范围分类。B.BeizerB.Beizer从软件从软件测试观点出发,把软件错误分为测试观点出发,把软件错误分为5 5类。类。n n 功能错误功能错误u u 规格说明错误:规格说明可能不完全,有二义性或规格说明错误:规格说明可能不完全,有二义性或规格说明错误:规格说明可能不完全,有二义性或规格说明错误:规格说明可能不完全,有二义性或自身矛盾。自身矛盾。自身矛盾。自身矛盾。u u功能错误:程序实

18、现的功能与用户要求的不一致。功能错误:程序实现的功能与用户要求的不一致。功能错误:程序实现的功能与用户要求的不一致。功能错误:程序实现的功能与用户要求的不一致。这常常是由于规格说明中包含错误的功能、多余的这常常是由于规格说明中包含错误的功能、多余的这常常是由于规格说明中包含错误的功能、多余的这常常是由于规格说明中包含错误的功能、多余的功能或遗漏的功能所致。功能或遗漏的功能所致。功能或遗漏的功能所致。功能或遗漏的功能所致。u u测试错误:软件测试的设计与实施发生错误。软件测试错误:软件测试的设计与实施发生错误。软件测试错误:软件测试的设计与实施发生错误。软件测试错误:软件测试的设计与实施发生错误

19、。软件测试自身也可能发生错误。测试自身也可能发生错误。测试自身也可能发生错误。测试自身也可能发生错误。u u测试标准引起的错误:对软件测试的标准要选择适测试标准引起的错误:对软件测试的标准要选择适测试标准引起的错误:对软件测试的标准要选择适测试标准引起的错误:对软件测试的标准要选择适当,若测试标准太复杂,则导致测试过程出错的可当,若测试标准太复杂,则导致测试过程出错的可当,若测试标准太复杂,则导致测试过程出错的可当,若测试标准太复杂,则导致测试过程出错的可能就大。能就大。能就大。能就大。n n 系统错误系统错误u u外部接口错误:外部接口指如终端、打印机、通信外部接口错误:外部接口指如终端、打

20、印机、通信外部接口错误:外部接口指如终端、打印机、通信外部接口错误:外部接口指如终端、打印机、通信线路等系统与外部环境通信的手段。所有外部接口线路等系统与外部环境通信的手段。所有外部接口线路等系统与外部环境通信的手段。所有外部接口线路等系统与外部环境通信的手段。所有外部接口之间,人与机器之间的通信都使用形式的或非形式之间,人与机器之间的通信都使用形式的或非形式之间,人与机器之间的通信都使用形式的或非形式之间,人与机器之间的通信都使用形式的或非形式的专门协议。如果协议有错,或太复杂,难以理解,的专门协议。如果协议有错,或太复杂,难以理解,的专门协议。如果协议有错,或太复杂,难以理解,的专门协议。

21、如果协议有错,或太复杂,难以理解,致使在使用中出错。此外还包括对输入输出格式致使在使用中出错。此外还包括对输入输出格式致使在使用中出错。此外还包括对输入输出格式致使在使用中出错。此外还包括对输入输出格式错误理解,对输入数据不合理的容错等等。错误理解,对输入数据不合理的容错等等。错误理解,对输入数据不合理的容错等等。错误理解,对输入数据不合理的容错等等。u u内部接口错误:内部接口指程序之间的联系。它所内部接口错误:内部接口指程序之间的联系。它所内部接口错误:内部接口指程序之间的联系。它所内部接口错误:内部接口指程序之间的联系。它所发生的错误与程序内实现的细节有关。例如,设计发生的错误与程序内实

22、现的细节有关。例如,设计发生的错误与程序内实现的细节有关。例如,设计发生的错误与程序内实现的细节有关。例如,设计协议错、输入输出格式错、数据保护不可靠、子协议错、输入输出格式错、数据保护不可靠、子协议错、输入输出格式错、数据保护不可靠、子协议错、输入输出格式错、数据保护不可靠、子程序访问错等。程序访问错等。程序访问错等。程序访问错等。u u硬件结构错误:这类错误在于不能正确地理解硬件硬件结构错误:这类错误在于不能正确地理解硬件硬件结构错误:这类错误在于不能正确地理解硬件硬件结构错误:这类错误在于不能正确地理解硬件如何工作。例如,忽视或错误地理解分页机构、地如何工作。例如,忽视或错误地理解分页机

23、构、地如何工作。例如,忽视或错误地理解分页机构、地如何工作。例如,忽视或错误地理解分页机构、地址生成、通道容量、址生成、通道容量、址生成、通道容量、址生成、通道容量、I IOO指令、中断处理、设备初指令、中断处理、设备初指令、中断处理、设备初指令、中断处理、设备初始化和启动等而导致的出错。始化和启动等而导致的出错。始化和启动等而导致的出错。始化和启动等而导致的出错。u u操作系统错误:这类错误主要是由于不了解操作系统的工作操作系统错误:这类错误主要是由于不了解操作系统的工作操作系统错误:这类错误主要是由于不了解操作系统的工作操作系统错误:这类错误主要是由于不了解操作系统的工作机制而导致出错。当

24、然,操作系统本身也有错误,但是一般机制而导致出错。当然,操作系统本身也有错误,但是一般机制而导致出错。当然,操作系统本身也有错误,但是一般机制而导致出错。当然,操作系统本身也有错误,但是一般用户很难发现这种错误。用户很难发现这种错误。用户很难发现这种错误。用户很难发现这种错误。u u软件结构错误:由于软件结构不合理或不清晰而引起的错误。软件结构错误:由于软件结构不合理或不清晰而引起的错误。软件结构错误:由于软件结构不合理或不清晰而引起的错误。软件结构错误:由于软件结构不合理或不清晰而引起的错误。这种错误通常与系统的负载有关,而且往往在系统满载时才这种错误通常与系统的负载有关,而且往往在系统满载

25、时才这种错误通常与系统的负载有关,而且往往在系统满载时才这种错误通常与系统的负载有关,而且往往在系统满载时才出现。这是最难发现的一类错误。例如,错误地设置局部参出现。这是最难发现的一类错误。例如,错误地设置局部参出现。这是最难发现的一类错误。例如,错误地设置局部参出现。这是最难发现的一类错误。例如,错误地设置局部参数或全局参数;错误地假定寄存器与存储器单元初始化了;数或全局参数;错误地假定寄存器与存储器单元初始化了;数或全局参数;错误地假定寄存器与存储器单元初始化了;数或全局参数;错误地假定寄存器与存储器单元初始化了;错误地假定不会发生中断而导致不能封锁或开中断;错误地错误地假定不会发生中断而

26、导致不能封锁或开中断;错误地错误地假定不会发生中断而导致不能封锁或开中断;错误地错误地假定不会发生中断而导致不能封锁或开中断;错误地假定程序可以绕过数据的内部锁而导致不能关闭或打开内部假定程序可以绕过数据的内部锁而导致不能关闭或打开内部假定程序可以绕过数据的内部锁而导致不能关闭或打开内部假定程序可以绕过数据的内部锁而导致不能关闭或打开内部锁;错误地假定被调用子程序常驻内存或非常驻内存等等,锁;错误地假定被调用子程序常驻内存或非常驻内存等等,锁;错误地假定被调用子程序常驻内存或非常驻内存等等,锁;错误地假定被调用子程序常驻内存或非常驻内存等等,都将导致软件出错。都将导致软件出错。都将导致软件出错

27、。都将导致软件出错。u u控制与顺序错误:这类错误包括:忽视了时间因素而破坏了控制与顺序错误:这类错误包括:忽视了时间因素而破坏了控制与顺序错误:这类错误包括:忽视了时间因素而破坏了控制与顺序错误:这类错误包括:忽视了时间因素而破坏了事件的顺序;猜测事件出现在指定的序列中;等待一个不可事件的顺序;猜测事件出现在指定的序列中;等待一个不可事件的顺序;猜测事件出现在指定的序列中;等待一个不可事件的顺序;猜测事件出现在指定的序列中;等待一个不可能发生的条件;漏掉先决条件;规定错误的优先级或程序状能发生的条件;漏掉先决条件;规定错误的优先级或程序状能发生的条件;漏掉先决条件;规定错误的优先级或程序状能

28、发生的条件;漏掉先决条件;规定错误的优先级或程序状态;漏掉处理步骤;存在不正确的处理步骤或多余的处理步态;漏掉处理步骤;存在不正确的处理步骤或多余的处理步态;漏掉处理步骤;存在不正确的处理步骤或多余的处理步态;漏掉处理步骤;存在不正确的处理步骤或多余的处理步骤等。骤等。骤等。骤等。u u资源管理错误:这类错误是由于不正确地使用资源而产生的。资源管理错误:这类错误是由于不正确地使用资源而产生的。资源管理错误:这类错误是由于不正确地使用资源而产生的。资源管理错误:这类错误是由于不正确地使用资源而产生的。例如,使用未经获准的资源;使用后未释放资源;资源死锁;例如,使用未经获准的资源;使用后未释放资源

29、;资源死锁;例如,使用未经获准的资源;使用后未释放资源;资源死锁;例如,使用未经获准的资源;使用后未释放资源;资源死锁;把资源链接在错误的队列中等等。把资源链接在错误的队列中等等。把资源链接在错误的队列中等等。把资源链接在错误的队列中等等。n n 加工错误加工错误u u算术与操作错误:指在算术运算、函数求值和一般操作算术与操作错误:指在算术运算、函数求值和一般操作算术与操作错误:指在算术运算、函数求值和一般操作算术与操作错误:指在算术运算、函数求值和一般操作过程中发生的错误。包括:数据类型转换错;除法溢出;过程中发生的错误。包括:数据类型转换错;除法溢出;过程中发生的错误。包括:数据类型转换错

30、;除法溢出;过程中发生的错误。包括:数据类型转换错;除法溢出;错误地使用关系比较符;用整数与浮点数做比较等。错误地使用关系比较符;用整数与浮点数做比较等。错误地使用关系比较符;用整数与浮点数做比较等。错误地使用关系比较符;用整数与浮点数做比较等。u u初始化错误:典型的错误有:忘记初始化工作区,忘记初始化错误:典型的错误有:忘记初始化工作区,忘记初始化错误:典型的错误有:忘记初始化工作区,忘记初始化错误:典型的错误有:忘记初始化工作区,忘记初始化寄存器和数据区;错误地对循环控制变量赋初值;初始化寄存器和数据区;错误地对循环控制变量赋初值;初始化寄存器和数据区;错误地对循环控制变量赋初值;初始化

31、寄存器和数据区;错误地对循环控制变量赋初值;用不正确的格式,数据或类型进行初始化等等。用不正确的格式,数据或类型进行初始化等等。用不正确的格式,数据或类型进行初始化等等。用不正确的格式,数据或类型进行初始化等等。u u 控制和次序错误:这类错误与系统级同名错误类似,但控制和次序错误:这类错误与系统级同名错误类似,但控制和次序错误:这类错误与系统级同名错误类似,但控制和次序错误:这类错误与系统级同名错误类似,但它是局部错误。包括:遗漏路径;不可达到的代码;不它是局部错误。包括:遗漏路径;不可达到的代码;不它是局部错误。包括:遗漏路径;不可达到的代码;不它是局部错误。包括:遗漏路径;不可达到的代码

32、;不符合语法的循环嵌套;循环返回和终止的条件不正确;符合语法的循环嵌套;循环返回和终止的条件不正确;符合语法的循环嵌套;循环返回和终止的条件不正确;符合语法的循环嵌套;循环返回和终止的条件不正确;漏掉处理步骤或处理步骤有错等。漏掉处理步骤或处理步骤有错等。漏掉处理步骤或处理步骤有错等。漏掉处理步骤或处理步骤有错等。u u静态逻辑错误:这类错误主要包括:不正确地使用静态逻辑错误:这类错误主要包括:不正确地使用静态逻辑错误:这类错误主要包括:不正确地使用静态逻辑错误:这类错误主要包括:不正确地使用CASECASE语句;在表达式中使用不正确的否定(例如用语句;在表达式中使用不正确的否定(例如用语句;

33、在表达式中使用不正确的否定(例如用语句;在表达式中使用不正确的否定(例如用“ “” ”代代代代替替替替“ “” ”的否定);对情况不适当地分解与组合;混淆的否定);对情况不适当地分解与组合;混淆的否定);对情况不适当地分解与组合;混淆的否定);对情况不适当地分解与组合;混淆“ “或或或或” ”与与与与“ “异或异或异或异或” ”等。等。等。等。n n 数据错误数据错误u u动态数据错误:动态数据是在程序执行过程中暂时存在的数据。各种动态数据错误:动态数据是在程序执行过程中暂时存在的数据。各种动态数据错误:动态数据是在程序执行过程中暂时存在的数据。各种动态数据错误:动态数据是在程序执行过程中暂时

34、存在的数据。各种不同类型的动态数据在程序执行期间将共享一个共同的存储区域,若不同类型的动态数据在程序执行期间将共享一个共同的存储区域,若不同类型的动态数据在程序执行期间将共享一个共同的存储区域,若不同类型的动态数据在程序执行期间将共享一个共同的存储区域,若程序启动时对这个区域未初始化,就会导致数据出错。由于动态数据程序启动时对这个区域未初始化,就会导致数据出错。由于动态数据程序启动时对这个区域未初始化,就会导致数据出错。由于动态数据程序启动时对这个区域未初始化,就会导致数据出错。由于动态数据被破坏的位置可能与出错的位置在距离上相差很远,因此要发现这类被破坏的位置可能与出错的位置在距离上相差很远

35、,因此要发现这类被破坏的位置可能与出错的位置在距离上相差很远,因此要发现这类被破坏的位置可能与出错的位置在距离上相差很远,因此要发现这类错误比较困难。错误比较困难。错误比较困难。错误比较困难。u u静态数据错误:静态数据在内容和格式上都是固定的。它们直接或间静态数据错误:静态数据在内容和格式上都是固定的。它们直接或间静态数据错误:静态数据在内容和格式上都是固定的。它们直接或间静态数据错误:静态数据在内容和格式上都是固定的。它们直接或间接地出现在程序或数据库中。由编译程序或其它专门程序对它们做预接地出现在程序或数据库中。由编译程序或其它专门程序对它们做预接地出现在程序或数据库中。由编译程序或其它

36、专门程序对它们做预接地出现在程序或数据库中。由编译程序或其它专门程序对它们做预处理。这是在程序执行前防止静态错误的好办法,但预处理也会出错。处理。这是在程序执行前防止静态错误的好办法,但预处理也会出错。处理。这是在程序执行前防止静态错误的好办法,但预处理也会出错。处理。这是在程序执行前防止静态错误的好办法,但预处理也会出错。u u数据内容错误:数据内容是指存储于存储单元或数据结构中的位串、数据内容错误:数据内容是指存储于存储单元或数据结构中的位串、数据内容错误:数据内容是指存储于存储单元或数据结构中的位串、数据内容错误:数据内容是指存储于存储单元或数据结构中的位串、字符串或数字。数据内容本身没

37、有特定的含义,除非通过硬件或软件字符串或数字。数据内容本身没有特定的含义,除非通过硬件或软件字符串或数字。数据内容本身没有特定的含义,除非通过硬件或软件字符串或数字。数据内容本身没有特定的含义,除非通过硬件或软件给予解释。数据内容错误就是由于内容被破坏或被错误地解释而造成给予解释。数据内容错误就是由于内容被破坏或被错误地解释而造成给予解释。数据内容错误就是由于内容被破坏或被错误地解释而造成给予解释。数据内容错误就是由于内容被破坏或被错误地解释而造成的错误。的错误。的错误。的错误。u u数据结构错误:数据结构是指数据元素的大小和组织形式。在同一存数据结构错误:数据结构是指数据元素的大小和组织形式

38、。在同一存数据结构错误:数据结构是指数据元素的大小和组织形式。在同一存数据结构错误:数据结构是指数据元素的大小和组织形式。在同一存储区域中可以定义不同的数据结构。数据结构错误主要包括结构说明储区域中可以定义不同的数据结构。数据结构错误主要包括结构说明储区域中可以定义不同的数据结构。数据结构错误主要包括结构说明储区域中可以定义不同的数据结构。数据结构错误主要包括结构说明错误及把一个数据结构误当做另一类数据结构使用的错误。这是更危错误及把一个数据结构误当做另一类数据结构使用的错误。这是更危错误及把一个数据结构误当做另一类数据结构使用的错误。这是更危错误及把一个数据结构误当做另一类数据结构使用的错误

39、。这是更危险的错误。险的错误。险的错误。险的错误。u u数据属性错误:数据属性是指数据内容的含义或语义。例如,整数、数据属性错误:数据属性是指数据内容的含义或语义。例如,整数、数据属性错误:数据属性是指数据内容的含义或语义。例如,整数、数据属性错误:数据属性是指数据内容的含义或语义。例如,整数、字符串、子程序等等。数据属性错误主要包括:对数据属性不正确地字符串、子程序等等。数据属性错误主要包括:对数据属性不正确地字符串、子程序等等。数据属性错误主要包括:对数据属性不正确地字符串、子程序等等。数据属性错误主要包括:对数据属性不正确地解释,比如错把整数当实数,允许不同类型数据混合运算而导致的错解释

40、,比如错把整数当实数,允许不同类型数据混合运算而导致的错解释,比如错把整数当实数,允许不同类型数据混合运算而导致的错解释,比如错把整数当实数,允许不同类型数据混合运算而导致的错误等。误等。误等。误等。n n 代码错误,主要包括代码错误,主要包括u u语法错误语法错误语法错误语法错误u u打字错误打字错误打字错误打字错误u u对语句或指令不正确理解所产生的错误。对语句或指令不正确理解所产生的错误。对语句或指令不正确理解所产生的错误。对语句或指令不正确理解所产生的错误。n n(3) (3) 按软件生存期阶段分类,按软件生存期阶段分类,GerhartGerhart分类方法把软件的逻辑分类方法把软件的

41、逻辑错误按生存期不同阶段分为错误按生存期不同阶段分为4 4类。类。u u 问题定义(需求分析)错误:它们是在软件定义阶段,分问题定义(需求分析)错误:它们是在软件定义阶段,分问题定义(需求分析)错误:它们是在软件定义阶段,分问题定义(需求分析)错误:它们是在软件定义阶段,分析员研究用户的要求后所编写的文档中出现的错误。换句话析员研究用户的要求后所编写的文档中出现的错误。换句话析员研究用户的要求后所编写的文档中出现的错误。换句话析员研究用户的要求后所编写的文档中出现的错误。换句话说,这类错误是由于问题定义不满足用户的要求而导致的错说,这类错误是由于问题定义不满足用户的要求而导致的错说,这类错误是

42、由于问题定义不满足用户的要求而导致的错说,这类错误是由于问题定义不满足用户的要求而导致的错误。误。误。误。u u 规格说明错误:这类错误是指规格说明与问题定义不一致规格说明错误:这类错误是指规格说明与问题定义不一致规格说明错误:这类错误是指规格说明与问题定义不一致规格说明错误:这类错误是指规格说明与问题定义不一致所产生的错误。它们又可以细分成:所产生的错误。它们又可以细分成:所产生的错误。它们又可以细分成:所产生的错误。它们又可以细分成:F F不一致性错误:规格说明中功能说明与问题定义发生矛盾。不一致性错误:规格说明中功能说明与问题定义发生矛盾。不一致性错误:规格说明中功能说明与问题定义发生矛

43、盾。不一致性错误:规格说明中功能说明与问题定义发生矛盾。F F冗余性错误:规格说明中某些功能说明与问题定义相比是多余冗余性错误:规格说明中某些功能说明与问题定义相比是多余冗余性错误:规格说明中某些功能说明与问题定义相比是多余冗余性错误:规格说明中某些功能说明与问题定义相比是多余的。的。的。的。F F不完整性错误:规格说明中缺少某些必要的功能说明。不完整性错误:规格说明中缺少某些必要的功能说明。不完整性错误:规格说明中缺少某些必要的功能说明。不完整性错误:规格说明中缺少某些必要的功能说明。F F不可行错误:规格说明中有些功能要求是不可行的。不可行错误:规格说明中有些功能要求是不可行的。不可行错误

44、:规格说明中有些功能要求是不可行的。不可行错误:规格说明中有些功能要求是不可行的。F F 不可测试错误:有些功能的测试要求是不现实的。不可测试错误:有些功能的测试要求是不现实的。不可测试错误:有些功能的测试要求是不现实的。不可测试错误:有些功能的测试要求是不现实的。u u 设计错误:这是在设计阶段产生的错误,它使系设计错误:这是在设计阶段产生的错误,它使系设计错误:这是在设计阶段产生的错误,它使系设计错误:这是在设计阶段产生的错误,它使系统的设计与需求规格说明中的功能说明不相符。它们统的设计与需求规格说明中的功能说明不相符。它们统的设计与需求规格说明中的功能说明不相符。它们统的设计与需求规格说

45、明中的功能说明不相符。它们又可以细分为:又可以细分为:又可以细分为:又可以细分为:F F设计不完全错误:某些功能没有被设计,或设计得不设计不完全错误:某些功能没有被设计,或设计得不设计不完全错误:某些功能没有被设计,或设计得不设计不完全错误:某些功能没有被设计,或设计得不完全。完全。完全。完全。F F算法错误:算法选择不合适。主要表现为算法的基本算法错误:算法选择不合适。主要表现为算法的基本算法错误:算法选择不合适。主要表现为算法的基本算法错误:算法选择不合适。主要表现为算法的基本功能不满足功能要求、算法不可行或者算法的效率不功能不满足功能要求、算法不可行或者算法的效率不功能不满足功能要求、算

46、法不可行或者算法的效率不功能不满足功能要求、算法不可行或者算法的效率不符合要求。符合要求。符合要求。符合要求。F F模块接口错误:模块结构不合理;模块与外部数据库模块接口错误:模块结构不合理;模块与外部数据库模块接口错误:模块结构不合理;模块与外部数据库模块接口错误:模块结构不合理;模块与外部数据库的界面不一致,模块之间的界面不一致。的界面不一致,模块之间的界面不一致。的界面不一致,模块之间的界面不一致。的界面不一致,模块之间的界面不一致。F F控制逻辑错误:控制流程与规格说明不一致;控制结控制逻辑错误:控制流程与规格说明不一致;控制结控制逻辑错误:控制流程与规格说明不一致;控制结控制逻辑错误

47、:控制流程与规格说明不一致;控制结构不合理。构不合理。构不合理。构不合理。F F数据结构错误:数据设计不合理;与算法不匹配;数数据结构错误:数据设计不合理;与算法不匹配;数数据结构错误:数据设计不合理;与算法不匹配;数数据结构错误:数据设计不合理;与算法不匹配;数据结构不满足规格说明要求。据结构不满足规格说明要求。据结构不满足规格说明要求。据结构不满足规格说明要求。u u 编码错误:编码过程中的错误是多种多样的,大体编码错误:编码过程中的错误是多种多样的,大体编码错误:编码过程中的错误是多种多样的,大体编码错误:编码过程中的错误是多种多样的,大体可归为以下几种:数据说明错、数据使用错、计算错、

48、可归为以下几种:数据说明错、数据使用错、计算错、可归为以下几种:数据说明错、数据使用错、计算错、可归为以下几种:数据说明错、数据使用错、计算错、比较错、控制流错、界面错、输入输出错,及其它比较错、控制流错、界面错、输入输出错,及其它比较错、控制流错、界面错、输入输出错,及其它比较错、控制流错、界面错、输入输出错,及其它的错误。的错误。的错误。的错误。n n在不同的开发阶段,错误的类型和表现形式是不同在不同的开发阶段,错误的类型和表现形式是不同在不同的开发阶段,错误的类型和表现形式是不同在不同的开发阶段,错误的类型和表现形式是不同的,故应当采用不同的方法和策略来进行检测。的,故应当采用不同的方法

49、和策略来进行检测。的,故应当采用不同的方法和策略来进行检测。的,故应当采用不同的方法和策略来进行检测。测试用例设计测试用例设计n n两种常用的测试方法u 黑盒测试u 白盒测试黑盒测试黑盒测试黑盒测试黑盒测试n n这种方法是把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。n n黑盒测试又叫做功能测试或数据驱动测试。n n黑盒测试方法是在程序接口上进行测试,主要是为了发现以下错误:u u 是否有不正确或遗漏了的功能?u u 在接口上,输入能否正确地接受? 能否输出正确的结果?u u 是否有数据结构错误或外部信

50、息(例如数据文件)访问错误?u u 性能上是否能够满足要求?u u 是否有初始化或终止性错误?n n用黑盒测试发现程序中的错误,必须在所有可能的输入条件和输出条件中确定测试数据,来检查程序是否都能产生正确的输出。n n但这是不可能的。n n假设一个程序P有输入量X和Y及输出量Z。在字长为32位的计算机上运行。若X、Y取整数,按黑盒方法进行穷举测试:n n可能采用的 测试数据组: 232232 264 n n如果测试一组数据需要1毫秒,一年工作365 24小时,完成所有测试需5亿年。白盒测试白盒测试白盒测试白盒测试n n此方法把测试对象看做一个透明的盒子,它允许测试人员利用程序内部的逻辑结构及有

51、关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。n n通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。因此白盒测试又称为结构测试或逻辑驱动测试。n n软件人员使用白盒测试方法,主要想对程序模块进行如下的检查:u u 对程序模块的所有独立的执行路径至少测试一次;u u 对所有的逻辑判定,取“真”与取“假”的两种情况都至少测试一次;u u 在循环的边界和运行界限内执行循环体;u u 测试内部数据结构的有效性,等。n n对一个具有多重选择和循环嵌套的程序,不同的路径数目可能是天文数字。给出一个小程序的流程图,它包括了一个执行20次的循环。n n包含的不同执行路径数达520条,

52、对每一条路径进行测试需要1毫秒,假定一年工作365 24小时,要想把所有路径测试完,需3170年。为什么进行白盒测试?为什么进行白盒测试?n一个合理的问题:“我们应该更注重于保证程序需求的实现,为什么要花费时间和精力来担心(和测试)逻辑细节?”,换一种说法,我们为什么不将所有的精力用于黑盒测试呢?n答案在于软件的自身缺陷:u逻辑错误和不正确的假设与一条程序路径被运行的可能性成反比。当我们设计和实现主流之外的功能、条件或控制时,错误往往开始出现在我们的工作中。u我们经常相信某逻辑路径不可能被执行,而事实上,它可能在正常的基础上被执行。程序的逻辑流有时是违反直觉的,这意味着我们关于控制流和数据流的

53、一些无意识的假设可能导致设计错误,只有路径测试能发现这种错误。;u印刷上的错误是随机的。程序员可能会产生某些拼写错误,绝大多数可以在编译时被发现,但是,有些在测试时才会被发现。n黑盒测试,不管它多全面,都可能忽略前面提到的某些类型的错误“错误潜伏在角落里,聚集在边界上”。白盒测试更可能发现它们!逻辑覆盖逻辑覆盖逻辑覆盖逻辑覆盖u u 语句覆盖u u 判定覆盖u u 条件覆盖u u 判定条件覆盖u u 条件组合覆盖u u 路径覆盖。逻辑覆盖是以逻辑覆盖是以程序内部的逻辑结构为程序内部的逻辑结构为基础基础的设计测试用例的技术。它属白的设计测试用例的技术。它属白盒测试。盒测试。(A1)and(B=0

54、)(A=2)or(X1)X=X/AX=X+1T TT TF FF FabdceL1(ace)=(A1)and(B=0)and(A=2)or(X/A1)=(A1)and(B=0)and(A=2)or(A1)and(B=0)and(X/A1)=(A=2)and(B=0)or(A1)and(B=0)and(X/A1) L2(abd)=not(A1)and(B=0)andnot(A=2)or(X1)=not(A1)ornot(B=0)andnot(A=2)andnot(X1)=not(A1)andnot(A=2)andnot(X1)ornot(B=0)andnot(A=2)andnot(X1)L3(a

55、be)=not(A1)and(B=0)and(A=2)or(X1)=not(A1)ornot(B=0)and(A=2)or(X1)=not(A1)and(A=2)ornot(A1)and(X1)ornot(B=0)and(A=2)ornot(B=0)and(X1)L4(acd)=(A1)and(B=0)andnot(A=2)or(X/A1)=(A1)and(B=0)andnot(A=2)andnot(X/A1)语句覆盖语句覆盖语句覆盖语句覆盖n n语句覆盖就是设计若干个测试用例,运行被测语句覆盖就是设计若干个测试用例,运行被测程序,使得程序,使得每一可执行语句至少执行一次每一可执行语句至少执行

56、一次。n n这这种种覆覆盖盖又又称称为为点点覆覆盖盖,它它使使得得程程序序中中每每个个可可执执行行语语句句都都得得到到执执行行,但但它它是是最最弱弱的的逻逻辑辑覆覆盖盖准,效果有限,必须与其它方法交互使用。准,效果有限,必须与其它方法交互使用。n n在图例中,正好所有的可执行语句都在在图例中,正好所有的可执行语句都在路径路径L1L1上,所以选择上,所以选择路径路径 L1L1设计测试用例,就可以设计测试用例,就可以覆盖所有的可执行语句。覆盖所有的可执行语句。n n测试用例的设计格式如下【输入的(A, B, X),输出的(A, B, X)】n n为图例设计满足语句覆盖的测试用例是:【(2, 0,

57、4),(2, 0, 3)】 覆盖 ace【L1】(A=2)and(B=0)or(A1)and(B=0)and(X/A1) 判定覆盖判定覆盖判定覆盖判定覆盖n n判定覆盖就是设计若干个测试用例,运行被判定覆盖就是设计若干个测试用例,运行被测程序,使得测程序,使得程序中每个判断的取真分支和程序中每个判断的取真分支和取假分支取假分支至少至少经历一次经历一次。n n判定覆盖又称为判定覆盖又称为分支覆盖分支覆盖。n n判定覆盖只比语句覆盖稍强一些,但实际效判定覆盖只比语句覆盖稍强一些,但实际效果表明,只是判定覆盖,还不能保证一定能果表明,只是判定覆盖,还不能保证一定能查出在判断的条件中存在的错误。因此,

58、还查出在判断的条件中存在的错误。因此,还需要更强的逻辑覆盖准则去检验判断内部条需要更强的逻辑覆盖准则去检验判断内部条件。件。 n n对于图例,如果选择对于图例,如果选择路径路径L1L1和和L2L2,就可得,就可得满足要求的测试用例满足要求的测试用例: :n n【(2, 0, 4),(2, 0, 3)】覆盖 ace【L1】【(1, 1, 1),(1, 1, 1)】覆盖 abd【L2】(A=2)and(B=0)or(A1)and(B=0)and(X/A1) not(A1)andnot(A=2)andnot(X1)ornot(B=0)andnot(A=2)andnot(X1)n n如果选择路径L3和

59、L4,还可得另一组可用的测试用例:【(2, 1, 1),(2, 1, 2)】覆盖 abe【L3】【(3, 0, 3),(3, 1, 1)】覆盖 acd【L4】not(A1)and(X1)ornot(B=0)and(A=2)ornot(B=0)and(X1)(A1)and(B=0)andnot(A=2)andnot(X/A1)条件覆盖条件覆盖条件覆盖条件覆盖n n条件覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的每个条件的可能取值至少执行一次。n n条件覆盖深入到判定中的每个条件,但可能不能满足判定覆盖的要求。 n n在图例中,我们事先可对所有条件的取值加以标记。例如,n n对于

60、第一个判断:u u 条件 A1 取真为 ,取假为 条件 B0 取真为 ,取假为n n对于第二个判断:u u 条件A2 取真为 ,取假为 条件X1 取真为 ,取假为 测试用例 覆盖分支 条件取值【(2, 0, 4),(2, 0, 3)】 L1(c, e) 【(1, 0, 1),(1, 0, 1)】 L2(b, d) 【(2, 1, 1),(2, 1, 2)】 L3(b, e)或 测 试 用 例覆盖分支 条件取值【(1, 0, 3),(1, 0, 4)】 L3(b, e) 【(2, 1, 1),(2, 1, 2)】 L3(b, e) 判定条件覆盖判定条件覆盖判定条件覆盖判定条件覆盖n n判定条件覆

61、盖就是设计足够的测试用例,使得判定条件覆盖就是设计足够的测试用例,使得判断中每个条件的所有可能取值至少执行一次判断中每个条件的所有可能取值至少执行一次,每个判断中的每个条件的可能取值至少执行一次每个判断中的每个条件的可能取值至少执行一次。换言之,即是要求各个判断的所有可能的条件取换言之,即是要求各个判断的所有可能的条件取值组合至少执行一次。值组合至少执行一次。 n n判定条件覆盖有缺陷。从表面上来看,它测试判定条件覆盖有缺陷。从表面上来看,它测试了所有条件的取值。但是事实并非如此。往往某了所有条件的取值。但是事实并非如此。往往某些条件掩盖了另一些条件。会遗漏某些条件取值些条件掩盖了另一些条件。

62、会遗漏某些条件取值错误的情况。为彻底地检查所有条件的取值,需错误的情况。为彻底地检查所有条件的取值,需要将判定语句中给出的复合条件表达式进行分解,要将判定语句中给出的复合条件表达式进行分解,形成由多个基本判定嵌套的流程图。这样就可以形成由多个基本判定嵌套的流程图。这样就可以有效地检查所有的条件是否正确了。有效地检查所有的条件是否正确了。 测 试 用 例覆盖分支 条件取值【(2, 0, 4),(2, 0, 3)】L1(c, e)【(1, 1, 1),(1, 1, 1)】L2(b, d) (A=2)and(B=0)or(A1)and(B=0)and(X/A1) not(A1)andnot(A=2)

63、andnot(X1)ornot(B=0)andnot(A=2)andnot(X1)andorA1T TB=0T TX=X/AT TF FF FA=2T TF FX1F FX=X+1改为单个条件判定的嵌套结构改为单个条件判定的嵌套结构条件组合覆盖条件组合覆盖条件组合覆盖条件组合覆盖n n条件组合覆盖就是设计足够的测试用例,运行被测程序,使条件组合覆盖就是设计足够的测试用例,运行被测程序,使得得每个判断的所有可能的条件取值组合至少执行一次每个判断的所有可能的条件取值组合至少执行一次。n n这是一种相当强的覆盖准则,可以有效地检查各种可能的条这是一种相当强的覆盖准则,可以有效地检查各种可能的条件取值

64、的组合是否正确。它不但可覆盖所有条件的可能取值件取值的组合是否正确。它不但可覆盖所有条件的可能取值的组合,还可覆盖所有判断的可取分支,但可能有的路径会的组合,还可覆盖所有判断的可取分支,但可能有的路径会遗漏掉。测试还不完全。遗漏掉。测试还不完全。 记记 A A1, B1, B0 0 作作 A A1, B0 1, B0 作作 A A 1, B1, B0 0 作作 A A 1, B0 1, B0 作作 A2, X1 作 A2, X1 作 A2, X1 作 A2, X1 作 测 试 用 例 覆盖条件 覆盖组合【(2, 0, 4), (2, 0, 3)】(L1) , , 【(2, 1, 1), (2,

65、 1, 2)】(L3) , , 【(1, 0, 3), (1, 0, 4)】(L3) , , 【(1, 1, 1), (1, 1, 1)】(L2) , , L4L4被漏掉了!被漏掉了!路径测试路径测试路径测试路径测试n n路径测试就是设计足够的测试用例,路径测试就是设计足够的测试用例,覆盖程序覆盖程序中所有可能的路径中所有可能的路径。n n这是最强的覆盖准则。但在路径数目很大时,这是最强的覆盖准则。但在路径数目很大时,真正做到完全覆盖是很困难的,必须把覆盖路真正做到完全覆盖是很困难的,必须把覆盖路径数目压缩到一定限度。径数目压缩到一定限度。 测测 试试 用用 例例 通过路径通过路径 覆盖条件覆

66、盖条件【(2, 0, 4), (2, 0, 3)(2, 0, 4), (2, 0, 3)】 ace (L1)ace (L1) 【(1, 1, 1), (1, 1, 1)(1, 1, 1), (1, 1, 1)】 abdabd (L2)(L2) 【(1, 1, 2), (1, 1, 3)(1, 1, 2), (1, 1, 3)】 abeabe (L3)(L3) 【(3, 0, 3), (3, 0, 1)(3, 0, 3), (3, 0, 1)】 acdacd (L4)(L4) 条条条条件件件件测测测测试试试试路路路路径径径径选选选选择择择择n n当程序中判定多于一个时,形成的分支结构可以分为两类

67、:嵌套型分支结构和连锁型分支结构。n n对于嵌套型分支结构,若有n个判定语句,需要n+1个测试用例;n n对于连锁型分支结构, 若有n个判定语句,需要有2n个测试用例,覆盖它的2n条路径。条条条条件件件件测测测测试试试试路路路路径径径径选选选选择择择择n n为为减减少少测测试试用用例例的的数数目目,可可采采用用试试验验设设计计法法,抽抽取取部部分分路路径径进进行行测测试试。由由于于抽抽样样服服从从均均匀匀分分布布,因因此此,在在假假定定各各条条路路径径的的重重要要性性相相同同,或或暂暂不不明明确确各各条条路路径径的的重重要要性性的的情情况况下下可可以以做做到到均均匀匀抽抽样样。如如果果明明确确

68、了了各各条条路路径径的的重重要要性性,还还可可以以采采取取加加权权的的办办法法,筛筛选选掉掉部部分分路路径径,再再用用如下的措施进行抽样。具体步骤如下:如下的措施进行抽样。具体步骤如下:u u )设设连连锁锁型型分分支支结结构构中中有有n n个个判判定定,计计算算满满足足关系式关系式 n n+12+12m m 的最小自然数的最小自然数m m;u u )设设t t = = 2 2m m,取取正正交交表表LtLt,并并利利用用它它设设计计测测试试数据。数据。条条条条件件件件测测测测试试试试路路路路径径径径选选选选择择择择n n例如,一个连锁型分支结构中有三个判定语句例如,一个连锁型分支结构中有三个

69、判定语句P1P1,P2P2,P3P3。它全部路径是。它全部路径是2 23 38 8 条。先计算条。先计算3+123+12m m = t= t的的t t,得,得t = 4t = 4。取正交表。取正交表L4L4,如图,如图 所所示示n n把每一列当做一个判定,每一行当做可取的测把每一列当做一个判定,每一行当做可取的测试用例,则正交表试用例,则正交表L4L4最多可取三个判定,分别最多可取三个判定,分别代之以代之以P1P1,P2P2,P3P3。判定。判定P1P1,P2P2,P3P3的取假分的取假分支和取真分支分别记作支和取真分支分别记作S1S1、S2S2;S3S3、S4S4;S5S5、S6S6,用各个

70、判定的取假分支取代正交表,用各个判定的取假分支取代正交表L4L4中的中的“ “0”0”,用取真分支取代正交表中的,用取真分支取代正交表中的“ “1”1”,就,就建立起一个测试路径矩阵,如图建立起一个测试路径矩阵,如图 所示。所示。n n测试路径数目从测试路径数目从2 23 38 8条减少到条减少到3 31 14 4条。条。 条条条条件件件件测测测测试试试试路路路路径径径径选选选选择择择择正交表正交表L4路径抽样矩阵路径抽样矩阵条条条条件件件件测测测测试试试试的的的的策策策策略略略略n n程序中的条件分为简单条件和复合条件。程序中的条件分为简单条件和复合条件。u u简单条件是一个布尔变量或一个关

71、系表达式(可加前缀简单条件是一个布尔变量或一个关系表达式(可加前缀NOTNOT)u u复复合合条条件件由由简简单单条条件件通通过过逻逻辑辑运运算算符符(ANDAND、OROR、NOTNOT)和和括号连接而成。如果条件出错,至少是条件中某一成分有错。括号连接而成。如果条件出错,至少是条件中某一成分有错。u u条条件件中中可可能能的的出出错错类类型型有有:布布尔尔运运算算符符错错、布布尔尔变变量量错错、布布尔尔括号错、关系运算符错、算术表达式错。括号错、关系运算符错、算术表达式错。n n如如果果在在一一个个判判定定的的复复合合条条件件表表达达式式中中每每个个布布尔尔变变量量和和关关系系运运算算符符

72、最最多多只只出出现现一一次次,而而且且没没有有公公共共变变量量,应应用用一一种种称称之之为为BROBRO(分分支支与与关关系系运运算算符符)的的测测试试法法可可以以发发现现多多个个布布尔尔运运算算符或关系运算符错,以及其它错误。符或关系运算符错,以及其它错误。条条条条件件件件测测测测试试试试的的的的策策策策略略略略n nBROBRO策策略略引引入入条条件件约约束束的的概概念念。设设有有n n个个简简单单条条件件的的复复合合条条件件C C,其其条条件件约约束束为为D D = =(D D1 1, , D D2 2, , , , D Dn n),其其中中D Di i(1in1in)是是条条件件C C

73、中中第第i i个个简简单单条条件件的的输输出出约约束束。如如果果在在C C的的执执行行过过程程中中,其其每每个个简简单单条条件件的的输输出出都都满满足足D D中中对对应应的的约约束束,则则称称条条件件C C的的条条件件约约束束D D由由C C的的执执行行所所覆覆盖盖。特特别别地地,布布尔尔变变量量或或布布尔尔表表达达式式的的输输出出约约束束必必须须是是真真(t t)或或假假(f f);关关系系表表达达式的输出约束为符号式的输出约束为符号 、= =、 。n n设设条条件件为为 C C1 1 : : B B1 1 & & B B2 2,其其中中B B1 1、B B2 2是是布布尔尔变变量量,C C

74、1 1的的输输出出约约束束为为(D D1 1, , D D2 2),在在此此,D D1 1和和D D2 2或或为为t t或或为为f f。则(则(t, ft, f)是)是C C1 1可能的一个约束。可能的一个约束。n n覆盖此约束的测试(一次运行)将令覆盖此约束的测试(一次运行)将令B B1 1为为t t,B B2 2为为f f。条条条条件件件件测测测测试试试试的的的的策策策策略略略略n nBROBRO策策略略要要求求对对C C1 1的的可可能能约约束束集集合合 ( ( t, t, t t ), ), ( ( f, f, t t ), ), ( ( t, t, f f ) ) 中中的的每每一一个

75、个,分分别别设设计计一一组组测测试试用用例例。如如果果布布尔尔运运算算符符有有错错,这三组测试用例的运行结果必有一组导致这三组测试用例的运行结果必有一组导致C C1 1失败。失败。n n设设条条件件为为C C2 2 : : B B1 1 & & ( ( E E3 3 = = E E4 4 ) ),其其中中B B1 1是是布布尔尔表表达达式式,E E3 3和和E E4 4是是算算术术表表达达式式,C C2 2 的的输输出出约约束束为为(D D1 1, , D D2 2),在在此此,D D1 1或或为为t t或或为为f f;D D2 2则则是是 。因因此此,只只有有D D2 2与与C C1 1中中

76、D D2 2的的不不同同,可可以以修修改改C C1 1的的约约束束集集合合 ( ( t, t, t t ), ), ( ( f, f, t t ), ), ( ( t, t, f f ) ) ,导导出出C C2 2的的约约束束集集合合。因因为为在在 ( ( E E3 3 = = E E4 4 ) ) 中中,t t 相相当当于于 =,f f 相相当当于于 ,则则C C2 2的的约约束束集集合合为为 ( ( t, t, = = ), ), ( ( f, f, = = ), ), ( ( t, t, ) ) 。据据此此设设计计4 4组组测测试试用用例例,检检查查C2C2中中可可能能的的布布尔尔或或关

77、关系系运运算算符中的错误。符中的错误。条条条条件件件件测测测测试试试试的的的的策策策策略略略略n n设设条条件件为为C C3 3 : : ( ( E E1 1 E E2 2 ) ) & & ( ( E E3 3 = = E E4 4 ) ),其其中中E E1 1、E E2 2、E E3 3、E E4 4都都是是算算术术表表达达式式,C C3 3的的输输出出约约束束为为(D D1 1, , D D2 2),在此,在此,D D1 1和和D D2 2的约束均为的约束均为 。n nC C3 3 中中只只有有D D1 1与与C C2 2中中的的D D1 1不不同同,可可以以修修改改C C2 2的的约约束

78、束集集合合 ( ( t, t, = = ), ), ( ( f, f, = = ), ), ( ( t, t, ) ) ,导导出出C C3 3的的约约束束集集合合。因因为为在在 ( ( E E1 1 E E2 2 ) ) 中中,t t 相相当当于于 ,f f 相相当当于于 , , = = ), ), ( ( , , , , , ) ) 。根根据据这这个个约约束束集集合合设设计计测测试用例,就能够检测试用例,就能够检测C C3 3中的关系运算符中的错误。中的关系运算符中的错误。循环测试路径选择循环测试路径选择循环测试路径选择循环测试路径选择n n循环分为4种不同类型:u u简单循环u u连锁循环

79、u u嵌套循环u u非结构循环。 (1)(1)简单循环简单循环简单循环简单循环n n对于简单循环,测试应包括以下几种。其中对于简单循环,测试应包括以下几种。其中的的 n n 表示循环允许的最大次数。表示循环允许的最大次数。 u u 零次循环零次循环:从循环入口到出口:从循环入口到出口u u 一次循环一次循环:查找循环初始值方面的错误查找循环初始值方面的错误 u u 二次循环二次循环:检查在多次循环时才能暴露的检查在多次循环时才能暴露的错误。错误。u u m m次循环:次循环:此时的此时的m mn n,也是检查在多次,也是检查在多次循环时才能暴露的错误。循环时才能暴露的错误。u u 最大次数循环

80、、比最大次数多一次、少一最大次数循环、比最大次数多一次、少一次的循环。次的循环。例:求最小值例:求最小值例:求最小值例:求最小值k = i;for ( j = i+1; j = n; j+ ) if ( Aj Ak ) k = j; k=i ;j=i+1;j=n?Aj帐户余额帐户余额在步骤在步骤2处重新处重新加入基本流加入基本流TCy场景场景4步骤步骤2-提款金额提款金额帐户余额帐户余额不执行备选流不执行备选流3,执行基本流,执行基本流TCz场景场景4步骤步骤2-提款金额提款金额=帐户余额帐户余额不执行备选流不执行备选流3,执行基本流,执行基本流注:由于没有提供其他信息,以上显示的测试用例都非

81、常简单。注:由于没有提供其他信息,以上显示的测试用例都非常简单。测试用例很少如此简单。测试用例很少如此简单。一个由用例生成测试用例的更符合实际情况的一个由用例生成测试用例的更符合实际情况的示例示例上图中提款用例的基本流和某些备用流:上图中提款用例的基本流和某些备用流:基基本本流流本用例的开端是本用例的开端是ATM处于准备就绪状态。处于准备就绪状态。1.准备提款准备提款-客户将银行卡插入客户将银行卡插入ATM机的读卡机。机的读卡机。2.验证银行卡验证银行卡-ATM机从银行卡的磁条中读取帐户代码,并检查它是否属机从银行卡的磁条中读取帐户代码,并检查它是否属于可以接收的银行卡。于可以接收的银行卡。3

82、.输入输入PIN-ATM要求客户输入要求客户输入PIN码(码(4位)位)4.验证帐户代码和验证帐户代码和PIN-验证帐户代码和验证帐户代码和PIN以确定该帐户是否有效以及以确定该帐户是否有效以及所输入的所输入的PIN对该帐户来说是否正确。对于此事件流,帐户是有效的而对该帐户来说是否正确。对于此事件流,帐户是有效的而且且PIN对此帐户来说正确无误。对此帐户来说正确无误。5.ATM选项选项-ATM显示在本机上可用的各种选项。显示在本机上可用的各种选项。在此事件流中,银行在此事件流中,银行客户通常选择客户通常选择“提款提款”。6.输入金额输入金额-要从要从ATM中提取的金额。对于此事件流,客户需选择

83、预设中提取的金额。对于此事件流,客户需选择预设的金额(的金额(10美元、美元、20美元、美元、50美元或美元或100美元)。美元)。7.授权授权-ATM通过将卡通过将卡ID、PIN、金额以及帐户信息作为一笔交易发送给、金额以及帐户信息作为一笔交易发送给银行系统来启动验证过程。银行系统来启动验证过程。对于此事件流,银行系统处于联机状态,对于此事件流,银行系统处于联机状态,而且对授权请求给予答复,批准完成提款过程,并且据此更新帐户余额。而且对授权请求给予答复,批准完成提款过程,并且据此更新帐户余额。8.出钞出钞-提供现金。提供现金。9.返回银行卡返回银行卡-银行卡被返还。银行卡被返还。10.收据收

84、据-打印收据并提供给客户。打印收据并提供给客户。ATM还相应地更新内部记录。还相应地更新内部记录。用例结束时用例结束时ATM又回到准备就绪状态。又回到准备就绪状态。上图中提款用例的基本流和某些备用流:上图中提款用例的基本流和某些备用流:备选流备选流1-银行卡无效银行卡无效在基本流步骤在基本流步骤2中中-验证银行卡,如果卡是无效的,则卡被退回,同验证银行卡,如果卡是无效的,则卡被退回,同时会通知相关消息。时会通知相关消息。备选流备选流2-ATM内没有内没有现金现金在基本流步骤在基本流步骤5中中-ATM选项,如果选项,如果ATM内没有现金,则内没有现金,则“提款提款”选项将无法使用。选项将无法使用

85、。备选流备选流3-ATM内现金内现金不足不足在基本流步骤在基本流步骤6中中-输入金额,如果输入金额,如果ATM机内金额少于请求提取的金机内金额少于请求提取的金额,则将显示一则适当的消息,并且在步骤额,则将显示一则适当的消息,并且在步骤6-输入金额处重新加输入金额处重新加入基本流。入基本流。备选流备选流4-PIN有误有误在基本流步骤在基本流步骤4中中-验证帐户和验证帐户和PIN,客户有三次机会输入,客户有三次机会输入PIN。如果如果PIN输入有误,输入有误,ATM将显示适当的消息;如果还存在输入机会,将显示适当的消息;如果还存在输入机会,则此事件流在步骤则此事件流在步骤3-输入输入PIN处重新加

86、入基本流。处重新加入基本流。如果最后一次尝试输入的如果最后一次尝试输入的PIN码仍然错误,则该卡将被码仍然错误,则该卡将被ATM机保留,机保留,同时同时ATM返回到准备就绪状态,本用例终止。返回到准备就绪状态,本用例终止。备选流备选流5-帐户不存在帐户不存在在基本流步骤在基本流步骤4中中-验证帐户和验证帐户和PIN,如果银行系统返回的代码表明,如果银行系统返回的代码表明找不到该帐户或禁止从该帐户中提款,则找不到该帐户或禁止从该帐户中提款,则ATM显示适当的消息并显示适当的消息并且在步骤且在步骤9-返回银行卡处重新加入基本流。返回银行卡处重新加入基本流。备选流备选流6-帐面金额不帐面金额不足足在

87、基本流步骤在基本流步骤7-授权中,银行系统返回代码表明帐户余额少于在基本授权中,银行系统返回代码表明帐户余额少于在基本流步骤流步骤6-输入金额内输入的金额,则输入金额内输入的金额,则ATM显示适当的消息并且显示适当的消息并且在步骤在步骤6-输入金额处重新加入基本流。输入金额处重新加入基本流。上图中提款用例的基本流和某些备用流:上图中提款用例的基本流和某些备用流:备选流备选流7-达到达到每日最大的提款每日最大的提款金额金额在基本流步骤在基本流步骤7-授权中,银行系统返回的代码表明包括本提款请授权中,银行系统返回的代码表明包括本提款请求在内,客户已经或将超过在求在内,客户已经或将超过在24小时内允

88、许提取的最多金额,小时内允许提取的最多金额,则则ATM显示适当的消息并在步骤显示适当的消息并在步骤6-输入金额上重新加入基输入金额上重新加入基本流。本流。备选流备选流x-记录记录错误错误如果在基本流步骤如果在基本流步骤10-收据中,记录无法更新,则收据中,记录无法更新,则ATM进入进入“安全模式安全模式”,在此模式下所有功能都将暂停使用。同时向银,在此模式下所有功能都将暂停使用。同时向银行系统发送一条适当的警报信息表明行系统发送一条适当的警报信息表明ATM已经暂停工作已经暂停工作.备选流备选流y-退出退出客户可随时决定终止交易(退出)。交易终止,银行卡随之退出。客户可随时决定终止交易(退出)。

89、交易终止,银行卡随之退出。备选流备选流z-“翘起翘起”ATM包含大量的传感器,用以监控各种功能,如电源检测器、不包含大量的传感器,用以监控各种功能,如电源检测器、不同的门和出入口处的测压器以及动作检测器等。同的门和出入口处的测压器以及动作检测器等。在任一时刻,在任一时刻,如果某个传感器被激活,则警报信号将发送给警方而且如果某个传感器被激活,则警报信号将发送给警方而且ATM进入进入“安全模式安全模式”,在此模式下所有功能都暂停使用,直到,在此模式下所有功能都暂停使用,直到采取适当的重启采取适当的重启/重新初始化的措施重新初始化的措施在第一次迭代中,根据迭代计划,我们需要核实提款用例已经正确地实施

90、。此时尚未在第一次迭代中,根据迭代计划,我们需要核实提款用例已经正确地实施。此时尚未实施整个用例,只实施了下面的事件流:实施整个用例,只实施了下面的事件流:u基本流基本流-提取预设金额(提取预设金额(10美元、美元、20美元、美元、50美元、美元、100美元)美元)u备选流备选流2-ATM内没有现金内没有现金u备选流备选流3-ATM内现金不足内现金不足u备选流备选流4-PIN有误有误u备选流备选流5-帐户不存在帐户不存在/帐户类型有误帐户类型有误u备选流备选流6-帐面金额不足帐面金额不足可以从这个用例生成下列场景可以从这个用例生成下列场景场景场景1-成功的提款成功的提款基本流基本流场景场景2-

91、ATM内没有现金内没有现金基本流基本流备选流备选流2场景场景3-ATM内现金不足内现金不足基本流基本流备选流备选流3场景场景4-PIN有误(还有输入机会)有误(还有输入机会)基本流基本流备选流备选流4场景场景5-PIN有误(不再有输入机会)有误(不再有输入机会)基本流基本流备选流备选流4场景场景6-帐户不存在帐户不存在/帐户类型有误帐户类型有误基本流基本流备选流备选流5场景场景7-帐户余额不足帐户余额不足基本流基本流备选流备选流6注:注:注:注: 为方便起见,备选流为方便起见,备选流为方便起见,备选流为方便起见,备选流 3 3和和和和 6 6(场景(场景(场景(场景 3 3和和和和 7 7)内

92、的循环以)内的循环以)内的循环以)内的循环以及循环组合未纳入上表。及循环组合未纳入上表。及循环组合未纳入上表。及循环组合未纳入上表。导出测试用例导出测试用例n对于这对于这7个场景中的每一个场景都需要确定测试用例。可以个场景中的每一个场景都需要确定测试用例。可以采用矩阵或决策表来确定和管理测试用例。下面显示了一种采用矩阵或决策表来确定和管理测试用例。下面显示了一种通用格式,其中各行代表各个测试用例,而各列则代表测试通用格式,其中各行代表各个测试用例,而各列则代表测试用例的信息。用例的信息。本示例中,对于每个测试用例,存在一个测试本示例中,对于每个测试用例,存在一个测试用例用例ID、条件(或说明)

93、、测试用例中涉及的所有数据元素、条件(或说明)、测试用例中涉及的所有数据元素(作为输入或已经存在于数据库中)以及预期结果。(作为输入或已经存在于数据库中)以及预期结果。n通过从确定执行用例场景所需的数据元素入手构建矩阵。然通过从确定执行用例场景所需的数据元素入手构建矩阵。然后,对于每个场景,至少要确定包含执行场景所需的适当条后,对于每个场景,至少要确定包含执行场景所需的适当条件的测试用例。例如,在下面的矩阵中,件的测试用例。例如,在下面的矩阵中,V(有效)用于表明(有效)用于表明这个条件必须是这个条件必须是VALID(有效的)才可执行基本流,而(有效的)才可执行基本流,而I(无(无效)用于表明

94、这种条件下将激活所需备选流。下表中使用的效)用于表明这种条件下将激活所需备选流。下表中使用的“n/a”(不适用)表明这个条件不适用于测试用例。(不适用)表明这个条件不适用于测试用例。测试用例测试用例TCID场景场景/条件条件PIN帐帐号号输入输入/选选择的金额择的金额帐面帐面金额金额ATM内内的金额的金额预期结果预期结果CW1.场景场景1-成功成功的提款的提款VVVVV成功的提款。成功的提款。CW2.场景场景2-ATM内没有现金内没有现金VVVVI提款选项不可提款选项不可用,用例结束用,用例结束CW3.场景场景3-ATM内现金不足内现金不足VVVVI警告消息,返警告消息,返回基本流步骤回基本流

95、步骤6-输入金额输入金额CW4.场景场景4-PIN有误(还有不有误(还有不止一次输入机止一次输入机会)会)IVn/aVV警告消息,返警告消息,返回基本流步骤回基本流步骤4,输入,输入PINCW5.场景场景4-PIN有误(还有一有误(还有一次输入机会)次输入机会)IVn/aVV警告消息,返警告消息,返回基本流步骤回基本流步骤4,输入,输入PINCW6.场景场景4-PIN有误(不再有有误(不再有输入机会)输入机会)IVn/aVV警告消息,卡警告消息,卡予保留,用例予保留,用例结束结束测试用例测试用例n在上面的矩阵中,六个测试用例执行了四个场景。对于基本流,上述测试在上面的矩阵中,六个测试用例执行了

96、四个场景。对于基本流,上述测试用例用例CW1称为正面测试用例。它一直沿着用例的基本流路径执行,未发称为正面测试用例。它一直沿着用例的基本流路径执行,未发生任何偏差。基本流的全面测试必须包括负面测试用例,以确保只有在符生任何偏差。基本流的全面测试必须包括负面测试用例,以确保只有在符合条件的情况下才执行基本流。这些负面测试用例由合条件的情况下才执行基本流。这些负面测试用例由CW2至至6表示(阴表示(阴影单元格表明这种条件下需要执行备选流)。虽然影单元格表明这种条件下需要执行备选流)。虽然CW2至至6对于基本流对于基本流而言都是负面测试用例,但它们相对于备选流而言都是负面测试用例,但它们相对于备选流

97、2至至4而言是正面测试用而言是正面测试用例。而且对于这些备选流中的每一个而言,至少存在一个负面测试用例例。而且对于这些备选流中的每一个而言,至少存在一个负面测试用例(CW1-基本流)。基本流)。n每个场景只具有一个正面测试用例和负面测试用例是不充分的,场景每个场景只具有一个正面测试用例和负面测试用例是不充分的,场景4正正是这样的一个示例。要全面地测试场景是这样的一个示例。要全面地测试场景4-PIN有误,至少需要三个正面有误,至少需要三个正面测试用例(以激活场景测试用例(以激活场景4):):u输入了错误的输入了错误的PIN,但仍存在输入机会,此备选流重新加入基本流中的步骤,但仍存在输入机会,此备

98、选流重新加入基本流中的步骤3-输入输入PIN。u输入了错误的输入了错误的PIN,而且不再有输入机会,则此备选流将保留银行卡并终止,而且不再有输入机会,则此备选流将保留银行卡并终止用例。用例。u最后一次输入时输入了最后一次输入时输入了“正确正确”的的PIN。备选流在步骤备选流在步骤5-输入金额处重新输入金额处重新加入基本流。加入基本流。测试用例测试用例n注:在上面的矩阵中,无需为条件(数据)输入任何实际的注:在上面的矩阵中,无需为条件(数据)输入任何实际的值。以这种方式创建测试用例矩阵的一个优点在于容易看到值。以这种方式创建测试用例矩阵的一个优点在于容易看到测试的是什么条件。由于只需要查看测试的

99、是什么条件。由于只需要查看V和和I(或此处采用的阴(或此处采用的阴影单元格),这种方式还易于判断是否已经确定了充足的测影单元格),这种方式还易于判断是否已经确定了充足的测试用例。从上表中可发现存在几个条件不具备阴影单元格,试用例。从上表中可发现存在几个条件不具备阴影单元格,这表明测试用例还不完全,如场景这表明测试用例还不完全,如场景6-不存在的帐户不存在的帐户/帐户类帐户类型有误和场景型有误和场景7-帐户余额不足就缺少测试用例。帐户余额不足就缺少测试用例。n一旦确定了所有的测试用例,则应对这些用例进行复审和验一旦确定了所有的测试用例,则应对这些用例进行复审和验证以确保其准确且适度,并取消多余或

100、等效的测试用例。证以确保其准确且适度,并取消多余或等效的测试用例。n测试用例一经认可,就可以确定实际数据值(在测试用例实测试用例一经认可,就可以确定实际数据值(在测试用例实施矩阵中)并且设定测试数据。施矩阵中)并且设定测试数据。测试数据测试数据TCID场景场景/条件条件PIN帐帐号号输入输入/选选择的金额择的金额帐面帐面金额金额ATM内内的金额的金额预期结果预期结果CW1.场景场景1-成功成功的提款的提款4987123505002000成功的提款。成功的提款。CW2.场景场景2-ATM内没有现金内没有现金49871231005000提款选项不可提款选项不可用,用例结束用,用例结束CW3.场景场

101、景3-ATM内现金不足内现金不足498712310050070警告消息,返警告消息,返回基本流步骤回基本流步骤6-输入金额输入金额CW4.场景场景4-PIN有误(还有不有误(还有不止一次输入机止一次输入机会)会)4978123n/a5002000警告消息,返警告消息,返回基本流步骤回基本流步骤4,输入,输入PINCW5.场景场景4-PIN有误(还有一有误(还有一次输入机会)次输入机会)4978123n/a5002000警告消息,返警告消息,返回基本流步骤回基本流步骤4,输入,输入PINCW6.场景场景4-PIN有误(不再有有误(不再有输入机会)输入机会)4978123n/a5002000警告消

102、息,卡警告消息,卡予保留,用例予保留,用例结束结束测试用例测试用例n以上测试用例只是在本次迭代中需要用来验证提款用例的一部分测试用例。需要以上测试用例只是在本次迭代中需要用来验证提款用例的一部分测试用例。需要的其他测试用例包括:的其他测试用例包括:u场景场景6-帐户不存在帐户不存在/帐户类型有误:未找到帐户或帐户不可用帐户类型有误:未找到帐户或帐户不可用u场景场景6-帐户不存在帐户不存在/帐户类型有误:禁止从该帐户中提款帐户类型有误:禁止从该帐户中提款u场景场景7-帐户余额不足:请求的金额超出帐面金额帐户余额不足:请求的金额超出帐面金额n在将来的迭代中,当实施其他事件流时,在下列情况下将需要测

103、试用例:在将来的迭代中,当实施其他事件流时,在下列情况下将需要测试用例:u无效卡(所持卡为挂失卡、被盗卡、非承兑银行发卡、磁条损坏等)无效卡(所持卡为挂失卡、被盗卡、非承兑银行发卡、磁条损坏等)u无法读卡(读卡机堵塞、脱机或出现故障)无法读卡(读卡机堵塞、脱机或出现故障)u帐户已消户、冻结或由于其他方面原因而无法使用帐户已消户、冻结或由于其他方面原因而无法使用uATM内的现金不足或不能提供所请求的金额(与内的现金不足或不能提供所请求的金额(与CW3不同,在不同,在CW3中只是一种币值中只是一种币值不足,而不是所有币值都不足)不足,而不是所有币值都不足)u无法联系银行系统以获得认可无法联系银行系

104、统以获得认可u银行网络离线或交易过程中断电银行网络离线或交易过程中断电n在确定功能性测试用例时,确保满足下列条件:在确定功能性测试用例时,确保满足下列条件:u已经为每个用例场景确定了充足的正面和负面测试用例。已经为每个用例场景确定了充足的正面和负面测试用例。u测试用例可以处理用例所实施的所有业务规则,确保对于业务规则,无论是在内部、外测试用例可以处理用例所实施的所有业务规则,确保对于业务规则,无论是在内部、外部还是在边界条件部还是在边界条件/值上都存在测试用例。值上都存在测试用例。u测试用例可以处理所有事件或动作排序(如在设计模型的序列图中确定的内容),还应测试用例可以处理所有事件或动作排序(

105、如在设计模型的序列图中确定的内容),还应能处理用户界面对象状态或条件。能处理用户界面对象状态或条件。u测试用例可以处理为用例所指定的任何特殊需求,如最佳测试用例可以处理为用例所指定的任何特殊需求,如最佳/最差性能,有时这些特殊需最差性能,有时这些特殊需求会与用例执行过程中的最小求会与用例执行过程中的最小/最大负载或数据容量组合在一起。最大负载或数据容量组合在一起。从补充规约中生成测试用例从补充规约中生成测试用例n并不是所有的测试目标需求都将在用例中有所反映。并不是所有的测试目标需求都将在用例中有所反映。非功能性需求(如性能、安全性和访问控制)以及非功能性需求(如性能、安全性和访问控制)以及配置

106、要求等将会说明测试目标的其他行为或特征。配置要求等将会说明测试目标的其他行为或特征。补充规约是为其他行为生成测试用例的主要来源。补充规约是为其他行为生成测试用例的主要来源。n关于如何生成这些其他测试用例的指南说明如下:关于如何生成这些其他测试用例的指南说明如下:u为性能测试生成测试用例为性能测试生成测试用例u为安全性测试为安全性测试/访问控制测试生成测试用例访问控制测试生成测试用例u为配置测试生成测试用例为配置测试生成测试用例u为安装测试生成测试用例为安装测试生成测试用例u为其他非功能性测试生成测试用例为其他非功能性测试生成测试用例为性能测试生成测试用例为性能测试生成测试用例n性能测试用例的主

107、要输入是补充规约,补充规约中包含了非功能性需求性能测试用例的主要输入是补充规约,补充规约中包含了非功能性需求(请参见工件:补充规约)。为性能测试生成测试用例时,请使用下列指(请参见工件:补充规约)。为性能测试生成测试用例时,请使用下列指南:南:u对于补充规约内阐明性能标准的各条说明都应确保至少要确定一个测试用例。对于补充规约内阐明性能标准的各条说明都应确保至少要确定一个测试用例。性能标准通常表示为时间性能标准通常表示为时间/事务、事务量事务、事务量/用户或百分数的形式。用户或百分数的形式。u对每个关键用例,都应确保至少要确定一个测试用例。关键用例是在上述说对每个关键用例,都应确保至少要确定一个

108、测试用例。关键用例是在上述说明中和明中和/或在工作量分析文档中确定的、必须采用性能评测方法来评估的用例或在工作量分析文档中确定的、必须采用性能评测方法来评估的用例(请参见工作量分析文档)。(请参见工作量分析文档)。n与功能性测试的测试用例类似,通常对于每个用例与功能性测试的测试用例类似,通常对于每个用例/需求都会存在不止一需求都会存在不止一个测试用例。常见的情况是:存在一个低于性能阈值的测试用例、一个处个测试用例。常见的情况是:存在一个低于性能阈值的测试用例、一个处于阈值上的测试用例,还有一个测试用例高于阈值。于阈值上的测试用例,还有一个测试用例高于阈值。n除了以上性能标准以外,确保已确定影响

109、响应时间的特定条件,包括:除了以上性能标准以外,确保已确定影响响应时间的特定条件,包括:u数据库的大小数据库的大小-存在多少个记录?存在多少个记录?u工作量工作量-同时执行操作的最终用户的数量和类型,以及要同时执行的事务的数同时执行操作的最终用户的数量和类型,以及要同时执行的事务的数量和类型量和类型u环境特征(硬件、网件以及软件配置)环境特征(硬件、网件以及软件配置)u将用于性能测试的测试用例记录在类似于功能测试所使用的矩阵中。将用于性能测试的测试用例记录在类似于功能测试所使用的矩阵中。n以下是各种性能测试的一些示例:以下是各种性能测试的一些示例:负载测试负载测试TCID号号 工作量工作量条件

110、条件预期结果预期结果PCW1. 1(单个(单个ATM)完成提款交易完成提款交易 全部交易(不依赖全部交易(不依赖于主角的时间)在于主角的时间)在20秒之内完成秒之内完成PCW2. 2(1,000个同时个同时运行的运行的ATM)完成提款交易完成提款交易 全部交易(不依赖全部交易(不依赖于主角的时间)在于主角的时间)在30秒之内完成秒之内完成PCW3.3(10,000个同个同时运行的时运行的ATM)完成提款交易完成提款交易 全部交易(不依赖全部交易(不依赖于主角的时间)在于主角的时间)在50秒之内完成秒之内完成强度测试强度测试TCID号号 工作量工作量条件条件预期结果预期结果SCW1.2(1,00

111、0个同时个同时运行的运行的ATM)数据库锁定数据库锁定-2个个ATM请请求同一帐户求同一帐户ATM请求排成队列请求排成队列SCW2.2(1,000个同时个同时运行的运行的ATM)无法实现银行无法实现银行系统的通信系统的通信交易排成队列或超交易排成队列或超时时SCW3.2(1,000个同时个同时运行的运行的ATM)在交易过程中,在交易过程中,银行系统通信银行系统通信被终止被终止显示警告消息显示警告消息为安全性为安全性/访问控制测试生成测试用例访问控制测试生成测试用例n主角和用例一同说明系统外部用户与系统所执行的动作之间主角和用例一同说明系统外部用户与系统所执行的动作之间的交互,以便为特定主角生成

112、测试结果。复杂系统包含许多的交互,以便为特定主角生成测试结果。复杂系统包含许多主角,所以我们编制测试用例时必须确保只有指定执行用例主角,所以我们编制测试用例时必须确保只有指定执行用例的主角可以进行此操作,这一点非常关键。在基于主角类型的主角可以进行此操作,这一点非常关键。在基于主角类型的用例事件流存在差别时,尤其如此。的用例事件流存在差别时,尤其如此。n例如,在例如,在ATM用例中,如果主角用例中,如果主角“银行客户银行客户”的卡和帐户有的卡和帐户有的属于拥有这个的属于拥有这个ATM机的银行,有的是竞争银行的银行卡机的银行,有的是竞争银行的银行卡(和帐户),或是企图使用该(和帐户),或是企图使

113、用该ATM不支持的银行卡,则将对不支持的银行卡,则将对该主角该主角“银行客户银行客户”执行不同的用例事件流。执行不同的用例事件流。n对于功能性测试用例,请同样遵循上面列举的指南。对于功能性测试用例,请同样遵循上面列举的指南。安全性和访问控制测试用例的示例安全性和访问控制测试用例的示例TCID条件条件卡卡(V表明表明卡有效)卡有效)读卡机读卡机(V表明读卡表明读卡机工作正机工作正常)常)银行的银行的网络网络预期结果预期结果ACW1.在银行网在银行网络之内络之内VVV所有用例都可所有用例都可用用ACW2.银行网络银行网络之外之外VVI只有提款用例只有提款用例可用可用ACW3.无法读卡无法读卡IVV

114、警告消息,卡警告消息,卡被退出被退出ACW4.因被盗,因被盗,卡已挂失卡已挂失IVV警告消息,卡警告消息,卡予保留予保留ACW5.卡已过期卡已过期IVV警告消息,卡警告消息,卡予保留予保留为配置测试生成测试用例为配置测试生成测试用例n在典型的分布式系统中,允许存在许多种受支持的硬件和软件组合。为了在典型的分布式系统中,允许存在许多种受支持的硬件和软件组合。为了核实测试目标在不同的配置情况下(如不同的操作系统、浏览器或核实测试目标在不同的配置情况下(如不同的操作系统、浏览器或CPU的速度)能否正常工作或执行,应该对此进行测试。此外,测试还应涵盖的速度)能否正常工作或执行,应该对此进行测试。此外,

115、测试还应涵盖构件的组合,以便检测在不同构件的交互中产生的缺陷。例如,确保由应构件的组合,以便检测在不同构件的交互中产生的缺陷。例如,确保由应用程序安装的用程序安装的DDL版本不会与另一个应用程序需要的相同版本不会与另一个应用程序需要的相同DDL的版本的版本发生冲突。发生冲突。n采用下列指南来生成用于配置测试的测试用例:采用下列指南来生成用于配置测试的测试用例:u确保对每个关键配置,应至少存在一个测试用例可用于对其进行确定。这是确保对每个关键配置,应至少存在一个测试用例可用于对其进行确定。这是通过确定测试目标的环境所要求的硬件和软件配置以及确定这些配置的优先通过确定测试目标的环境所要求的硬件和软

116、件配置以及确定这些配置的优先级来完成的。应确保最先测试最常见的配置,包括:级来完成的。应确保最先测试最常见的配置,包括:F打印机支持打印机支持F网络连接网络连接-局域网和广域网局域网和广域网F服务器配置服务器配置-服务器驱动程序、服务器硬件服务器驱动程序、服务器硬件F台式机和台式机和/或服务器上安装的其他软件或服务器上安装的其他软件F所有已安装软件的软件版本所有已安装软件的软件版本u确保对于每个可能有问题的配置至少存在一个测试用例。这些配置可能包括:确保对于每个可能有问题的配置至少存在一个测试用例。这些配置可能包括:F具有最低性能的硬件。具有最低性能的硬件。F历史上存在兼容性问题的共驻内存的软

117、件。历史上存在兼容性问题的共驻内存的软件。F通过最慢的通过最慢的LAN/WAN连接访问服务器的客户机。连接访问服务器的客户机。F资源不足(缓慢的资源不足(缓慢的CPU速度、最小的内存或分辨率,磁盘空间不足等等)速度、最小的内存或分辨率,磁盘空间不足等等)为安装测试生成测试用例为安装测试生成测试用例n安装测试需要核实测试目标可以在所有可能的安装情况下安安装测试需要核实测试目标可以在所有可能的安装情况下安装。安装情况可以指首次安装测试目标,或是在装有较早版装。安装情况可以指首次安装测试目标,或是在装有较早版本的机器上安装测试目标的某个较新的版本或工作版本。安本的机器上安装测试目标的某个较新的版本或

118、工作版本。安装测试还应确保在遇到异常情况时(如磁盘空间不足),测装测试还应确保在遇到异常情况时(如磁盘空间不足),测试目标的执行情况仍可接受。试目标的执行情况仍可接受。n测试用例应包含以下各种软件的安装情况:测试用例应包含以下各种软件的安装情况:u分发介质,例如磁盘、分发介质,例如磁盘、CD-ROM或文件服务器。或文件服务器。u首次安装。首次安装。u完全安装。完全安装。u自定义安装。自定义安装。u升级安装。升级安装。n客户机服务器软件的安装程序具备一组特定的测试用例。不客户机服务器软件的安装程序具备一组特定的测试用例。不同于基于主机的系统,服务器和客户机上的安装程序是有所同于基于主机的系统,服

119、务器和客户机上的安装程序是有所不同的。因而,安装测试应执行构成测试目标的所有构件的不同的。因而,安装测试应执行构成测试目标的所有构件的安装,包括客户机、中间层以及服务器,这一点至关重要。安装,包括客户机、中间层以及服务器,这一点至关重要。为其他非功能性测试生成测试用例为其他非功能性测试生成测试用例n理论上理论上,应找到所有必需的输入来生成测试用例模型、设计模应找到所有必需的输入来生成测试用例模型、设计模型以及补充规约工件的测试用例。不过,如果此时您需要补型以及补充规约工件的测试用例。不过,如果此时您需要补充已有的输入,那也不足为奇。充已有的输入,那也不足为奇。n示例如下:示例如下:u操作测试(

120、用以检验在某次故障发生后以及在下一次故障发生操作测试(用以检验在某次故障发生后以及在下一次故障发生前前“较长时间较长时间”内软件的运行情况)的测试用例。内软件的运行情况)的测试用例。u对性能瓶颈、系统容量或测试目标的强度承受能力进行调查的对性能瓶颈、系统容量或测试目标的强度承受能力进行调查的测试用例。测试用例。n大多数情况下,您可以通过先前所确定的测试用例生成的某大多数情况下,您可以通过先前所确定的测试用例生成的某些测试用例来构建其变体或聚合体,借此来查找测试用例。些测试用例来构建其变体或聚合体,借此来查找测试用例。为单元白盒测试生成测试用例为单元白盒测试生成测试用例n理论上,应通过代码测试每

121、一条可能的路径。在所有这些非理论上,应通过代码测试每一条可能的路径。在所有这些非常简单的单元内实现这样的目标是不切实际或几乎是不可能常简单的单元内实现这样的目标是不切实际或几乎是不可能的。作为最基本的测试,应将每个决定到决定路径(的。作为最基本的测试,应将每个决定到决定路径(DD路径)路径)测试至少一次,这样可确保将所有语句至少执行一次。决定测试至少一次,这样可确保将所有语句至少执行一次。决定通常是指通常是指if语句,而语句,而DD路径是两个决定之间的路径。路径是两个决定之间的路径。n要达到这种程度的测试覆盖,建议您在选择测试数据时应使要达到这种程度的测试覆盖,建议您在选择测试数据时应使每个决

122、定都可以用每种可能的方法来评估。为达到上述目标,每个决定都可以用每种可能的方法来评估。为达到上述目标,测试用例应确保:测试用例应确保:u每个布尔表达式的求值结果为每个布尔表达式的求值结果为true和和false。例如,表达式例如,表达式(a4)的求值结果为的求值结果为true/false的四种组合的四种组合u每一个无限循环至少要执行零次、一次和一次以上。每一个无限循环至少要执行零次、一次和一次以上。n可使用代码覆盖工具来确定白盒测试未测试到的代码。在进可使用代码覆盖工具来确定白盒测试未测试到的代码。在进行白盒测试的同时应进行可靠性测试。行白盒测试的同时应进行可靠性测试。为单元黑盒测试生成测试用

123、例为单元黑盒测试生成测试用例n黑盒测试的目的是为了在不了解单元将如何实施指黑盒测试的目的是为了在不了解单元将如何实施指定行为的情况下,对指定行为进行验证。黑盒测试定行为的情况下,对指定行为进行验证。黑盒测试侧重并依赖于单元的输入和输出。侧重并依赖于单元的输入和输出。n等价类划分是一种用来减少所需测试数量的技术。等价类划分是一种用来减少所需测试数量的技术。对于每一个操作都应确定参数和对象状态的等价类。对于每一个操作都应确定参数和对象状态的等价类。等价类是一组值的集合,对这组值来说,对象的行等价类是一组值的集合,对这组值来说,对象的行为应类似。例如,一个集合可有三个等价类:空、为应类似。例如,一个

124、集合可有三个等价类:空、若干元素以及满。若干元素以及满。n可使用代码覆盖工具来确定白盒测试未测试到的代可使用代码覆盖工具来确定白盒测试未测试到的代码。在进行黑盒测试的同时应进行可靠性测试。码。在进行黑盒测试的同时应进行可靠性测试。n如何通过选择特定参数的测试数据来确定测试用例。如何通过选择特定参数的测试数据来确定测试用例。基于输入参数的测试用例基于输入参数的测试用例n输入参数是由某个操作使用的参数。对于以下每个输入参数是由某个操作使用的参数。对于以下每个输入条件,都应通过使用每个操作的输入参数来编输入条件,都应通过使用每个操作的输入参数来编制测试用例:制测试用例:u每个等价类的正常值。每个等价

125、类的正常值。u每个等价类的边界值。每个等价类的边界值。u等价类之外的值。等价类之外的值。u非法值。非法值。n请记住要将对象状态视作输入参数。例如:如果在请记住要将对象状态视作输入参数。例如:如果在对集合这个对象测试添加操作,您必须使用集合内对集合这个对象测试添加操作,您必须使用集合内所有等价类的值来测试添加操作。所有等价类的值所有等价类的值来测试添加操作。所有等价类的值指的是:充满元素的集合、有若干元素的集合、以指的是:充满元素的集合、有若干元素的集合、以及空集合。及空集合。基于输出参数的测试用例基于输出参数的测试用例n输出参数是某个操作所改变的参数。某个参数既可以是输入输出参数是某个操作所改

126、变的参数。某个参数既可以是输入参数也可以是输出参数。根据以下每个条件选择输入,以便参数也可以是输出参数。根据以下每个条件选择输入,以便获得输出。获得输出。u每个等价类的正常值。每个等价类的正常值。u每个等价类的边界值。每个等价类的边界值。u等价类之外的值。等价类之外的值。u非法值。非法值。n请记住将对象状态视为输出参数。例如,假设您对某个列表请记住将对象状态视为输出参数。例如,假设您对某个列表测试删除操作,您必须选择输入值以便执行操作之后,列表测试删除操作,您必须选择输入值以便执行操作之后,列表为充满状态、具有若干元素或为空(采用它的所有等价类的为充满状态、具有若干元素或为空(采用它的所有等价

127、类的值进行测试)。值进行测试)。n如果对象受状态控制(根据对象的状态产生不同的反应),如果对象受状态控制(根据对象的状态产生不同的反应),您应利用状态矩阵,如下图所示:您应利用状态矩阵,如下图所示:用于测试的状态矩阵用于测试的状态矩阵,可可以在此矩以在此矩阵的基的基础上上测试激励和状激励和状态的所有的所有组合合为产品验收测试生成测试用例为产品验收测试生成测试用例n产品验收测试是部署软件前的最后测试操作。验收测试的目产品验收测试是部署软件前的最后测试操作。验收测试的目标在于核实软件是否已经准备就绪,而且可以由最终用户按标在于核实软件是否已经准备就绪,而且可以由最终用户按软件设计来执行功能和任务。

128、产品验收测试通常不仅涉及执软件设计来执行功能和任务。产品验收测试通常不仅涉及执行软件以确认其是否准备就绪,还涉及交付给客户的所有产行软件以确认其是否准备就绪,还涉及交付给客户的所有产品工件,如培训、文档和包装。品工件,如培训、文档和包装。n为软件工件生成测试用例是按上文中说明的方式实现的。测为软件工件生成测试用例是按上文中说明的方式实现的。测试用例可与上面确定的测试用例(正式)或某个子集(非正试用例可与上面确定的测试用例(正式)或某个子集(非正式)相同或类似,这取决于产品验收测试的正式程度。不管式)相同或类似,这取决于产品验收测试的正式程度。不管测试用例的深度如何,应该在实施和执行产品测试之前

129、对测测试用例的深度如何,应该在实施和执行产品测试之前对测试用例和产品验收计划达成共识。试用例和产品验收计划达成共识。n对非软件工件的评估将随着被评估工件的不同而相去甚远。对非软件工件的评估将随着被评估工件的不同而相去甚远。请参见每个特定非软件工件的指南以及核对清单,查看这些请参见每个特定非软件工件的指南以及核对清单,查看这些工件的评估内容和评估方式。工件的评估内容和评估方式。为回归测试编制测试用例为回归测试编制测试用例n回归测试比较同一测试目标的两个工作版本或版本,并将差回归测试比较同一测试目标的两个工作版本或版本,并将差异确定为潜在缺陷。据此可假定:新版本应该象早先版本一异确定为潜在缺陷。据

130、此可假定:新版本应该象早先版本一样操作,并确保并未因为版本的变化而带来缺陷。样操作,并确保并未因为版本的变化而带来缺陷。n理想状态下,您可能希望一次迭代内的所有测试用例都能在理想状态下,您可能希望一次迭代内的所有测试用例都能在后续迭代内使用。应遵照下列指导原则来确定、设计并实施后续迭代内使用。应遵照下列指导原则来确定、设计并实施测试用例,这些测试用例可以最大限度地发挥回归测试和复测试用例,这些测试用例可以最大限度地发挥回归测试和复用的价值,同时将维护的成本减至最低:用的价值,同时将维护的成本减至最低:u确保测试用例只确定关键的数据元素(创建确保测试用例只确定关键的数据元素(创建/支持被测试的条

131、件支持被测试的条件所需的数据元素)所需的数据元素)u确保每个测试用例都说明或代表一个唯一的输入集或事件序列,确保每个测试用例都说明或代表一个唯一的输入集或事件序列,其结果是独特的测试目标行为其结果是独特的测试目标行为u消除多余或等效的测试用例消除多余或等效的测试用例u将具有相同的测试目标初始状态和测试数据状态的测试用例组将具有相同的测试目标初始状态和测试数据状态的测试用例组合到一起合到一起测试数据测试数据n在测试设计活动中,需要确定和描述两个重要的工件:测试过程和测试用在测试设计活动中,需要确定和描述两个重要的工件:测试过程和测试用例。如果没有测试数据,这两个工件将无法实施和执行。它们只是对条

132、件、例。如果没有测试数据,这两个工件将无法实施和执行。它们只是对条件、场景和路径的一些说明,而没有具体的值用来简明地确定它们。测试数据场景和路径的一些说明,而没有具体的值用来简明地确定它们。测试数据虽然本身不是一个工件,但是它对测试的成败产生重要的影响。没有测试虽然本身不是一个工件,但是它对测试的成败产生重要的影响。没有测试数据,将无法实施和执行测试,尤其当要求测试数据作为以下值时:数据,将无法实施和执行测试,尤其当要求测试数据作为以下值时:u作为创建条件的输入作为创建条件的输入u作为评估需求的输出结果作为评估需求的输出结果u作为支持(作为测试的前置条件)作为支持(作为测试的前置条件)n因此,

133、确定这些值是一个重要的工作,并且这项工作在确定测试用例后完因此,确定这些值是一个重要的工作,并且这项工作在确定测试用例后完成。(请参阅工件:测试用例和指南:测试用例)。成。(请参阅工件:测试用例和指南:测试用例)。n确定实际的测试数据时,必须说明处理测试数据的四个属性:确定实际的测试数据时,必须说明处理测试数据的四个属性:u深度深度-测试数据中数据的容量或数量测试数据中数据的容量或数量u宽度宽度-测试数据中数据的变化程度测试数据中数据的变化程度u范围范围-测试数据与测试目标的相关性测试数据与测试目标的相关性u构架构架-测试数据的物理结构测试数据的物理结构深度深度n深度是在测试中所使用数据的容量

134、或数量。深度是深度是在测试中所使用数据的容量或数量。深度是一个需要考虑的重要事项,因为数据太少可能无法一个需要考虑的重要事项,因为数据太少可能无法反映现实生活的条件,而数据太多将难以管理和维反映现实生活的条件,而数据太多将难以管理和维护。理想条件下,测试应首先使用一个小的支持关护。理想条件下,测试应首先使用一个小的支持关键测试用例的数据集(通常为正面测试用例)。随键测试用例的数据集(通常为正面测试用例)。随着测试过程中信心不断增强,应该增加测试数据,着测试过程中信心不断增强,应该增加测试数据,直到数据深度完全体现出部署环境(或适当可行的直到数据深度完全体现出部署环境(或适当可行的范围)为止。范

135、围)为止。n测试数据深度与用作输入和用于支持测试(在预先测试数据深度与用作输入和用于支持测试(在预先存在的数据中)的测试数据相关。存在的数据中)的测试数据相关。宽度宽度n宽度是指测试数据值变化的程度。创建更多的记录就可以增宽度是指测试数据值变化的程度。创建更多的记录就可以增加测试数据的深度。虽然这通常是一个好的解决方法,但是加测试数据的深度。虽然这通常是一个好的解决方法,但是它无法解决我们期望在实际数据中看到的数据真实变化的问它无法解决我们期望在实际数据中看到的数据真实变化的问题。如果在测试数据中没有这些变化,我们可能无法确定缺题。如果在测试数据中没有这些变化,我们可能无法确定缺陷(毕竟,不是

136、每次从陷(毕竟,不是每次从ATM提取的款项都是提取的款项都是50.00美元)。美元)。因此,测试数据值应该反映在部署环境内找到的数据值,例因此,测试数据值应该反映在部署环境内找到的数据值,例如提取如提取10.00美元或美元或120.00美元。另外,测试数据应该反映美元。另外,测试数据应该反映现实世界的信息,例如:现实世界的信息,例如:u包括头衔、数值、标点符号和后缀的名字:包括头衔、数值、标点符号和后缀的名字:FDr.JamesBandlin、Ms.SusanSmith和和Rev.JosephP.MayersFJamesJohnsonIII、StevenWilshire3rd和和Charles

137、JamesEllsworth,Esq.FEllenJones-Smythe、BrianP.Tellstor宽度宽度u带有多地址行的地址,例如:带有多地址行的地址,例如:F6500BroadwayStreetFSuite175F1550BroadwayFFloor17FMailstop75Au真实相符的城市代码(和国家代码)和电话号码真实相符的城市代码(和国家代码)和电话号码FLexington,MA,USA+017816762400FKista,Sweden+46856628200FParis,France+33130120950n为获得足够的数据宽度,测试数据值既可以是物理方式表示为获得足够

138、的数据宽度,测试数据值既可以是物理方式表示的真实数据,也可以是统计方式表示的真实数据。这两种方的真实数据,也可以是统计方式表示的真实数据。这两种方法都具有使用价值,推荐使用它们。为创建利用物理方法表法都具有使用价值,推荐使用它们。为创建利用物理方法表示部署数据的测试数据,需要确定部署数据库中每个数据元示部署数据的测试数据,需要确定部署数据库中每个数据元素所允许包含的值(或范围),并确保在每个数据元素中,素所允许包含的值(或范围),并确保在每个数据元素中,测试数据至少有一个记录包含每一个允许值。测试数据至少有一个记录包含每一个允许值。物理表示法物理表示法物理表示法物理表示法帐号(范围)帐号(范围

139、)PIN号号(整数)(整数)帐户余额帐户余额(十进制)(十进制)帐户类型帐户类型(字符串)(字符串)(S)081200000000到到081299999999(C)082900000000到到082999999999(X)079900000000到到0799999999990000-9999-999,999.99到到999,999.99S、C、X记录记录10812083702938493-3,123.84S记录记录208126493835535588,438.53S记录记录30829748304620352673.00C记录记录40799489618934896493,498.49X物理表示法

140、物理表示法物理表示法物理表示法n以上矩阵包含了可以用物理方法表示可接受数据值的记录的以上矩阵包含了可以用物理方法表示可接受数据值的记录的最小数量。对于帐号,在以上三个范围中每一个范围都有一最小数量。对于帐号,在以上三个范围中每一个范围都有一个记录,所有的个记录,所有的PIN号都在指定的范围内,几个帐户余额各号都在指定的范围内,几个帐户余额各不相同,其中包括一个负余额,并且每一个不同的帐户类型不相同,其中包括一个负余额,并且每一个不同的帐户类型都存在相关记录。以上矩阵对应最小的数据,最佳方案是使都存在相关记录。以上矩阵对应最小的数据,最佳方案是使用每个范围界限上以及该范围内的数据值用每个范围界限

141、上以及该范围内的数据值n物理表示法的一个优点是,测试数据在数量和可管理性上都物理表示法的一个优点是,测试数据在数量和可管理性上都有限制,重点及导向目标是可接受值。它的缺点是实际的、有限制,重点及导向目标是可接受值。它的缺点是实际的、现实世界的数据并不是完全随机的。真实数据往往具有可能现实世界的数据并不是完全随机的。真实数据往往具有可能影响性能的统计曲线,在采用物理表示法时将不会观察到这影响性能的统计曲线,在采用物理表示法时将不会观察到这些特征。些特征。统计表示法统计表示法统计表示法统计表示法n统计测试数据表示法是指反映了生产数据(在相同百分比下)统计测试数据表示法是指反映了生产数据(在相同百分

142、比下)统计抽样的测试数据。例如,使用和以上相同的数据元素,统计抽样的测试数据。例如,使用和以上相同的数据元素,如果我们分析该生产数据库,将发现以下事实:如果我们分析该生产数据库,将发现以下事实:u总记录数:总记录数:294,031个个u帐户类型为帐户类型为S的总数:的总数:141,135个(占全部数量的个(占全部数量的48%)u帐户类型为帐户类型为C的总数:的总数:144,075个个(占全部数量的占全部数量的49%)u帐户类型为帐户类型为X的总数:的总数:8,821个个(占全部数量的占全部数量的3%)u帐号和帐号和PIN号均匀分布号均匀分布基于统计抽样的测试数据包括基于统计抽样的测试数据包括2

143、94个记录个记录测试数据(占生产的测试数据(占生产的1%)记录数记录数百分比百分比总记录数总记录数294100帐号帐号(S)081200000000到到08129999999914148帐号帐号(C)082900000000到到08299999999914449帐号帐号(X)079900000000到到07999999999993统计表示法统计表示法n以上矩阵只说明帐户类型。为了开发最佳的基于统计表示法以上矩阵只说明帐户类型。为了开发最佳的基于统计表示法的测试数据,您最好要将重要的数据元素包括在内。以上示的测试数据,您最好要将重要的数据元素包括在内。以上示例中,包括反映了实际帐户余额的重要数据

144、元素。例中,包括反映了实际帐户余额的重要数据元素。n统计表示法的一个缺点是可能无法反映可接受值的整个范围。统计表示法的一个缺点是可能无法反映可接受值的整个范围。n通常情况下,同时使用确定测试数据的两种方法,确保测试通常情况下,同时使用确定测试数据的两种方法,确保测试数据涵盖所有值并解决性能数据涵盖所有值并解决性能/填充问题。填充问题。n测试数据宽度与用作输入的测试数据以及用于支持测试(在测试数据宽度与用作输入的测试数据以及用于支持测试(在预先存在的数据中)的测试数据相关。预先存在的数据中)的测试数据相关。范围范围n范围是测试数据与测试目标之间的关联关系,它和测试深度范围是测试数据与测试目标之间

145、的关联关系,它和测试深度和测试宽度相关。具有许多数据并不意味着其数据一定正确。和测试宽度相关。具有许多数据并不意味着其数据一定正确。与处理测试数据的宽度一样,我们必须确保测试数据和测试与处理测试数据的宽度一样,我们必须确保测试数据和测试目标相关,也就是说,需要有支持特定测试目标的测试数据。目标相关,也就是说,需要有支持特定测试目标的测试数据。n例如,在以下矩阵中,最初的四个测试数据记录说明了每个例如,在以下矩阵中,最初的四个测试数据记录说明了每个数据元素的可接受值。然而,用于评估帐户类型数据元素的可接受值。然而,用于评估帐户类型C和和X负余负余额的记录却没有。因此,尽管该测试数据正确地包含了一

146、个额的记录却没有。因此,尽管该测试数据正确地包含了一个负余额(有效的宽度),以下的数据在其范围内不足以支持负余额(有效的宽度),以下的数据在其范围内不足以支持采用每个帐户类型的负余额进行的任何测试。扩展此数据以采用每个帐户类型的负余额进行的任何测试。扩展此数据以包括更多的记录,并将各个不同帐户类型的负余额包括在内,包括更多的记录,并将各个不同帐户类型的负余额包括在内,这些操作对于处理这类疏忽是很有必要的。这些操作对于处理这类疏忽是很有必要的。范围示例范围示例范围示例范围示例帐号(范围)帐号(范围)PIN号号(整数)(整数)帐户余额帐户余额(十进制)(十进制)帐户类型帐户类型(字符串)(字符串)

147、(S)081200000000到到081299999999(C)082900000000到到082999999999(X)079900000000到到0799999999990000-9999-999,999.99到到999,999.99S、C、X记录记录10812083702938493-3,123.84S记录记录208126493835535588,438.53S记录记录30829748304620352673.00C记录记录40799489618934896493,498.49X新记录新记录10829349149270352-995,498.34C新记录新记录20799657894364

148、896-64,913.87X构架构架n测试数据的物理结构仅与测试目标用于支持测试的任何预先测试数据的物理结构仅与测试目标用于支持测试的任何预先存在的数据相关,例如某个应用程序的数据库或规则表。存在的数据相关,例如某个应用程序的数据库或规则表。n测试执行不是一劳永逸的。测试将需要在迭代中以及各个迭测试执行不是一劳永逸的。测试将需要在迭代中以及各个迭代之间重复执行。为统一、有效、有把握地执行测试,测试代之间重复执行。为统一、有效、有把握地执行测试,测试数据应在测试执行前返回其初始状态。在自动执行测试时,数据应在测试执行前返回其初始状态。在自动执行测试时,这一点尤其重要。这一点尤其重要。n因此,为了

149、确保测试的完整性、把握性和有效性,测试数据因此,为了确保测试的完整性、把握性和有效性,测试数据不受外部的任何影响,并且了解测试执行在开始、期间和结不受外部的任何影响,并且了解测试执行在开始、期间和结束阶段的状态,这两点异常重要。为了达到测试目标,必须束阶段的状态,这两点异常重要。为了达到测试目标,必须处理两个问题:处理两个问题:u不稳定性不稳定性/隔离隔离-隔绝测试数据的外部影响隔绝测试数据的外部影响u初始状态初始状态-了解数据的特定初始状态以及返回此状态的能力了解数据的特定初始状态以及返回此状态的能力n这两个问题都将影响您管理测试数据库、设计测试模型以及这两个问题都将影响您管理测试数据库、设

150、计测试模型以及与其他角色交互的方式。与其他角色交互的方式。不稳定性不稳定性/隔离隔离n测试数据可能由于以下原因而变得不稳定:测试数据可能由于以下原因而变得不稳定:u外部的、与测试无关的影响修改了该数据外部的、与测试无关的影响修改了该数据u其他的测试角色不知道别人正在使用的数据其他的测试角色不知道别人正在使用的数据n为维护测试的把握性和完整性,测试数据需要进行高度控制为维护测试的把握性和完整性,测试数据需要进行高度控制并与这些影响隔绝。确保测试数据被隔绝的策略包括:并与这些影响隔绝。确保测试数据被隔绝的策略包括:u分离测试环境分离测试环境-每个测试角色有自己的测试环境,在物理上和每个测试角色有自

151、己的测试环境,在物理上和其他角色分离。测试员没有共享的内容,也就是说,他们有自其他角色分离。测试员没有共享的内容,也就是说,他们有自己的测试目标和数据。例如,每个测试角色都有自己的个人计己的测试目标和数据。例如,每个测试角色都有自己的个人计算机就可以实现此策略。算机就可以实现此策略。u分离测试数据基础实例分离测试数据基础实例-每个测试角色有自己的数据实例,也每个测试角色有自己的数据实例,也就是说,它隔离了其他所有的影响。尽管物理环境,也许甚至就是说,它隔离了其他所有的影响。尽管物理环境,也许甚至还有测试目标都是共享的,但是每个测试员有自己的数据实例,还有测试目标都是共享的,但是每个测试员有自己

152、的数据实例,这种情况下,测试数据干扰的风险几乎不存在。这种情况下,测试数据干扰的风险几乎不存在。u测试数据测试数据/数据库分区数据库分区-所有的测试角色共享一个数据库,而且所有的测试角色共享一个数据库,而且知道其他角色正在使用的数据(避免使用其他角色的数据)。知道其他角色正在使用的数据(避免使用其他角色的数据)。例如,一个测试员使用例如,一个测试员使用0到到99的记录,而另一个测试员使用的记录,而另一个测试员使用100到到199的记录,或有人使用姓为的记录,或有人使用姓为Aa到到Kz的客户记录,而的客户记录,而另一个测试员使用名字从另一个测试员使用名字从La到到Zz的病人记录。的病人记录。初始

153、状态初始状态n必须解决的另一个测试数据构架问题是,在开始执行测试时必须解决的另一个测试数据构架问题是,在开始执行测试时测试数据的初始状态。当使用自动测试时,这个问题尤其重测试数据的初始状态。当使用自动测试时,这个问题尤其重要。正如测试目标必须以一个已知、预期的状态来开始一个要。正如测试目标必须以一个已知、预期的状态来开始一个测试的执行过程,这个要求对于测试数据也是一样的。由于测试的执行过程,这个要求对于测试数据也是一样的。由于每一测试执行过程与上一测试执行过程相同,所以这种做法每一测试执行过程与上一测试执行过程相同,所以这种做法可以提高可重复性和把握性。可以提高可重复性和把握性。n以下是解决这

154、一问题的四个常用策略:以下是解决这一问题的四个常用策略:u数据更新数据更新u数据重新初始化数据重新初始化u数据重置数据重置u数据前滚数据前滚n采用何种方法将取决于几个因素,包括数据库的物理特征、采用何种方法将取决于几个因素,包括数据库的物理特征、测试角色的技术能力、外部(非测试的)角色的可用性以及测试角色的技术能力、外部(非测试的)角色的可用性以及测试目标。测试目标。数据更新数据更新n将数据返回其初始状态的最理想的方法是数据更新。将数据返回其初始状态的最理想的方法是数据更新。这个方法包括创建初始状态下该数据库的一个备份,这个方法包括创建初始状态下该数据库的一个备份,并将其保存。在测试执行完成之

155、后(或执行测试之并将其保存。在测试执行完成之后(或执行测试之前),将该测试数据库的存档副本复制到测试环境前),将该测试数据库的存档副本复制到测试环境内使用。这确保了在每次测试执行开始时,测试数内使用。这确保了在每次测试执行开始时,测试数据初始状态都是一样的。据初始状态都是一样的。n这种方法有一个优点,即数据能够以几个不同的初这种方法有一个优点,即数据能够以几个不同的初始状态进行存档。例如,测试数据可以按日末状态、始状态进行存档。例如,测试数据可以按日末状态、周末状态、月末状态等等进行归档。这样,测试者周末状态、月末状态等等进行归档。这样,测试者就可以将测试数据快速刷新到给定状态,以便进行就可以

156、将测试数据快速刷新到给定状态,以便进行测试。例如月末用例的测试。测试。例如月末用例的测试。数据重新初始化数据重新初始化n如果数据无法刷新,那么次佳的方法是通过一些编程手段,如果数据无法刷新,那么次佳的方法是通过一些编程手段,将数据恢复到它的初始状态。数据重新初始化依赖于特殊的将数据恢复到它的初始状态。数据重新初始化依赖于特殊的用例和工具返回测试数据的初始值。用例和工具返回测试数据的初始值。n采用这一方法必须小心,保证所有的数据、关系以及关键值采用这一方法必须小心,保证所有的数据、关系以及关键值都返回到它们适当的初始值状态,以确保没有在数据中引入都返回到它们适当的初始值状态,以确保没有在数据中引

157、入任何错误。任何错误。n该方法的一个优点是它可以支持数据库内无效值的测试。在该方法的一个优点是它可以支持数据库内无效值的测试。在正常条件下,无效数据值将被俘获而不允许进入到数据中正常条件下,无效数据值将被俘获而不允许进入到数据中(例如利用客户机上的一个确认规则)。然而,另一个主角(例如利用客户机上的一个确认规则)。然而,另一个主角可能会影响该数据(例如,另一个系统的电子更新)。测试可能会影响该数据(例如,另一个系统的电子更新)。测试需要在独立于无效数据产生方式的基础上,验证无效数据是需要在独立于无效数据产生方式的基础上,验证无效数据是否得以确定并进行了适当的处理。否得以确定并进行了适当的处理。

158、数据重置数据重置n将数据恢复到它的初始状态的一个简单方法是将数据恢复到它的初始状态的一个简单方法是“撤消更改撤消更改”,即撤消在测试期间对数据的更改。此方法依赖于使用测试,即撤消在测试期间对数据的更改。此方法依赖于使用测试目标来输入撤消条目,即添加被删除的记录目标来输入撤消条目,即添加被删除的记录/值、恢复被修改值、恢复被修改的记录的记录/值以及删除已添加的数据。值以及删除已添加的数据。n然而,这种方法还存在有一些风险,包括:然而,这种方法还存在有一些风险,包括:u必须撤消所有的操作,而不只是一部分必须撤消所有的操作,而不只是一部分u依赖于测试目标中的用例(这些用例在用于数据重置之前,必依赖于

159、测试目标中的用例(这些用例在用于数据重置之前,必须进行测试以核实其正确的功能性)须进行测试以核实其正确的功能性)u数据库关键字、索引以及指针不可以或不能重置数据库关键字、索引以及指针不可以或不能重置n如果这是在您的测试环境中唯一可用的方法,则避免使用数如果这是在您的测试环境中唯一可用的方法,则避免使用数据库关键字、索引和指针作为核实的主要目标。也就是,例据库关键字、索引和指针作为核实的主要目标。也就是,例如采用如采用PatientName字段来确定该病人是否已经添加到数字段来确定该病人是否已经添加到数据库中,而不是使用系统生成的据库中,而不是使用系统生成的PatientID号。号。数据前滚数据

160、前滚n数据前滚是最不理想的处理测试数据初始状态的方法。事实数据前滚是最不理想的处理测试数据初始状态的方法。事实上,它并没有真正地解决问题。相反,数据状态在完成执行上,它并没有真正地解决问题。相反,数据状态在完成执行测试时将变成测试数据新的初始状态。一般情况下,这要求测试时将变成测试数据新的初始状态。一般情况下,这要求修改用于输入和(或)测试用例的测试数据以及用于评估结修改用于输入和(或)测试用例的测试数据以及用于评估结果的测试数据。果的测试数据。n有时候必须采用这种做法。例如,月末。如果在月末之前该有时候必须采用这种做法。例如,月末。如果在月末之前该数据没有归档,则必须执行每一天和每个星期的测

161、试数据和数据没有归档,则必须执行每一天和每个星期的测试数据和测试过程以将数据测试过程以将数据“前滚前滚”到月末处理的测试所需的状态。到月末处理的测试所需的状态。n该方法具有的风险包括:该方法具有的风险包括:u数据库关键字、索引和指针不能重置(且不能用于核实)数据库关键字、索引和指针不能重置(且不能用于核实)u数据经常改变数据经常改变u需要更多的工作来证明结果的核实情况需要更多的工作来证明结果的核实情况单元测试单元测试n单元测试是对最小的可测试软件元素(单元)实施的测试,单元测试是对最小的可测试软件元素(单元)实施的测试,它所测试的内容包括内部结构(如逻辑和数据流)以及单元它所测试的内容包括内部

162、结构(如逻辑和数据流)以及单元的功能和可观测的行为。侧重于单元内部结构的测试设计和的功能和可观测的行为。侧重于单元内部结构的测试设计和实施依赖于对单元实施情况的了解(白盒方法)。为核实单实施依赖于对单元实施情况的了解(白盒方法)。为核实单元的可观测行为和功能而进行的测试设计和实施并不依赖于元的可观测行为和功能而进行的测试设计和实施并不依赖于对实施情况的了解,因而被称为黑盒方法。对实施情况的了解,因而被称为黑盒方法。n为了成功和全面地对单元进行测试,需要结合使用这两种方为了成功和全面地对单元进行测试,需要结合使用这两种方法来设计和实施不同类型的测试(参见概念:测试类型)。法来设计和实施不同类型的

163、测试(参见概念:测试类型)。n除了各种类型的测试需要单独考虑的事项以及在这里提到的除了各种类型的测试需要单独考虑的事项以及在这里提到的两种方法以外,还有一些仅适用于单元测试的设计和实施考两种方法以外,还有一些仅适用于单元测试的设计和实施考虑事项,它们包括:虑事项,它们包括:u被继承的操作被继承的操作u抽象类抽象类u多态性多态性白盒测试方法白盒测试方法n要核实单元的内部结构,应采用白盒测试方法。理要核实单元的内部结构,应采用白盒测试方法。理论上,您应当测试代码中每一可能的路径,但这只论上,您应当测试代码中每一可能的路径,但这只有在非常简单的单元中才可能做到。作为一种最低有在非常简单的单元中才可能

164、做到。作为一种最低限度,您应当对每个决定到决定路径(限度,您应当对每个决定到决定路径(DD路径)测路径)测试至少一次,因为这样您可以将所有语句至少执行试至少一次,因为这样您可以将所有语句至少执行一次。决定通常是一次。决定通常是if语句,而语句,而DD路径是两个决定路径是两个决定之间的路径。之间的路径。n要达到这种程度的测试覆盖率,在选择测试数据时要达到这种程度的测试覆盖率,在选择测试数据时应该使每个决定都可以用每种可能的方法来评估。应该使每个决定都可以用每种可能的方法来评估。n可使用代码覆盖率工具来确定白盒测试没有执行到可使用代码覆盖率工具来确定白盒测试没有执行到的代码。在进行白盒测试的同时应

165、进行可靠性测试。的代码。在进行白盒测试的同时应进行可靠性测试。黑盒测试黑盒测试n黑盒测试的目的是在不知道单元将如何实施功能和行为的情黑盒测试的目的是在不知道单元将如何实施功能和行为的情况下,核实单元的指定功能和可观测行为。黑盒测试侧重并况下,核实单元的指定功能和可观测行为。黑盒测试侧重并依赖于单元的输入和输出。依赖于单元的输入和输出。n当基于黑盒方法进行单元测试时,将利用单元操作的输入输当基于黑盒方法进行单元测试时,将利用单元操作的输入输出参数和出参数和/或输出状态来进行评估。例如,单元的操作可能包或输出状态来进行评估。例如,单元的操作可能包括某个算法(需要两个值作为输入并返回第三个值作为输出

166、)括某个算法(需要两个值作为输入并返回第三个值作为输出),或者可能会引起对象或构件的状态变化(例如,添加或删,或者可能会引起对象或构件的状态变化(例如,添加或删除数据库记录)。对两种情况都必须进行全面的测试。要对除数据库记录)。对两种情况都必须进行全面的测试。要对一项操作进行测试,应生成足够数量的测试用例来核实以下一项操作进行测试,应生成足够数量的测试用例来核实以下内容:内容:u对于每个用作输入的有效值,该操作是否返回了一个相应值对于每个用作输入的有效值,该操作是否返回了一个相应值u对于每个无效输入值,操作只返回一个相应值对于每个无效输入值,操作只返回一个相应值u对于每个有效的输入状态,是否出

167、现了一个相应的输出状态对于每个有效的输入状态,是否出现了一个相应的输出状态u对于每个无效的输入状态,是否出现了一个相应的输出状态对于每个无效的输入状态,是否出现了一个相应的输出状态n可使用代码覆盖率工具来确定白盒测试没有执行到的代码。可使用代码覆盖率工具来确定白盒测试没有执行到的代码。在进行黑盒测试的同时应进行可靠性测试。在进行黑盒测试的同时应进行可靠性测试。如何测试被继承的操作如何测试被继承的操作n如果被继承的操作在后代中不起作用,这就属于后代和祖先如果被继承的操作在后代中不起作用,这就属于后代和祖先之间的交互问题。您可以在测试用例时核实单元之间的交互。之间的交互问题。您可以在测试用例时核实

168、单元之间的交互。但不要在测试单元时测试被继承的操作。被继承的操作应该但不要在测试单元时测试被继承的操作。被继承的操作应该在测试用例时进行测试。在测试用例时进行测试。n在以下两种情况下,被继承的操作都可能会失败:在以下两种情况下,被继承的操作都可能会失败:u后代类修改了被继承的操作为其指定了特定值的实例(或成员)后代类修改了被继承的操作为其指定了特定值的实例(或成员)变量。变量。u祖先中的操作调用了在后代中实施的操作。祖先中的操作调用了在后代中实施的操作。n要避免第一种情况,应禁止祖先通过被继承操作以外的操作要避免第一种情况,应禁止祖先通过被继承操作以外的操作来修改被继承的实例(或成员)变量。要

169、避免第二种情况,来修改被继承的实例(或成员)变量。要避免第二种情况,应全面测试被调用的操作。应全面测试被调用的操作。如何测试抽象类如何测试抽象类n如果一个类不会进行实例化,而只是为了让其他类继承而存在,就必须对如果一个类不会进行实例化,而只是为了让其他类继承而存在,就必须对其进行测试。这种测试到底具有什么意义,这可能并不明显。因为按照定其进行测试。这种测试到底具有什么意义,这可能并不明显。因为按照定义,抽象类没有实例,所以测试实例没有任何意义。但是,抽象类可以被义,抽象类没有实例,所以测试实例没有任何意义。但是,抽象类可以被继承,而且可以创建其后代的实例。因此,测试抽象类的目的之一是确定继承,

170、而且可以创建其后代的实例。因此,测试抽象类的目的之一是确定继承是否可能,以及是否有后代类的实例。它的第二个目的是确定对抽象继承是否可能,以及是否有后代类的实例。它的第二个目的是确定对抽象类本身的可能调用(类本身的可能调用(C+中的中的this、Smalltalk中的中的self)是否将会实现。)是否将会实现。要测试这一点,需要让测试程序创建一个继承该抽象类的后代类。测试程要测试这一点,需要让测试程序创建一个继承该抽象类的后代类。测试程序将通过测试该后代类来对单元进行测试。序将通过测试该后代类来对单元进行测试。测试和多态性测试和多态性n多态性是一个编程语言方面的概念,它使代码更易于更改,但却使测

171、试更多态性是一个编程语言方面的概念,它使代码更易于更改,但却使测试更加困难。在以下的示例中,您无法测试包含加困难。在以下的示例中,您无法测试包含Shape类的每个子类的代码。类的每个子类的代码。当您测试用例时,必须测试这种情况。当您测试用例时,必须测试这种情况。n在面向对象的语言中,多态性产生的一个有趣效果是:在在面向对象的语言中,多态性产生的一个有趣效果是:在Smalltalk中的中的每次消息发送以及在每次消息发送以及在C+中的每次功能调用都是一个潜在的中的每次功能调用都是一个潜在的CASE语句。语句。n示例:假设您有以下类分层结构,并且类示例:假设您有以下类分层结构,并且类Shape具有操

172、作具有操作Draw。测试模型测试模型n测试模型中表示的是测试对象和测试方式。它是设测试模型中表示的是测试对象和测试方式。它是设计和实施模型的视图,是由测试用例、测试过程和计和实施模型的视图,是由测试用例、测试过程和测试脚本以及它们之间的关系组成的集合。测试脚本以及它们之间的关系组成的集合。n测试模型是一种表示要在目标测试中测试的对象的测试模型是一种表示要在目标测试中测试的对象的模型(它可以是系统或系统的一部分)。它是设计模型(它可以是系统或系统的一部分)。它是设计和实施模型的视图,并且包含专门用于测试的测试和实施模型的视图,并且包含专门用于测试的测试用例、测试过程和测试脚本。测试模型的作用在于

173、用例、测试过程和测试脚本。测试模型的作用在于让我们了解测试对象和测试方法。让我们了解测试对象和测试方法。测试模型的使用测试模型的使用n对于开发生命周期中的每次迭代,都会开发出测试模型的一对于开发生命周期中的每次迭代,都会开发出测试模型的一个新版本。新版本应包括旧的测试(作为回归测试),以及个新版本。新版本应包括旧的测试(作为回归测试),以及用于新功能的新测试。用于新功能的新测试。n粗略地看起来,您会在测试模型中看到设计和粗略地看起来,您会在测试模型中看到设计和/或实施模型以或实施模型以及反映测试用例的表示法。测试用例定义了输入、执行条件及反映测试用例的表示法。测试用例定义了输入、执行条件和预期

174、输出的一个集合。多数测试用例来自用例场景或用例和预期输出的一个集合。多数测试用例来自用例场景或用例实现,而且在遍历测试目标时,测试用例与用例的执行过程实现,而且在遍历测试目标时,测试用例与用例的执行过程相对应。如果测试目标是整个系统,则测试用例将对应于用相对应。如果测试目标是整个系统,则测试用例将对应于用例的完全执行过程。如果测试目标是一个子系统,则测试用例的完全执行过程。如果测试目标是一个子系统,则测试用例对应于遍历该子系统的那部分用例。例对应于遍历该子系统的那部分用例。n如果以如果以ATM机为例,测试用例就是要核实顾客是否能够提取机为例,测试用例就是要核实顾客是否能够提取100美元,前提条

175、件是:信用卡有效,并且所用帐户内有足美元,前提条件是:信用卡有效,并且所用帐户内有足够的金额。另一个用例测试是验证当用户的信用卡有效,但够的金额。另一个用例测试是验证当用户的信用卡有效,但却输入了错误的却输入了错误的PIN,此时,此时ATM软件是否还能按预期工作。软件是否还能按预期工作。测试模型的使用测试模型的使用n初期迭代中,可能还不存在任何完整的用例说明,初期迭代中,可能还不存在任何完整的用例说明,仅仅是一些场景。因而,测试的第一次迭代中,只仅仅是一些场景。因而,测试的第一次迭代中,只有用于验证提现能力的测试用例得以实施,还无法有用于验证提现能力的测试用例得以实施,还无法验证对错误验证对错

176、误PIN代码的处理能力。代码的处理能力。n最详尽的测试模型将描述为执行测试而生成的测试最详尽的测试模型将描述为执行测试而生成的测试用例、测试过程和测试脚本之间的关系。用例、测试过程和测试脚本之间的关系。n并非所有系统需求都能在用例中有所体现。这种需并非所有系统需求都能在用例中有所体现。这种需求称为非功能性需求或技术需求。典型的例子是负求称为非功能性需求或技术需求。典型的例子是负载需求和应用平台需求。载需求和应用平台需求。测试用例来自于并可追踪至用例或场景、用例测试用例来自于并可追踪至用例或场景、用例实现或需求实现或需求测试模型的使用测试模型的使用n对有些组织,如果从最初系统需求到实施细节的可追

177、踪性至关重要(或是对有些组织,如果从最初系统需求到实施细节的可追踪性至关重要(或是必需的),则须维护从测试用例到其相应系统需求的可追踪性链接。必需的),则须维护从测试用例到其相应系统需求的可追踪性链接。n注:如果不具备有效维护这些可追踪性链接的工具,则管理成本将居高不注:如果不具备有效维护这些可追踪性链接的工具,则管理成本将居高不下。在这种情况下,了解测试用例来源于什么用例、用例场景或用例实现下。在这种情况下,了解测试用例来源于什么用例、用例场景或用例实现就已足够。就已足够。n在最高一层上,测试用例应根据测试目标(系统、子系统或构件)进行分在最高一层上,测试用例应根据测试目标(系统、子系统或构

178、件)进行分组。在下一级别中,可以根据该测试用例来源的用例或需求来选择分组方组。在下一级别中,可以根据该测试用例来源的用例或需求来选择分组方式。式。n在较简单的实施中,测试用例作为一个测试过程来实施。测试过程实际表在较简单的实施中,测试用例作为一个测试过程来实施。测试过程实际表示为指导如何执行测试用例的文本说明(针对手工测试),或作为将要在示为指导如何执行测试用例的文本说明(针对手工测试),或作为将要在测试自动化工具的使用环境内执行的测试脚本。在比较复杂的实施中,一测试自动化工具的使用环境内执行的测试脚本。在比较复杂的实施中,一个测试用例可能对应于一到多个测试过程,而一个测试过程也可能是一到个测

179、试用例可能对应于一到多个测试过程,而一个测试过程也可能是一到多个测试用例实施的一部分。同样的,多个测试过程可通过一到多个测试多个测试用例实施的一部分。同样的,多个测试过程可通过一到多个测试脚本来实施。脚本来实施。测试用例、测试过程和测试脚本之间的关系测试用例、测试过程和测试脚本之间的关系测试用例、测试过程和测试脚本之间的关系测试用例、测试过程和测试脚本之间的关系n测试用例由一到多个测试过程来实施。测试用例由一到多个测试过程来实施。n测试过程可以实施(全部或部分)一到多个测试用测试过程可以实施(全部或部分)一到多个测试用例。例。n执行手工测试时,测试过程与测试用例之间存在一执行手工测试时,测试过

180、程与测试用例之间存在一对一的关系。对一的关系。n自动测试(实施测试脚本)时,测试过程可由许多自动测试(实施测试脚本)时,测试过程可由许多测试脚本来实施,或一个测试脚本可以实施许多测测试脚本来实施,或一个测试脚本可以实施许多测试过程(或测试过程的某些部分)。试过程(或测试过程的某些部分)。测试过程测试过程n测试过程是指设置、执行给定测试用例并对测试结果进行评估的一系列详细指导测试过程是指设置、执行给定测试用例并对测试结果进行评估的一系列详细指导说明。说明。n设计测试过程时需要处理以下各项:设计测试过程时需要处理以下各项:u测试的前置条件。测试的前置条件。u输入条件。输入条件。u要执行的操作。要执

181、行的操作。u预期结果。预期结果。u验证预期结果的方法。验证预期结果的方法。n例如,在测试过程中如果要测试添加客户帐户这一用例或场景,则需要考虑的事例如,在测试过程中如果要测试添加客户帐户这一用例或场景,则需要考虑的事项包括:项包括:u测试的前置条件测试的前置条件-该帐户是否已经存在?该测试过程从软件的什么位置开始执该帐户是否已经存在?该测试过程从软件的什么位置开始执行?是否从行?是否从“添加客户添加客户”菜单选项开始?选择该菜单选项后,菜单选项开始?选择该菜单选项后,“添加客户添加客户”对话框是否随后打开?对话框是否随后打开?u输入条件输入条件-测试过程通常可通过检查菜单或对话框标题来测试其起

182、点是否正确。测试过程通常可通过检查菜单或对话框标题来测试其起点是否正确。在随后的过程中将会输入数据,例如客户名和客户地址。在随后的过程中将会输入数据,例如客户名和客户地址。u要执行的操作要执行的操作-该过程将激活该过程将激活“保存保存”功能。功能。u预期结果预期结果-这个新客户将保存到数据库中。这个新客户将保存到数据库中。u验证预期结果的方法验证预期结果的方法-如何确定在该过程中已添加了这个客户?在这种情况下,如何确定在该过程中已添加了这个客户?在这种情况下,有很多验证方法。例如,检查新客户是否出现在客户帐户列表中、检查是否有很多验证方法。例如,检查新客户是否出现在客户帐户列表中、检查是否存在

183、已添加客户这一确认消息、直接查询数据库等等。存在已添加客户这一确认消息、直接查询数据库等等。实施实施测试测试目的目的n此工作流程明细的目的是实施(记录、生成或编写)此工作流程明细的目的是实施(记录、生成或编写)设计测试中定义的测试过程。输出工件是测试过程设计测试中定义的测试过程。输出工件是测试过程的计算机可读版本,称为测试脚本。测试脚本的生的计算机可读版本,称为测试脚本。测试脚本的生成可以在测试自动化工具环境中或编程环境中完成。成可以在测试自动化工具环境中或编程环境中完成。如何配备人员如何配备人员n测试设计员使用测试模型,同时可能使用其他的已测试设计员使用测试模型,同时可能使用其他的已实施构件

184、,来实施测试以确保一些测试专用的功能实施构件,来实施测试以确保一些测试专用的功能(桩模块、驱动程序等)以及非测试重点但要与测(桩模块、驱动程序等)以及非测试重点但要与测试对象交互的元素得到实施和测试。试对象交互的元素得到实施和测试。工作指南工作指南n可以使用多种方法生成测试脚本,包括:可以使用多种方法生成测试脚本,包括:u录制录制-使用录制使用录制/回放工具来获取(记录)与测试对象回放工具来获取(记录)与测试对象的交互和执行测试对象的结果。的交互和执行测试对象的结果。u编程编程-使用开发环境编写执行和获取执行测试对象结使用开发环境编写执行和获取执行测试对象结果的必要步骤的程序。果的必要步骤的程

185、序。u自动生成自动生成-在没有用户介入的情况下,使用测试生成在没有用户介入的情况下,使用测试生成工具生成测试脚本(生成的设置和启动除外)。工具生成测试脚本(生成的设置和启动除外)。活动:实施测试活动:实施测试n目的目的u创建或生成可复用的测试脚本创建或生成可复用的测试脚本u维护从测试实施工件到相关的测试用例及用例或测试维护从测试实施工件到相关的测试用例及用例或测试需求的可追踪性需求的可追踪性nn步骤步骤u记录、生成或通过编程创建测试脚本记录、生成或通过编程创建测试脚本u确定设计与实施模型中的测试专用功能确定设计与实施模型中的测试专用功能u建立外部数据集建立外部数据集n工件工件n输入工件:输入工

186、件:u补充规约补充规约u编程指南编程指南u设计指南设计指南u设计模型设计模型u设计类和包设计类和包u软件构架文档软件构架文档u构件构件u测试模型测试模型u测试用例测试用例u测试构件测试构件u测试过程测试过程u测试脚本测试脚本u负载分析文档负载分析文档u实施模型实施模型u软件工作版本软件工作版本n生成工件:生成工件:u完整的测试脚本完整的测试脚本u测试构件测试构件记录、生成或通过编程创建测试脚本记录、生成或通过编程创建测试脚本n目的目的:创建或自动生成适当的测试脚本,以便按照预期的方式创建或自动生成适当的测试脚本,以便按照预期的方式实施(并执行)测试用例和测试过程实施(并执行)测试用例和测试过程

187、n工具向导:工具向导:uRationalRobotF使用使用RationalRobot设置测试环境设置测试环境F使用使用RationalRobot创建测试脚本创建测试脚本nRationalTestManageru使用使用RationalTestManager评估基于需求的代码覆盖评估基于需求的代码覆盖nRationalTestFactoryu使用使用RationalTestFactory设置测试环境设置测试环境u使用使用RationalTestFactory自动生成测试脚本自动生成测试脚本u使用使用RationalTestFactory评测与评估基于代码的测试对评测与评估基于代码的测试对Rat

188、ionalRobot脚本的覆盖脚本的覆盖记录、生成或通过编程创建测试脚本记录、生成或通过编程创建测试脚本nRationalPurifyu使用使用RationalPurify检测运行时错误检测运行时错误nRationalPureCoverageu使用使用RationalPureCoverage评估代码覆盖评估代码覆盖nRationalQuantifyu使用使用RationalQuantify查找性能瓶颈查找性能瓶颈nRationalLoadTestu记录性能测试会话记录性能测试会话u制定表示性能测试工作量的性能测试时间表制定表示性能测试工作量的性能测试时间表n执行下列操作:执行下列操作:u创建、

189、生成或获取测试脚本创建、生成或获取测试脚本u测试测试/调试测试脚本调试测试脚本u复审和评估测试覆盖复审和评估测试覆盖创建、生成或获取测试脚本创建、生成或获取测试脚本n对于测试模型中的每个结构化测试过程,需创建或对于测试模型中的每个结构化测试过程,需创建或生成至少一个测试脚本。生成至少一个测试脚本。n在创建、生成或获取测试脚本时,应考虑以下方面:在创建、生成或获取测试脚本时,应考虑以下方面:u尽量增大测试脚本的复用程度尽量增大测试脚本的复用程度u尽量减小测试脚本的维护程度尽量减小测试脚本的维护程度u使用现有脚本(如果可行)使用现有脚本(如果可行)u使用测试工具(而不通过编程)创建测试脚本使用测试

190、工具(而不通过编程)创建测试脚本(如果可行)(如果可行)u以最稳定的方法(如通过对象名或鼠标单击)访以最稳定的方法(如通过对象名或鼠标单击)访问应用程序问应用程序GUI对象和操作对象和操作创建、生成或获取测试脚本创建、生成或获取测试脚本n要创建、生成或获取测试脚本,请执行以下步骤:要创建、生成或获取测试脚本,请执行以下步骤:u复审现有的测试脚本,了解其使用潜力复审现有的测试脚本,了解其使用潜力u设置测试环境(包括所有硬件、软件、工具、数据与应用程序工作版设置测试环境(包括所有硬件、软件、工具、数据与应用程序工作版本)本)u将测试环境初始化(以确保环境处于适当的测试状态或条件)将测试环境初始化(

191、以确保环境处于适当的测试状态或条件)u创建或获取测试脚本:创建或获取测试脚本:F记录记录/获取:对于各个结构化测试过程,在执行测试过程以创建新的测试获取:对于各个结构化测试过程,在执行测试过程以创建新的测试脚本时,应遵循结构化测试过程中所确定的步骤脚本时,应遵循结构化测试过程中所确定的步骤/操作,并使用适当的记操作,并使用适当的记录技术来尽量增大复用性并减小维护程度。录技术来尽量增大复用性并减小维护程度。F修改现有脚本:手工编辑现有脚本,或按照上述记录说明删除不需要的指修改现有脚本:手工编辑现有脚本,或按照上述记录说明删除不需要的指令,并重新记录新的指令令,并重新记录新的指令F编程:对于每个结

192、构化测试过程,使用适当的编程技术来生成指令编程:对于每个结构化测试过程,使用适当的编程技术来生成指令u要自动生成测试脚本,请参考具体的测试脚本生成工具。要自动生成测试脚本,请参考具体的测试脚本生成工具。u继续创建、生成或获取代码,直至创建了所期望的继续创建、生成或获取代码,直至创建了所期望的/需要的测试脚本需要的测试脚本u根据需要修改这些测试脚本(测试模型中有所说明)根据需要修改这些测试脚本(测试模型中有所说明)测试测试/调试测试脚本调试测试脚本n在完成测试脚本的创建、生成或获取时,应该对测在完成测试脚本的创建、生成或获取时,应该对测试脚本进行测试试脚本进行测试/调试,以确保这些测试脚本能正确

193、调试,以确保这些测试脚本能正确地实施和执行测试。执行本步骤所用的软件工作版地实施和执行测试。执行本步骤所用的软件工作版本应与创建本应与创建/获取测试脚本所用的版本相同。获取测试脚本所用的版本相同。n要测试要测试/调试测试脚本,请执行以下步骤:调试测试脚本,请执行以下步骤:u设置测试环境(如果需要)设置测试环境(如果需要)u重新将环境初始化重新将环境初始化u执行测试脚本执行测试脚本u评估结果评估结果u确定下一步应执行的操作:确定下一步应执行的操作:F得到需要得到需要/期望的结果:无需执行操作期望的结果:无需执行操作F得到意外结果:确定问题的原因并予以解决得到意外结果:确定问题的原因并予以解决复审

194、和评估测试覆盖复审和评估测试覆盖n在完成测试脚本的创建、生成或获取时,应生成测在完成测试脚本的创建、生成或获取时,应生成测试覆盖报告,以核实测试脚本已实现预期的测试覆试覆盖报告,以核实测试脚本已实现预期的测试覆盖。盖。确定设计与实施模型中的测试专用功能确定设计与实施模型中的测试专用功能n目的目的:指定实施或执行测试所需的软件支持功能方面的需求指定实施或执行测试所需的软件支持功能方面的需求n确定设计模型与实施模型中应包括的测试专用功能。测试专用功能最常确定设计模型与实施模型中应包括的测试专用功能。测试专用功能最常用于集成测试中,因为集成测试需要为未包括与未实施的构件或系统提供用于集成测试中,因为

195、集成测试需要为未包括与未实施的构件或系统提供桩模块或驱动程序。桩模块或驱动程序。n有两种形式的桩模块或驱动程序:有两种形式的桩模块或驱动程序:u只是只是“哑元哑元”的桩模块和驱动程序,除了输入特定值或返回预定义值的桩模块和驱动程序,除了输入特定值或返回预定义值以外,它们不具有任何其他功能。以外,它们不具有任何其他功能。u更加智能化的桩模块和驱动程序,它们可以模拟较为复杂的行为。更加智能化的桩模块和驱动程序,它们可以模拟较为复杂的行为。n第二种形式应慎重使用,因为它需要较多的资源才能实施。所以,务必要第二种形式应慎重使用,因为它需要较多的资源才能实施。所以,务必要在附加的价值(通过创建复杂的桩模

196、块在附加的价值(通过创建复杂的桩模块/驱动程序)和实施与测试桩模块驱动程序)和实施与测试桩模块/驱动程序所需的工作量之间保持平衡。驱动程序所需的工作量之间保持平衡。n构建测试专用构件的其他原因包括:构建测试专用构件的其他原因包括:u在没有测试自动化工具的情况下实现回归测试过程的自动化,或在没有测试自动化工具的情况下实现回归测试过程的自动化,或u构建测试对象与测试自动化工具之间的接口。构建测试对象与测试自动化工具之间的接口。u按照对(移交给设计员与实施员的)设计与实施模型的需求,描述您按照对(移交给设计员与实施员的)设计与实施模型的需求,描述您的结果。的结果。建立外部数据集建立外部数据集n目的目

197、的:为了创建和维护数据,应将数据保存在测试脚为了创建和维护数据,应将数据保存在测试脚本的外部,由测试脚本在执行测试时使用。本的外部,由测试脚本在执行测试时使用。nn外部数据集以如下方式向测试提供值:外部数据集以如下方式向测试提供值:u数据位于测试脚本之外,从而消除了测试脚本中的硬数据位于测试脚本之外,从而消除了测试脚本中的硬编码引用编码引用u外部数据可以很容易地进行修改,修改后测试脚本不外部数据可以很容易地进行修改,修改后测试脚本不会受到影响(或只受到很小的影响)会受到影响(或只受到很小的影响)u其他测试用例可以很容易地添加到测试数据中,添加其他测试用例可以很容易地添加到测试数据中,添加后无需

198、修改测试脚本(或仅作很小的修改)后无需修改测试脚本(或仅作很小的修改)u外部数据可以由许多测试用例共享外部数据可以由许多测试用例共享u外部数据集可以包括用于控制测试脚本的数据值(有外部数据集可以包括用于控制测试脚本的数据值(有条件的分支逻辑)条件的分支逻辑)创建创建/维护外部数据集维护外部数据集n要创建外部数据集,请执行以下步骤:要创建外部数据集,请执行以下步骤:u复审测试模型、测试用例和结构化测试过程复审测试模型、测试用例和结构化测试过程u使用适当的工具和方法创建数据集使用适当的工具和方法创建数据集u修改测试脚本以便使用数据集修改测试脚本以便使用数据集测试测试/调试测试脚本调试测试脚本n在完

199、成测试脚本的创建、生成或获取时,应该对测试脚本进在完成测试脚本的创建、生成或获取时,应该对测试脚本进行测试行测试/调试,以确保这些测试脚本能正确地实施和执行测试。调试,以确保这些测试脚本能正确地实施和执行测试。执行本步骤所用的软件工作版本应与创建执行本步骤所用的软件工作版本应与创建/获取测试脚本所用获取测试脚本所用的版本相同。的版本相同。n要测试要测试/调试测试脚本,请执行以下步骤:调试测试脚本,请执行以下步骤:u设置测试环境(如果需要)设置测试环境(如果需要)u重新将环境初始化重新将环境初始化u执行测试脚本执行测试脚本u评估结果评估结果u确定下一步应执行的操作:确定下一步应执行的操作:F得到

200、需要得到需要/期望的结果:无需执行操作期望的结果:无需执行操作F得到意外结果:确定问题的原因并予以解决得到意外结果:确定问题的原因并予以解决测试脚本测试脚本n测试脚本是自动执行测试过程(或部分测试过程)测试脚本是自动执行测试过程(或部分测试过程)的计算机可读指令。测试脚本可以被创建(记录)的计算机可读指令。测试脚本可以被创建(记录)或使用测试自动化工具自动生成,或用编程语言编或使用测试自动化工具自动生成,或用编程语言编程来完成,也可综合前三种方法来完成。程来完成,也可综合前三种方法来完成。测试脚本的结构测试脚本的结构n为了提高测试脚本的可维护性和可复用性,必须在执行测试脚本之前对它为了提高测试

201、脚本的可维护性和可复用性,必须在执行测试脚本之前对它们进行构建。或许会发现这样的情况,即有的操作将出现在几个测试过程们进行构建。或许会发现这样的情况,即有的操作将出现在几个测试过程中。因此,应有目的地确定这些操作的目标,这样就可以复用它们的实施。中。因此,应有目的地确定这些操作的目标,这样就可以复用它们的实施。n例如,可以采用这样一些测试过程,这些过程是由对某个记录执行的不同例如,可以采用这样一些测试过程,这些过程是由对某个记录执行的不同操作组成的。这些测试过程可能是添加、修改和删除某个记录的操作的组操作组成的。这些测试过程可能是添加、修改和删除某个记录的操作的组合:合:u添加、修改、删除(显

202、而易见的操作)添加、修改、删除(显而易见的操作)u增加、删除、修改增加、删除、修改u增加、删除、增加、删除增加、删除、增加、删除.u增加、增加、增加增加、增加、增加.n如果把这些操作看作是独立的测试过程,分别在不同的测试脚本中对它们如果把这些操作看作是独立的测试过程,分别在不同的测试脚本中对它们进行实施,而且在其他测试过程中复用它们,那么可以达到更高的复用水进行实施,而且在其他测试过程中复用它们,那么可以达到更高的复用水平。平。n另外,还可以有目的地以如下方式来构建测试过程:更改目标软件时,需另外,还可以有目的地以如下方式来构建测试过程:更改目标软件时,需要对测试过程进行局部的可控制的变更。这

203、将使得测试过程和测试脚本对要对测试过程进行局部的可控制的变更。这将使得测试过程和测试脚本对目标软件的变化有更大的应变能力。例如,假设软件的登录部分已经改变。目标软件的变化有更大的应变能力。例如,假设软件的登录部分已经改变。在遍历该登录部分的所有测试用例中,只有关于登录的测试过程和测试脚在遍历该登录部分的所有测试用例中,只有关于登录的测试过程和测试脚本需要进行改变。本需要进行改变。记录技术记录技术n为使测试脚本获得更高的可维护性,应该以最不易受测试对为使测试脚本获得更高的可维护性,应该以最不易受测试对象变化影响的方式来记录测试脚本。例如,在填写对话框字象变化影响的方式来记录测试脚本。例如,在填写

204、对话框字段的测试脚本中,从一个字段跳转到下一个字段有以下几种段的测试脚本中,从一个字段跳转到下一个字段有以下几种选择方式:选择方式:u使用使用TAB键键u使用鼠标使用鼠标u使用键盘快捷键使用键盘快捷键n在这些选择中,有一些选择更易于受到设计变化的影响。如在这些选择中,有一些选择更易于受到设计变化的影响。如果在屏幕上插入了一个新的字段,则使用果在屏幕上插入了一个新的字段,则使用TAB键将不是很可键将不是很可靠。如果重新指定快捷键,则它们也无法提供可靠的记录手靠。如果重新指定快捷键,则它们也无法提供可靠的记录手段。当使用鼠标确定字段的方法受变化制约时,这种方法亦段。当使用鼠标确定字段的方法受变化制

205、约时,这种方法亦不可靠。然而,一些测试自动化工具带有测试脚本记录器,不可靠。然而,一些测试自动化工具带有测试脚本记录器,可以通过比较可靠的方法来命令记录器标识该字段,例如可可以通过比较可靠的方法来命令记录器标识该字段,例如可以通过开发工具(以通过开发工具(PowerBuilder、SQLWindows或或VisualBasic)来指定它的对象名。在这种方式下,记录的测试脚本)来指定它的对象名。在这种方式下,记录的测试脚本不会受用户界面的微小变化所影响(例如,布局变更、字段不会受用户界面的微小变化所影响(例如,布局变更、字段标签变更、格式变更等等)。标签变更、格式变更等等)。数据驱动的测试数据驱

206、动的测试n许多测试过程包括在给定的数据输入屏幕内输入几组字段数据,检查字段许多测试过程包括在给定的数据输入屏幕内输入几组字段数据,检查字段确认功能、错误处理等等。它们的过程步骤都是一样的;只有数据不同。确认功能、错误处理等等。它们的过程步骤都是一样的;只有数据不同。不要记录每个输入数据集的测试脚本,而应该建立单独的记录,然后对其不要记录每个输入数据集的测试脚本,而应该建立单独的记录,然后对其进行修改以处理多个数据集。例如,因为无效数据而产生相同错误的所有进行修改以处理多个数据集。例如,因为无效数据而产生相同错误的所有数据集可以共享同一个已记录的测试脚本。对测试脚本进行修改,将数据数据集可以共享

207、同一个已记录的测试脚本。对测试脚本进行修改,将数据作为可变信息进行访问,从文件或其他外部源中读取这些数据集,而且在作为可变信息进行访问,从文件或其他外部源中读取这些数据集,而且在所有相关数据集间循环执行。所有相关数据集间循环执行。n如果在编制测试脚本或测试代码时已经考虑了输入数据集和输出数据集的如果在编制测试脚本或测试代码时已经考虑了输入数据集和输出数据集的循环执行因素,则必须先建立相应数据集。这些数据集的常用格式是文本循环执行因素,则必须先建立相应数据集。这些数据集的常用格式是文本文件中用逗号隔开的字段的记录。这种格式易于从测试脚本和测试代码中文件中用逗号隔开的字段的记录。这种格式易于从测试

208、脚本和测试代码中读取,同时也易于创建和维护。读取,同时也易于创建和维护。n多数数据库包和电子表格包可以生成逗号分隔的文本输出。采用这些包来多数数据库包和电子表格包可以生成逗号分隔的文本输出。采用这些包来组织或获取数据集有两个重要的优点。首先,它们为输入和编辑数据提供组织或获取数据集有两个重要的优点。首先,它们为输入和编辑数据提供一个构造环境,比单纯使用文本编辑器或文字处理软件要好。其次,它们一个构造环境,比单纯使用文本编辑器或文字处理软件要好。其次,它们大多具有查询现有的数据库并捕获返回数据的能力,因此很容易从现有源大多具有查询现有的数据库并捕获返回数据的能力,因此很容易从现有源中提取数据集。

209、中提取数据集。错误处理错误处理n已记录的测试脚本是按顺序执行的。不存在分支点。已记录的测试脚本是按顺序执行的。不存在分支点。测试脚本强壮的错误处理功能要求增加响应错误条测试脚本强壮的错误处理功能要求增加响应错误条件的逻辑。当错误发生时可以应用的决策逻辑包括:件的逻辑。当错误发生时可以应用的决策逻辑包括:u分支到另外的测试脚本上。分支到另外的测试脚本上。u调用试图清除错误条件的脚本。调用试图清除错误条件的脚本。u退出该脚本,并启动下一个脚本。退出该脚本,并启动下一个脚本。u退出脚本和软件,重启,并在该脚本失败后重新开始退出脚本和软件,重启,并在该脚本失败后重新开始测试下一个测试脚本。测试下一个测

210、试脚本。n每一种处理错误的技术都需要有添加到测试脚本中每一种处理错误的技术都需要有添加到测试脚本中的编程逻辑。因此,该逻辑应该尽可能地限制在用的编程逻辑。因此,该逻辑应该尽可能地限制在用来控制低级测试脚本排序的高层测试脚本。这就使来控制低级测试脚本排序的高层测试脚本。这就使得低级测试脚本完全可以从记录中进行创建。得低级测试脚本完全可以从记录中进行创建。测试脚本同步和时间安排测试脚本同步和时间安排n当进行重点测试时,通常需要同步测试脚本以便它们在预先确定的时间启当进行重点测试时,通常需要同步测试脚本以便它们在预先确定的时间启动。通过将期望的开始时间与系统时间比较,可以修改测试脚本以便它们动。通过

211、将期望的开始时间与系统时间比较,可以修改测试脚本以便它们可以在某个特定的时间启动。在联网系统中,每个测试站将通过网络共享可以在某个特定的时间启动。在联网系统中,每个测试站将通过网络共享同一个时钟。在以下示例中(在用同一个时钟。在以下示例中(在用VisualBasic编写的脚本中),有关编写的脚本中),有关语句已在脚本启动前插入,以使在达到脚本启动时间前将其挂起。语句已在脚本启动前插入,以使在达到脚本启动时间前将其挂起。InputFile$=TIME.DATOpenInputFile$ForInputAs1Input#1,StartTime$Close#1DoWhileTimeValue(Sta

212、rtTime$)TimeDoEventsLoopStartscriptn本示例中,要求的开始时间存储在一个文件里。这样,更改开始时间时就本示例中,要求的开始时间存储在一个文件里。这样,更改开始时间时就无需更改测试脚本。读取该时间并储存到一个名为无需更改测试脚本。读取该时间并储存到一个名为StartTime$的变量中。的变量中。DoWhile循环一直进行到到达开始时间为止。循环一直进行到到达开始时间为止。DoEvents语句非常重要。语句非常重要。它允许在测试脚本被挂起和等待启动时执行后台任务。如果没有它允许在测试脚本被挂起和等待启动时执行后台任务。如果没有DoEvents语句,那么系统在开始时

213、间到达之前没有任何响应。语句,那么系统在开始时间到达之前没有任何响应。测试和调试测试脚本测试和调试测试脚本n在记录测试脚本的同一测试软件上执行这些最近记录的测试在记录测试脚本的同一测试软件上执行这些最近记录的测试脚本时,不应该发生任何错误。此时的环境及软件与它被记脚本时,不应该发生任何错误。此时的环境及软件与它被记录的时候是相同的。可能存在测试脚本无法成功运行的情况。录的时候是相同的。可能存在测试脚本无法成功运行的情况。对该测试脚本进行测试将暴露这些情况,并允许在实际测试对该测试脚本进行测试将暴露这些情况,并允许在实际测试之前对其进行修正。以下讨论了三种典型问题:之前对其进行修正。以下讨论了三

214、种典型问题:u对用于在用户界面选择记录项的方法而言,若存在多义性,将对用于在用户界面选择记录项的方法而言,若存在多义性,将使得测试脚本在回放时进行不同操作。例如,通过文本(或标使得测试脚本在回放时进行不同操作。例如,通过文本(或标题)识别的两个记录项可能拥有完全相同的文本。当执行该脚题)识别的两个记录项可能拥有完全相同的文本。当执行该脚本时,将会产生多义性。本时,将会产生多义性。u虽然测试运行虽然测试运行/会话特定的数据被记录下来(即,指针、日期会话特定的数据被记录下来(即,指针、日期/时时间戳或其他一些系统生成的数据值),但是它们与回放时的数间戳或其他一些系统生成的数据值),但是它们与回放时

215、的数据不同。据不同。n在记录和回放时的时间差异会导致问题产生。记录测试脚本在记录和回放时的时间差异会导致问题产生。记录测试脚本比执行测试脚本在过程上一直要慢得多。有时,产生的时间比执行测试脚本在过程上一直要慢得多。有时,产生的时间差异会导致测试脚本先于软件运行。这种情况下,可以插入差异会导致测试脚本先于软件运行。这种情况下,可以插入等待状态以调整测试脚本相对于软件的运行速度。等待状态以调整测试脚本相对于软件的运行速度。活动:设计测试包和测试类活动:设计测试包和测试类n目的目的u设计测试专用功能设计测试专用功能n步骤步骤u确定测试专用包和类确定测试专用包和类u设计自动测试工具的接口设计自动测试工

216、具的接口u设计测试过程的行为设计测试过程的行为n输入工件:输入工件:u设计类与设计包设计类与设计包u测试过程测试过程u测试用例测试用例u测试类测试类u测试包测试包n生成工件:生成工件:u测试类,已精化测试类,已精化u测试包,已精化测试包,已精化确定测试专用包和类确定测试专用包和类n目的目的:确定并设计类和包,它们将提供所需的测试专用功能。确定并设计类和包,它们将提供所需的测试专用功能。n以测试设计员的输入为基础,在设计模型中确定测试专用类以测试设计员的输入为基础,在设计模型中确定测试专用类和包。和包。n设计类的驱动程序或桩模块具备的方法与初始类相同,但是设计类的驱动程序或桩模块具备的方法与初始

217、类相同,但是对这些方法仅定义了对这些方法仅定义了n提供输入(向测试对象)或返回一个预定义值(向测试对象)提供输入(向测试对象)或返回一个预定义值(向测试对象)的行为,除此未定义其他行为。的行为,除此未定义其他行为。n设计包的驱动程序或桩模块包括一些模拟类,它们模拟了形设计包的驱动程序或桩模块包括一些模拟类,它们模拟了形成原始包公有接口的那些类。成原始包公有接口的那些类。设计自动测试工具的接口设计自动测试工具的接口n目的目的:确定将自动测试工具与测试专用功能集成所必确定将自动测试工具与测试专用功能集成所必需的接口。需的接口。nn确定您的测试自动工具与测试对象进行有效通信所确定您的测试自动工具与测

218、试对象进行有效通信所需的行为。需的行为。n确定并说明适合的设计类和设计包。确定并说明适合的设计类和设计包。设计测试过程的行为设计测试过程的行为n目的目的:让不具备自动测试工具的测试过程实现自动化。让不具备自动测试工具的测试过程实现自动化。nn让不具备自动工具的测试过程实现自动化,并确定让不具备自动工具的测试过程实现自动化,并确定适合的设计类和设计包。适合的设计类和设计包。n将测试用例与其原始用例用作输入。将测试用例与其原始用例用作输入。活动:实施测试构件和子系统活动:实施测试构件和子系统n目的目的u实施测试专用功能实施测试专用功能n步骤步骤u实施驱动程序实施驱动程序/桩模块并对其进行单元测试桩

219、模块并对其进行单元测试u实施与自动测试工具的单元测试接口实施与自动测试工具的单元测试接口u实施与单元测试的测试过程行为实施与单元测试的测试过程行为n输入工件:输入工件:u测试类和测试包测试类和测试包u构件和实施子系统构件和实施子系统u测试构件测试构件u测试过程测试过程u测试用例测试用例n生成工件:生成工件:u测试构件测试构件u测试子系统测试子系统活动:实施测试构件和子系统活动:实施测试构件和子系统n实施与单元测试驱动程序实施与单元测试驱动程序/桩模块桩模块u目的目的:确定并设计将提供所需的测试专用功能的类和包确定并设计将提供所需的测试专用功能的类和包n实施与自动测试工具的单元测试接口实施与自动

220、测试工具的单元测试接口u目的目的:确定在集成自动测试工具与测试专用功能时所必确定在集成自动测试工具与测试专用功能时所必需的接口。需的接口。n实施与单元测试的测试过程行为实施与单元测试的测试过程行为u目的目的:使没有自动测试工具的测试过程实现自动化。使没有自动测试工具的测试过程实现自动化。在集成测试阶段执行测试在集成测试阶段执行测试目的目的n集成测试阶段的目的是确保各构件组合在一起后能集成测试阶段的目的是确保各构件组合在一起后能够按既定意图协作运行,并确保增量的行为正确。够按既定意图协作运行,并确保增量的行为正确。系统集成员在各增量中编译并链接系统。每一增量系统集成员在各增量中编译并链接系统。每

221、一增量都需要测试增加的功能,并进行以前版本测试过的都需要测试增加的功能,并进行以前版本测试过的所有测试(回归测试)。所有测试(回归测试)。n在一次迭代中,将多次执行集成测试,直到整个系在一次迭代中,将多次执行集成测试,直到整个系统(由迭代目标定义)集成成功。该活动的输出工统(由迭代目标定义)集成成功。该活动的输出工件即测试结果。件即测试结果。n在迭代的最后,应该测试整个系统。系统测试的重在迭代的最后,应该测试整个系统。系统测试的重点通常在系统与其主角之间的交互上。点通常在系统与其主角之间的交互上。如何配备人员如何配备人员n测试员是此工作流程明细所涉及的主要角色,但也测试员是此工作流程明细所涉及

222、的主要角色,但也存在与实施员和系统集成员的交互。此外,如果需存在与实施员和系统集成员的交互。此外,如果需要测试类和包,则还存在与这些角色的额外交互。要测试类和包,则还存在与这些角色的额外交互。工作指南工作指南n测试的执行必须在受控环境中进行。这包括:测试的执行必须在受控环境中进行。这包括:u不受非测试因素影响的测试系统不受非测试因素影响的测试系统u为测试系统设置已知初始状态并在测试结束时返回该为测试系统设置已知初始状态并在测试结束时返回该状态(以重复执行测试)的能力。状态(以重复执行测试)的能力。在系统测试阶段执行测试在系统测试阶段执行测试目的目的n系统测试阶段的目的是确保整个系统按既定意图运

223、系统测试阶段的目的是确保整个系统按既定意图运行。系统集成员在各增量中编译并链接系统。每一行。系统集成员在各增量中编译并链接系统。每一增量都需要测试增加的功能,并进行以前版本测试增量都需要测试增加的功能,并进行以前版本测试过的所有测试(回归测试)。过的所有测试(回归测试)。n在一次迭代中,将多次执行系统测试,直到整个系在一次迭代中,将多次执行系统测试,直到整个系统(由迭代目标定义)按既定意图运行并达到测试统(由迭代目标定义)按既定意图运行并达到测试成功或完成的标准为止。该活动的输出工件即测试成功或完成的标准为止。该活动的输出工件即测试结果。结果。如何配备人员如何配备人员n测试员是此工作流程明细所

224、涉及的主要角色,但也测试员是此工作流程明细所涉及的主要角色,但也存在与实施员和系统集成员的交互。此外,如果需存在与实施员和系统集成员的交互。此外,如果需要测试类和包,则还存在与这些角色的额外交互。要测试类和包,则还存在与这些角色的额外交互。工作指南工作指南n测试的执行必须在受控环境中进行。这包括:测试的执行必须在受控环境中进行。这包括:u不受非测试因素影响的测试系统不受非测试因素影响的测试系统u为测试系统设置已知初始状态并在测试结束时返回该为测试系统设置已知初始状态并在测试结束时返回该状态(以重复执行测试)的能力。状态(以重复执行测试)的能力。活动:执行测试活动:执行测试n目的目的u执行测试并

225、获取测试结果。执行测试并获取测试结果。n步骤步骤u执行测试过程执行测试过程u评估测试的执行情况评估测试的执行情况u核实测试结果核实测试结果u恢复暂停的测试恢复暂停的测试nn输入工件:输入工件:u构件构件u开发基础设施开发基础设施u实施子系统实施子系统u软件工作版本软件工作版本u测试用例测试用例u测试模型测试模型u测试过程测试过程u测试脚本测试脚本u测试构件测试构件u测试子系统测试子系统n生成工件:生成工件:u测试结果测试结果执行测试过程执行测试过程n目的目的:执行测试过程(对于自动测试,则执行测试脚本)执行测试过程(对于自动测试,则执行测试脚本)n工具向导:工具向导:uRationalRobo

226、tF使用使用RationalRobot设置测试环境设置测试环境F使用使用RationalRobot执行测试执行测试uRationalTestFactoryF使用使用RationalTestFactory执行一套测试脚本执行一套测试脚本uRationalLoadTestF执行性能测试时间表执行性能测试时间表n执行测试时应遵循以下步骤:执行测试时应遵循以下步骤:u设置测试环境,确保所需的全部构件(硬件、软件、工具、数据等)设置测试环境,确保所需的全部构件(硬件、软件、工具、数据等)都已实施并处于测试环境中。都已实施并处于测试环境中。u将测试环境初始化,以确保所有构件都处于正确的初始状态,可以开将测

227、试环境初始化,以确保所有构件都处于正确的初始状态,可以开始测试。始测试。u执行测试过程。执行测试过程。n注:测试过程的执行方式将依据测试是自动测试还是手工测试而有所不同。注:测试过程的执行方式将依据测试是自动测试还是手工测试而有所不同。u自动测试:执行在实施测试活动中创建的测试脚本。自动测试:执行在实施测试活动中创建的测试脚本。u手工测试:按照在设计测试活动中制定的结构化测试过程来手工执行手工测试:按照在设计测试活动中制定的结构化测试过程来手工执行测试测试评估测试的执行情况评估测试的执行情况n目的目的u确定是将测试执行完毕还是暂停测试确定是将测试执行完毕还是暂停测试u确定是否需要纠正措施确定是

228、否需要纠正措施n工具向导:工具向导:uRationalLogViewer:F使用使用RationalLogViewer评估测试的执行情况评估测试的执行情况uRationalTestFactory:F使用使用RationalTestFactory评估一套测试脚本的执行结果评估一套测试脚本的执行结果F使用使用RationalTestFactory评测与评估基于代码的测试对评测与评估基于代码的测试对RationalRobot*脚本的覆盖脚本的覆盖F使用使用RationalTestFactory评估测试覆盖评估测试覆盖F使用使用RationalTestFactory、RationalRobot和和Ra

229、tionalLogViewer分析自动生成的测试脚本分析自动生成的测试脚本uRationalLoadTest:F监控性能测试进度监控性能测试进度n评估测试的执行情况评估测试的执行情况n测试执行活动结束或终止时,以下两种情况之一会测试执行活动结束或终止时,以下两种情况之一会出现:出现:u正常终止:所有测试过程(或脚本)按预期方式执行正常终止:所有测试过程(或脚本)按预期方式执行至结束。至结束。n如果测试正常结束,则继续核实测试结果:如果测试正常结束,则继续核实测试结果:u异常或提前结束:测试过程(或脚本)没有按预期方异常或提前结束:测试过程(或脚本)没有按预期方式执行或没有完全执行。当测试异常终

230、止时,测试结式执行或没有完全执行。当测试异常终止时,测试结果可能不可靠。在执行任何其他测试活动之前,应确果可能不可靠。在执行任何其他测试活动之前,应确定并解决异常定并解决异常/提前终止的原因,然后重新执行测试。提前终止的原因,然后重新执行测试。n如果测试异常终止,则继续恢复暂停的测试如果测试异常终止,则继续恢复暂停的测试核实测试结果核实测试结果n目的目的u确定测试结果是否可靠确定测试结果是否可靠u针对测试结果表明的测试工作或测试工件中存在的缺针对测试结果表明的测试工作或测试工件中存在的缺陷,确定合适的纠正措施陷,确定合适的纠正措施n工具向导:工具向导:u使用使用RationalLogViewe

231、r评估测试的执行情况中的评估测试的执行情况中的“核实测试结果核实测试结果”和和“调查意外结果调查意外结果”部分部分n测试完成后,应当复审测试结果以确保测试结果可测试完成后,应当复审测试结果以确保测试结果可靠,确保所报告的故障、警告或意外结果不是(对靠,确保所报告的故障、警告或意外结果不是(对测试对象的)外部影响(例如,不正确的设置或数测试对象的)外部影响(例如,不正确的设置或数据等)造成的。据等)造成的。核实测试结果核实测试结果n在测试过程和测试脚本完全执行时所报告的故障中,最常见的故障及其纠在测试过程和测试脚本完全执行时所报告的故障中,最常见的故障及其纠正操作为:正操作为:u测试核实故障测试

232、核实故障-通常发生在实际结果与预期结果不匹配时。验证所用通常发生在实际结果与预期结果不匹配时。验证所用的核实方法仅侧重于基本项与的核实方法仅侧重于基本项与/或特征,并在必要时进行修改。或特征,并在必要时进行修改。u意外的意外的GUI窗口窗口-发生这种情况有好几种产生原因。最常见的原因是发生这种情况有好几种产生原因。最常见的原因是当前的当前的GUI窗口并不是预期的窗口,或所显示的窗口并不是预期的窗口,或所显示的GUI窗口数目大于窗口数目大于预期的数目。确保为正确执行测试而设置了测试环境并对其进行了初预期的数目。确保为正确执行测试而设置了测试环境并对其进行了初始化。始化。uGUI窗口遗失窗口遗失-

233、如果某个如果某个GUI窗口应该可用(不一定是当前窗口)但窗口应该可用(不一定是当前窗口)但实际上却不可用,则应记录该故障。确保为正确执行测试而设置了测实际上却不可用,则应记录该故障。确保为正确执行测试而设置了测试环境并对其进行了初始化。确保实际遗失的窗口已从测试对象中删试环境并对其进行了初始化。确保实际遗失的窗口已从测试对象中删除。除。n如果所报告的故障是在测试工件中确定的错误导致的,或者是测试环境的如果所报告的故障是在测试工件中确定的错误导致的,或者是测试环境的问题造成的,则应当采取适当的纠正措施进行纠正,然后重新执行测试。问题造成的,则应当采取适当的纠正措施进行纠正,然后重新执行测试。有关

234、其他信息,请参见下面的有关其他信息,请参见下面的“恢复暂停的测试恢复暂停的测试”。n如果测试结果表明故障确实是由测试对象造成的,就可认为执行测试活动如果测试结果表明故障确实是由测试对象造成的,就可认为执行测试活动已完成。已完成。恢复暂停的测试恢复暂停的测试n目的目的u确定适当的纠正措施,以便恢复暂停的测试确定适当的纠正措施,以便恢复暂停的测试u纠正问题,恢复并重新执行测试纠正问题,恢复并重新执行测试n工具向导:工具向导:u使用使用RationalLogViewer评估测试的执行情况中的评估测试的执行情况中的“恢复暂停的测恢复暂停的测试试”部分部分n暂停的测试主要有两种类型:暂停的测试主要有两种

235、类型:u致命错误致命错误-系统故障(网络故障、硬件崩溃等)系统故障(网络故障、硬件崩溃等)u测试脚本命令故障测试脚本命令故障-针对自动测试,指测试脚本无法执行某条命令针对自动测试,指测试脚本无法执行某条命令(或代码行)。(或代码行)。n这两种类型的测试异常终止可能会表现出相同的故障现象:这两种类型的测试异常终止可能会表现出相同的故障现象:u当执行测试脚本时,出现许多意外的操作、窗口或事件当执行测试脚本时,出现许多意外的操作、窗口或事件u测试环境没有响应或处于非理想状态(如悬挂或崩溃)。测试环境没有响应或处于非理想状态(如悬挂或崩溃)。n要恢复暂停的测试,请执行如下步骤:要恢复暂停的测试,请执行

236、如下步骤:u确定问题的实际原因确定问题的实际原因u纠正问题纠正问题u重新设置测试环境重新设置测试环境u重新初始化测试环境重新初始化测试环境u重新执行测试重新执行测试评估测试评估测试目的目的n评估测试的目的是生成并交付测试评估摘要。这是评估测试的目的是生成并交付测试评估摘要。这是通过复审并评估测试结果、确定并记录变更请求,通过复审并评估测试结果、确定并记录变更请求,以及计算主要测试评测方法来完成的。测试评估摘以及计算主要测试评测方法来完成的。测试评估摘要以组织有序的格式提供测试结果和主要测试评测要以组织有序的格式提供测试结果和主要测试评测方法,用于评估测试对象和测试流程的质量。方法,用于评估测试

237、对象和测试流程的质量。n如何配备人员如何配备人员n测试设计员负责复审和评估测试对象和测试流程的测试设计员负责复审和评估测试对象和测试流程的质量。他们必须熟悉测试指标和统计学。质量。他们必须熟悉测试指标和统计学。工作指南工作指南n在此工作流程明细中,要使用两种主要的评测方法:在此工作流程明细中,要使用两种主要的评测方法:u覆盖指标覆盖指标-判定是否已经实施和执行了充分的测试判定是否已经实施和执行了充分的测试u质量指标质量指标-确定测试对象和测试流程的质量。确定测试对象和测试流程的质量。n活动:评估测试活动:评估测试n目的目的u评估测试结果并记录变更请求。评估测试结果并记录变更请求。u计算并交付测

238、试的主要评测方计算并交付测试的主要评测方法。法。u生成测试评估摘要。生成测试评估摘要。n步骤步骤u分析测试结果并提交变更请求分析测试结果并提交变更请求u评估基于需求的测试覆盖评估基于需求的测试覆盖u评估基于代码的测试覆盖评估基于代码的测试覆盖u分析缺陷分析缺陷u确定是否达到了测试的完成标确定是否达到了测试的完成标准和成功标准准和成功标准u生成测试评估摘要生成测试评估摘要nn输入工件:输入工件:u测试计划测试计划u测试用例测试用例u测试结果测试结果nn生成工件:生成工件:u测试评估摘要测试评估摘要u变更请求变更请求n分析测试结果并提交变更请求分析测试结果并提交变更请求n目的目的u确定并评估预期结

239、果和实际结果间存在的差异确定并评估预期结果和实际结果间存在的差异u将变更请求信息输入用于评估、管理与解决的跟踪工具将变更请求信息输入用于评估、管理与解决的跟踪工具n工具向导:工具向导:uRationalLogViewer:F使用使用RationalLogViewer评估测试的执行评估测试的执行uRationalTestFactory:F使用使用RationalTestFactory评估一套测试脚本的执行结果评估一套测试脚本的执行结果uRationalPurify:F使用使用RationalPurify检测运行时错误检测运行时错误uRationalQuantify:F使用使用RationalQu

240、antify查找性能瓶颈查找性能瓶颈uRationalPureCoverage:F使用使用RationalPureCoverage评估代码覆盖评估代码覆盖uRationalClearQuest:F使用使用RationalClearQuest提交变更请求(缺陷)提交变更请求(缺陷)uRationalLoadTestTM:F监控性能测试进度监控性能测试进度F报告性能测试报告性能测试分析测试结果并提交变更请求分析测试结果并提交变更请求n在测试执行活动中,测试结果要经过复审以确保测在测试执行活动中,测试结果要经过复审以确保测试已执行完全,并确保报告的测试结果没有受到非试已执行完全,并确保报告的测试结果

241、没有受到非测试对象因素的影响。测试对象因素的影响。n在此活动中,经过分析的测试结果可以确定预期测在此活动中,经过分析的测试结果可以确定预期测试结果与实际测试结果之间存在的细微差异。这些试结果与实际测试结果之间存在的细微差异。这些差异表明了测试对象中存在潜在缺陷,应将差异作差异表明了测试对象中存在潜在缺陷,应将差异作为变更请求输入跟踪系统为变更请求输入跟踪系统,下一步则应采取相应的纠下一步则应采取相应的纠正操作。正操作。n复审各个已报告的测试故障,并确定将变更请求输复审各个已报告的测试故障,并确定将变更请求输入相应的跟踪系统所需的信息。输入的信息应准确、入相应的跟踪系统所需的信息。输入的信息应准

242、确、适当、并满足既定的变更请求跟踪标准或指南。适当、并满足既定的变更请求跟踪标准或指南。评估基于需求的测试覆盖评估基于需求的测试覆盖n目的目的:u确定是否实现了要求的(或适当的)基于需求的测试覆盖确定是否实现了要求的(或适当的)基于需求的测试覆盖n工具向导:工具向导:uRationalTestManager:F使用使用RationalTestManager复审和评估基于需求的测试覆盖复审和评估基于需求的测试覆盖uRationalTestFactory:F使用使用RationalTestFactory评估测试覆盖评估测试覆盖n要评估基于需求的测试覆盖,您应复审测试结果并决定:要评估基于需求的测试

243、覆盖,您应复审测试结果并决定:u此次迭代中执行的基于需求的测试(测试用例)的数量与测试对象的此次迭代中执行的基于需求的测试(测试用例)的数量与测试对象的总测试数量的比例。总测试数量的比例。u成功执行的测试用例的比例。成功执行的测试用例的比例。n目的是要确保要在本次迭代中进行的基于需求的测试能够百分之百成功执目的是要确保要在本次迭代中进行的基于需求的测试能够百分之百成功执行。如果这是不可能或不可行的,则应确定一个不同的测试覆盖标准,该行。如果这是不可能或不可行的,则应确定一个不同的测试覆盖标准,该标准的基础可以是:标准的基础可以是:u风险或优先级风险或优先级u可接受的覆盖百分比可接受的覆盖百分比

244、n在测试评估报告中记录本次迭代的结果。在测试评估报告中记录本次迭代的结果。评估基于代码的测试覆盖评估基于代码的测试覆盖n目的目的u确定是否实现了要求的(或适当的)基于代码的测试覆盖。确定是否实现了要求的(或适当的)基于代码的测试覆盖。n工具向导:工具向导:uRationalTestFactory:F使用使用RationalTestFactory评估测试覆盖评估测试覆盖F使用使用RationalTestFactory评估一套测试脚本的执行结果评估一套测试脚本的执行结果uRationalPureCoverage:F使用使用RationalPureCoverage评估代码覆盖评估代码覆盖n要评估基于

245、代码的测试覆盖,您应复审测试结果并决定:要评估基于代码的测试覆盖,您应复审测试结果并决定:u在本次迭代的测试期间执行的代码(如代码行或语句)与测试对象中在本次迭代的测试期间执行的代码(如代码行或语句)与测试对象中总代码的比例。总代码的比例。n目的是要确保要在本次迭代中测试的代码百分之百成功执行。如果这是不目的是要确保要在本次迭代中测试的代码百分之百成功执行。如果这是不可能或不可行的,则应确定一个不同的测试覆盖标准,该标准的基础可以可能或不可行的,则应确定一个不同的测试覆盖标准,该标准的基础可以是:是:u风险或优先级风险或优先级u可接受的覆盖百分比可接受的覆盖百分比n在测试评估报告中记录本次迭代

246、的结果。在测试评估报告中记录本次迭代的结果。分析缺陷分析缺陷n目的目的u评估缺陷并推荐适当的后续活动评估缺陷并推荐适当的后续活动u撰写客观报告,传达测试结果撰写客观报告,传达测试结果n工具向导工具向导u使用使用RationalClearQuest报告缺陷趋势和状态报告缺陷趋势和状态n要分析缺陷,应将复审和分析所选评测方法作为缺陷分析战要分析缺陷,应将复审和分析所选评测方法作为缺陷分析战略的一部分。最常用的缺陷评测方法包括(通常以图的形式略的一部分。最常用的缺陷评测方法包括(通常以图的形式显示):显示):u缺陷密度缺陷密度-缺陷的数量以一个或两个缺陷属性(如状态或严重缺陷的数量以一个或两个缺陷属

247、性(如状态或严重性)的函数显示。性)的函数显示。u缺陷趋势缺陷趋势-缺陷数目以随时间变化的函数表示。缺陷数目以随时间变化的函数表示。u缺陷龄期缺陷龄期-是特殊的缺陷密度报告,它通过缺陷在一定时间内是特殊的缺陷密度报告,它通过缺陷在一定时间内保持某特定状态(打开的、新的、待测试的缺陷等)的函数表保持某特定状态(打开的、新的、待测试的缺陷等)的函数表示。示。n将本次迭代的评测方法与先前各次迭代的分析结果进行比较,将本次迭代的评测方法与先前各次迭代的分析结果进行比较,判断缺陷的走势。建议用图来显示结果。判断缺陷的走势。建议用图来显示结果。确定是否达到了测试的完成标准和成功标准确定是否达到了测试的完成

248、标准和成功标准n目的目的u判定测试的执行是否完全、是否可接受判定测试的执行是否完全、是否可接受u确定适当的后续测试活动确定适当的后续测试活动n复审测试计划中制定的测试战略。应根据测试覆盖和复审测试计划中制定的测试战略。应根据测试覆盖和/或缺陷评估结果说或缺陷评估结果说明测试标准。请检验测试结果、缺陷与缺陷分析,并判断是否已达标。明测试标准。请检验测试结果、缺陷与缺陷分析,并判断是否已达标。n如果未达标,请参考以下备选方案:如果未达标,请参考以下备选方案:n收集进一步的信息:收集进一步的信息:u另行撰写报告,如不同的缺陷密度报告另行撰写报告,如不同的缺陷密度报告u通过研究流程,判断意外条件是否导

249、致背离已确定的测试标准,并在通过研究流程,判断意外条件是否导致背离已确定的测试标准,并在这一新信息的基础上再次评估标准这一新信息的基础上再次评估标准n建议安排进一步测试:建议安排进一步测试:u实施新测试以进一步执行测试用例实施新测试以进一步执行测试用例u实施新测试以扩大测试覆盖面实施新测试以扩大测试覆盖面n修改测试标准:修改测试标准:u复审并评估测试后变更标准会带来的风险复审并评估测试后变更标准会带来的风险u确定满足测试标准的软件子集,并决定是否可以部署该子集。确定满足测试标准的软件子集,并决定是否可以部署该子集。生成测试评估摘要生成测试评估摘要n目的目的u撰写客观报告,传达测试结果、主要评测

250、方法与测试撰写客观报告,传达测试结果、主要评测方法与测试建议建议n评估测试活动中的最后一步是撰写测试评估摘要。评估测试活动中的最后一步是撰写测试评估摘要。此活动通过以下方式进行:将上述信息编入一个报此活动通过以下方式进行:将上述信息编入一个报告,然后将其分发给相应的角色以便复审。告,然后将其分发给相应的角色以便复审。概念:测试的主要评测方法概念:测试的主要评测方法n测试的主要评测方法包括覆盖和质量。测试的主要评测方法包括覆盖和质量。n测试覆盖是对测试完全程度的评测,它建立在测试测试覆盖是对测试完全程度的评测,它建立在测试覆盖基础上,测试覆盖是由测试需求和测试用例的覆盖基础上,测试覆盖是由测试需

251、求和测试用例的覆盖或已执行代码的覆盖表示的。覆盖或已执行代码的覆盖表示的。n质量是对测试对象(系统或测试的应用程序)的可质量是对测试对象(系统或测试的应用程序)的可靠性、稳定性以及性能的评测。质量建立在对测试靠性、稳定性以及性能的评测。质量建立在对测试结果的评估和对测试过程中确定的变更请求(缺陷)结果的评估和对测试过程中确定的变更请求(缺陷)的分析的基础上。的分析的基础上。覆盖评测覆盖评测n覆盖指标提供了覆盖指标提供了“测试的完全程度如何?测试的完全程度如何?”这一问题的答案。最常用的覆这一问题的答案。最常用的覆盖评测是基于需求的测试覆盖和基于代码的测试覆盖。简而言之,测试覆盖评测是基于需求的

252、测试覆盖和基于代码的测试覆盖。简而言之,测试覆盖是就需求(基于需求的)或代码的设计盖是就需求(基于需求的)或代码的设计/实施标准(基于代码的)而言实施标准(基于代码的)而言的完全程度的任意评测,如用例的核实(基于需求的)或所有代码行的执的完全程度的任意评测,如用例的核实(基于需求的)或所有代码行的执行(基于代码的)。行(基于代码的)。n系统的测试活动建立在至少一个测试覆盖策略基础上。覆盖策略陈述测试系统的测试活动建立在至少一个测试覆盖策略基础上。覆盖策略陈述测试的一般目的,指导测试用例的设计。覆盖策略的陈述可以简单到只说明核的一般目的,指导测试用例的设计。覆盖策略的陈述可以简单到只说明核实所有

253、性能。实所有性能。n如果需求已经完全分类,则基于需求的覆盖策略可能足以生成测试完全程如果需求已经完全分类,则基于需求的覆盖策略可能足以生成测试完全程度的可计量评测。例如,如果已经确定了所有性能测试需求,则可以引用度的可计量评测。例如,如果已经确定了所有性能测试需求,则可以引用测试结果来得到评测,如已经核实了测试结果来得到评测,如已经核实了75%的性能测试需求。的性能测试需求。n如果应用基于代码的覆盖,则测试策略是根据测试已经执行的源代码的多如果应用基于代码的覆盖,则测试策略是根据测试已经执行的源代码的多少来表示的。这种测试覆盖策略类型对于安全至上的系统来说非常重要。少来表示的。这种测试覆盖策略

254、类型对于安全至上的系统来说非常重要。n两种评测都可以手工得到(公式如下所示)或通过测试自动化工具计算得两种评测都可以手工得到(公式如下所示)或通过测试自动化工具计算得到。到。基于需求的测试覆盖基于需求的测试覆盖n基于需求的测试覆盖在测试生命周期中要评测多次,并在测基于需求的测试覆盖在测试生命周期中要评测多次,并在测试生命周期的里程碑处提供测试覆盖的标识(如已计划的、试生命周期的里程碑处提供测试覆盖的标识(如已计划的、已实施的、已执行的和成功的测试覆盖)。已实施的、已执行的和成功的测试覆盖)。n测试覆盖通过以下公式计算:测试覆盖通过以下公式计算:u测试覆盖测试覆盖=T(p,i,x,s)/RfTF

255、其中:其中:T是用测试过程或测试用例表示的测试是用测试过程或测试用例表示的测试(Test)数(已计划的、已实施数(已计划的、已实施的或成功的)。的或成功的)。RfT是测试需求是测试需求(RequirementforTest)的总数。的总数。n在制定测试计划活动中,将计算测试覆盖以决定已计划的测在制定测试计划活动中,将计算测试覆盖以决定已计划的测试覆盖,其计算方法如下:试覆盖,其计算方法如下:u测试覆盖(已计划的)测试覆盖(已计划的)=Tp/RfTF其中:其中:Tp是用测试过程或测试用例表示的已计划测试是用测试过程或测试用例表示的已计划测试(Test)数。数。RfT是测试需求是测试需求(Requ

256、irementforTest)的总数。的总数。基于需求的测试覆盖基于需求的测试覆盖n在实施测试活动中,由于测试过程正在实施中(按在实施测试活动中,由于测试过程正在实施中(按照测试脚本),在计算测试覆盖时使用以下公式:照测试脚本),在计算测试覆盖时使用以下公式:u测试覆盖(已执行的)测试覆盖(已执行的)=Ti/RfTF其中:其中:Tx是用测试过程或测试用例表示的已执行的测试是用测试过程或测试用例表示的已执行的测试(Test)数。数。RfT是测试需求是测试需求(RequirementforTest)的总数。的总数。n在执行测试活动中,使用两个测试覆盖评测,一个在执行测试活动中,使用两个测试覆盖评测

257、,一个确定通过执行测试获得的测试覆盖,另一个确定成确定通过执行测试获得的测试覆盖,另一个确定成功的测试覆盖(即执行时未出现失败的测试,如没功的测试覆盖(即执行时未出现失败的测试,如没有出现缺陷或意外结果的测试)。有出现缺陷或意外结果的测试)。基于需求的测试覆盖基于需求的测试覆盖n这些覆盖评测通过以下公式计算:这些覆盖评测通过以下公式计算:u测试覆盖(已执行的)测试覆盖(已执行的)=Tx/RfTF其中:其中:Tx是用测试过程或测试用例表示的已执行的测试是用测试过程或测试用例表示的已执行的测试(Test)数。数。RfT是测试需求是测试需求(RequirementforTest)的总数。的总数。u成

258、功的测试覆盖(已执行的)成功的测试覆盖(已执行的)=Ts/RfTF其中:其中:Ts是用完全成功、没有缺陷的测试过程或测试用例表示的已执行测是用完全成功、没有缺陷的测试过程或测试用例表示的已执行测试试(Test)数。数。RfT是测试需求是测试需求(RequirementforTest)的总数。的总数。n如将以上比率转换为百分数,则以下基于需求的测试覆盖的如将以上比率转换为百分数,则以下基于需求的测试覆盖的陈述成立:陈述成立:ux%的测试用例(上述公式中的的测试用例(上述公式中的T(p,i,x,s))已经覆盖,成功率)已经覆盖,成功率为为y%n这一关于测试覆盖的陈述是有意义的,可以将其与已定义的这

259、一关于测试覆盖的陈述是有意义的,可以将其与已定义的成功标准进行对比。如果不符合该标准,则此陈述将成为预成功标准进行对比。如果不符合该标准,则此陈述将成为预测剩余测试工作量的基础。测剩余测试工作量的基础。基于代码的测试覆盖基于代码的测试覆盖n基于代码的测试覆盖评测测试过程中已经执行的代码的多少,与之相对的基于代码的测试覆盖评测测试过程中已经执行的代码的多少,与之相对的是要执行的剩余代码的多少。代码覆盖可以建立在控制流(语句、分支或是要执行的剩余代码的多少。代码覆盖可以建立在控制流(语句、分支或路径)或数据流的基础上。控制流覆盖的目的是测试代码行、分支条件、路径)或数据流的基础上。控制流覆盖的目的

260、是测试代码行、分支条件、代码中的路径或软件控制流的其他元素。数据流覆盖的目的是通过软件操代码中的路径或软件控制流的其他元素。数据流覆盖的目的是通过软件操作测试数据状态是否有效,例如,数据元素在使用之前是否已作定义。作测试数据状态是否有效,例如,数据元素在使用之前是否已作定义。n基于代码的测试覆盖通过以下公式计算:基于代码的测试覆盖通过以下公式计算:u测试覆盖测试覆盖=Ie/TIicF其中:其中:Ie是用代码语句、代码分支、代码路径、数据状态判定点或数据元素名表示是用代码语句、代码分支、代码路径、数据状态判定点或数据元素名表示的已执行项目数。的已执行项目数。TIic(TotalnumberofI

261、temsinthecode)是代码中的项目总数。是代码中的项目总数。n如将该比率转换为百分数,则以下基于代码的测试覆盖的陈述成立:如将该比率转换为百分数,则以下基于代码的测试覆盖的陈述成立:ux%的测试用例(上述公式中的的测试用例(上述公式中的I)已经覆盖,成功率为)已经覆盖,成功率为y%n这一关于测试覆盖的陈述是有意义的,可以将其与已定义的成功标准进行这一关于测试覆盖的陈述是有意义的,可以将其与已定义的成功标准进行对比。如果不符合该标准,则此陈述将成为预测剩余测试工作量的基础。对比。如果不符合该标准,则此陈述将成为预测剩余测试工作量的基础。质量评测质量评测n测试覆盖的评估提供对测试完全程度的

262、评测,在测试过程中测试覆盖的评估提供对测试完全程度的评测,在测试过程中已发现缺陷的评估提供了最佳的软件质量指标。因为质量是已发现缺陷的评估提供了最佳的软件质量指标。因为质量是软件与需求相符程度的指标,所以在这种环境中,缺陷被标软件与需求相符程度的指标,所以在这种环境中,缺陷被标识为一种更改请求,该更改请求中的测试对象与需求不符。识为一种更改请求,该更改请求中的测试对象与需求不符。n缺陷评估可能建立在各种方法上,这些方法种类繁多,从简缺陷评估可能建立在各种方法上,这些方法种类繁多,从简单的缺陷计数到严格的统计建模不一而足。单的缺陷计数到严格的统计建模不一而足。n严格的评估假定测试过程中缺陷达到的

263、比率或发现的比率。严格的评估假定测试过程中缺陷达到的比率或发现的比率。常用模型假定该比率符合泊松分布。则有关缺陷率的实际数常用模型假定该比率符合泊松分布。则有关缺陷率的实际数据可以适用于这一模型。生成的评估将评估当前软件的可靠据可以适用于这一模型。生成的评估将评估当前软件的可靠性,并且预测继续测试并排除缺陷时可靠性如何增长。该评性,并且预测继续测试并排除缺陷时可靠性如何增长。该评估被描述为软件可靠性增长建模,这是一个活跃的研究领域。估被描述为软件可靠性增长建模,这是一个活跃的研究领域。由于该类型的评估缺乏工具支持,所以应该慎重平衡成本与由于该类型的评估缺乏工具支持,所以应该慎重平衡成本与其增加

264、价值。其增加价值。质量评测质量评测n缺陷分析就是分析缺陷在与缺陷关联的一个或多个参数值上缺陷分析就是分析缺陷在与缺陷关联的一个或多个参数值上的分布。缺陷分析提供了一个软件可靠性指标。的分布。缺陷分析提供了一个软件可靠性指标。n对于缺陷分析,常用的主要缺陷参数有四个:对于缺陷分析,常用的主要缺陷参数有四个:u状态:缺陷的当前状态(打开的、正在修复或关闭的等)。状态:缺陷的当前状态(打开的、正在修复或关闭的等)。u优先级:必须处理和解决缺陷的相对重要性。优先级:必须处理和解决缺陷的相对重要性。u严重性:缺陷的相关影响。对最终用户、组织或第三方的影响严重性:缺陷的相关影响。对最终用户、组织或第三方的

265、影响等等。等等。u起源:导致缺陷的起源故障及其位置,或排除该缺陷需要修复起源:导致缺陷的起源故障及其位置,或排除该缺陷需要修复的构件。的构件。n可以将缺陷计数作为时间的函数来报告,即创建缺陷趋势图可以将缺陷计数作为时间的函数来报告,即创建缺陷趋势图或报告;也可以将缺陷计数作为一个或多个缺陷参数的函数或报告;也可以将缺陷计数作为一个或多个缺陷参数的函数来报告,如作为缺陷密度报告中采用的严重性或状态参数的来报告,如作为缺陷密度报告中采用的严重性或状态参数的函数。这些分析类型分别为揭示软件可靠性的缺陷趋势或缺函数。这些分析类型分别为揭示软件可靠性的缺陷趋势或缺陷分布提供了判断依据。陷分布提供了判断依

266、据。质量评测质量评测n例如,预期缺陷发现率将随着测试进度和修复进度例如,预期缺陷发现率将随着测试进度和修复进度而最终减少。可以设定一个阈值,在缺陷发现率低而最终减少。可以设定一个阈值,在缺陷发现率低于该阈值时才能部署软件。也可根据执行模型中的于该阈值时才能部署软件。也可根据执行模型中的起源报告缺陷计数,以允许检测起源报告缺陷计数,以允许检测“较差的模块较差的模块”、“热点热点”或需要再三修复的软件部分,从而指示一或需要再三修复的软件部分,从而指示一些更基本的设计缺陷。些更基本的设计缺陷。n这种分析中包含的缺陷必须是已确认的缺陷。不是这种分析中包含的缺陷必须是已确认的缺陷。不是所有已报告的缺陷都

267、报告实际的缺陷,这是因为某所有已报告的缺陷都报告实际的缺陷,这是因为某些缺陷可能是扩展请求,超出了项目的规模,或描些缺陷可能是扩展请求,超出了项目的规模,或描述的是已报告的缺陷。然而,需要查看并分析一下,述的是已报告的缺陷。然而,需要查看并分析一下,为什么许多报告的缺陷不是重复的缺陷就是未经确为什么许多报告的缺陷不是重复的缺陷就是未经确认的缺陷,这样做是有价值的。认的缺陷,这样做是有价值的。缺陷报告缺陷报告nRationalUnifiedProcess以三类形式的报告提供缺陷评估:以三类形式的报告提供缺陷评估:u缺陷分布(密度)报告允许将缺陷计数作为一个或多个缺陷参缺陷分布(密度)报告允许将缺

268、陷计数作为一个或多个缺陷参数的函数来显示。数的函数来显示。u缺陷龄期报告是一种特殊类型的缺陷分布报告。缺陷龄期报告是一种特殊类型的缺陷分布报告。缺陷龄期报告缺陷龄期报告显示缺陷处于特定状态下的时间长短,如显示缺陷处于特定状态下的时间长短,如“提出的提出的”。在龄期。在龄期类别中,缺陷还可以按其他属性分类,如类别中,缺陷还可以按其他属性分类,如“拥有者拥有者”。u缺陷趋势报告按状态(新的、已打开的或关闭的)将缺陷计数缺陷趋势报告按状态(新的、已打开的或关闭的)将缺陷计数作为时间的函数显示。趋势报告可以是累计的,也可以是非累作为时间的函数显示。趋势报告可以是累计的,也可以是非累计的。计的。n测试结

269、果和进度报告显示对测试的应用程序进行若干次迭代测试结果和进度报告显示对测试的应用程序进行若干次迭代和测试生命周期后的测试过程执行结果。和测试生命周期后的测试过程执行结果。n许多此类报告对于评估软件质量具有很高的价值。一般测试许多此类报告对于评估软件质量具有很高的价值。一般测试标准中包括有关特定类别(如严重性级别)中打开的缺陷数标准中包括有关特定类别(如严重性级别)中打开的缺陷数的陈述。通过缺陷分布评估可以轻松地核对该标准。对测试的陈述。通过缺陷分布评估可以轻松地核对该标准。对测试需求进行过滤或分类,该评估可以侧重于不同的需求集。需求进行过滤或分类,该评估可以侧重于不同的需求集。n要有效生成此类

270、报告,一般需要工具支持。要有效生成此类报告,一般需要工具支持。缺陷密度报告缺陷密度报告n缺陷状态与优先级缺陷状态与优先级u应该给定所有缺陷的优先级,通常可行的做法是设定四种优先级中的应该给定所有缺陷的优先级,通常可行的做法是设定四种优先级中的一种:一种:F立即解决立即解决F高优先级高优先级F正常排队正常排队F低优先级低优先级n一个成功测试的标准可以表示为缺陷在上述优先级上所应体现的分布方式。一个成功测试的标准可以表示为缺陷在上述优先级上所应体现的分布方式。例如,对于一个成功的测试标准来说,可能不存在优先级为例如,对于一个成功的测试标准来说,可能不存在优先级为1的打开的缺的打开的缺陷,而且优先级

271、为陷,而且优先级为2的打开的缺陷要少于的打开的缺陷要少于5个。例如下面的缺陷分布图。个。例如下面的缺陷分布图。很明显该图显示的情况没有达到标准。请注意,该图需要通过过滤器才能很明显该图显示的情况没有达到标准。请注意,该图需要通过过滤器才能只显示需要的打开的缺陷。只显示需要的打开的缺陷。n缺陷状态与严重性缺陷状态与严重性u缺陷严重性报告显示每种严重性级别的缺陷个数,例如致命错误、未缺陷严重性报告显示每种严重性级别的缺陷个数,例如致命错误、未执行主要功能、次要错误等严重性级别。执行主要功能、次要错误等严重性级别。n缺陷状态与在实施模型中的位置缺陷状态与在实施模型中的位置u缺陷起源报告显示缺陷在实施

272、模型元素上的分布情况。缺陷起源报告显示缺陷在实施模型元素上的分布情况。缺陷分布图缺陷分布图缺陷龄期报告缺陷龄期报告n缺陷龄期分析提供了有关测试有效性和缺陷排除活缺陷龄期分析提供了有关测试有效性和缺陷排除活动的良好反馈。例如,如果大部分龄期较长的、未动的良好反馈。例如,如果大部分龄期较长的、未解决的缺陷处于有待确认的状态,则可能表明没有解决的缺陷处于有待确认的状态,则可能表明没有充足的资源应用于再次测试工作。充足的资源应用于再次测试工作。缺陷趋势报告缺陷趋势报告n趋势报告确定缺陷率并提供了一个出色的测试状态趋势报告确定缺陷率并提供了一个出色的测试状态视图。在测试生命周期中,缺陷趋势遵循着一种比视

273、图。在测试生命周期中,缺陷趋势遵循着一种比较好预测的模式。在生命周期的初期,缺陷率增长较好预测的模式。在生命周期的初期,缺陷率增长很快。在达到顶峰后,就随时间以较慢的速率下降。很快。在达到顶峰后,就随时间以较慢的速率下降。缺陷趋势报告缺陷趋势报告n要发现问题,可以根据这一趋势复审项目时间表。例如,在四个星期的生要发现问题,可以根据这一趋势复审项目时间表。例如,在四个星期的生命周期中,如果缺陷率在第三个星期中仍然增长,则项目很明显没有按时命周期中,如果缺陷率在第三个星期中仍然增长,则项目很明显没有按时间表进行。间表进行。n这一简单的趋势分析假定:缺陷是立即关闭的,且在随后的工作版本中对这一简单的

274、趋势分析假定:缺陷是立即关闭的,且在随后的工作版本中对修复进行测试,这样关闭缺陷的速率应该遵循与打开缺陷的速率相同的增修复进行测试,这样关闭缺陷的速率应该遵循与打开缺陷的速率相同的增减趋势。如果情况并非如此,则表明缺陷解决流程发生了问题;缺陷修复减趋势。如果情况并非如此,则表明缺陷解决流程发生了问题;缺陷修复所需的资源或再次测试和确认修复所需的资源可能不足。所需的资源或再次测试和确认修复所需的资源可能不足。缺陷趋势报告缺陷趋势报告n该报告反映的趋势显示,在项目开始时,发现和打开新缺陷该报告反映的趋势显示,在项目开始时,发现和打开新缺陷的速率很快,但随着时间推移,该速率不断降低。打开的缺的速率很

275、快,但随着时间推移,该速率不断降低。打开的缺陷的趋势与新缺陷的趋势相似,但稍微滞后一些。关闭的缺陷的趋势与新缺陷的趋势相似,但稍微滞后一些。关闭的缺陷的趋势随着打开的缺陷的修复和核实而不断增长。这些趋陷的趋势随着打开的缺陷的修复和核实而不断增长。这些趋势描述的是成功的工作。势描述的是成功的工作。如果您的趋势与这些趋势差别显著,则表明存在问题,并可如果您的趋势与这些趋势差别显著,则表明存在问题,并可以确定可能需要附加资源以应用于开发或测试特定区域的时以确定可能需要附加资源以应用于开发或测试特定区域的时间。间。n当与测试覆盖评测结合起来时,缺陷分析可提供出色的评估,当与测试覆盖评测结合起来时,缺陷

276、分析可提供出色的评估,测试完成的标准也可以建立在此评估基础上。测试完成的标准也可以建立在此评估基础上。性能评测性能评测n评估测试对象的性能行为时,可以使用多种评测,这些评测评估测试对象的性能行为时,可以使用多种评测,这些评测侧重于获取与行为相关的数据,如响应时间、计时配置文件、侧重于获取与行为相关的数据,如响应时间、计时配置文件、执行流、操作可靠性和限制。这些评测主要在评估测试活动执行流、操作可靠性和限制。这些评测主要在评估测试活动中进行评估,但是也可以在执行测试活动中使用性能评测评中进行评估,但是也可以在执行测试活动中使用性能评测评估测试进度和状态。估测试进度和状态。n主要的性能评测包括:主

277、要的性能评测包括:u动态监测动态监测-在测试执行过程中,实时获取并显示正在执行的各在测试执行过程中,实时获取并显示正在执行的各测试脚本的状态。测试脚本的状态。u响应时间响应时间/吞吐量吞吐量-测试对象针对特定主角和测试对象针对特定主角和/或用例的响应时间或用例的响应时间或吞吐量的评测。或吞吐量的评测。u百分位报告百分位报告-数据已收集值的百分位评测数据已收集值的百分位评测/计算。计算。u比较报告比较报告-代表不同测试执行情况的两个(或多个)数据集之代表不同测试执行情况的两个(或多个)数据集之间的差异或趋势。间的差异或趋势。u追踪报告追踪报告-主角(测试脚本)和测试对象之间的消息主角(测试脚本)

278、和测试对象之间的消息/会话详细会话详细信息。信息。动态监测动态监测n动态监测通常以柱状图或曲线图的形式提供实时显动态监测通常以柱状图或曲线图的形式提供实时显示示/报告。该报告用于在测试执行过程中,通过显示报告。该报告用于在测试执行过程中,通过显示当前的情况、状态以及测试脚本正在执行的进度来当前的情况、状态以及测试脚本正在执行的进度来监测或评估性能测试执行情况。监测或评估性能测试执行情况。n例如,在以上柱状图中,有例如,在以上柱状图中,有80个测试脚本正在执行个测试脚本正在执行相同的用例。图中显示,有相同的用例。图中显示,有14个测试脚本处于空闲个测试脚本处于空闲状态,状态,12个处于查询状态,

279、个处于查询状态,34个处于个处于SQL执行状执行状态,态,4个处于个处于SQL连接状态,连接状态,16个处于其他状态。个处于其他状态。随着测试的进行,我们将看到各状态脚本的数量会随着测试的进行,我们将看到各状态脚本的数量会发生变化。显示的输出将是正常执行且正在执行中发生变化。显示的输出将是正常执行且正在执行中的典型测试执行。但是,如果在测试执行过程中,的典型测试执行。但是,如果在测试执行过程中,测试脚本始终保持一种状态或没有显示任何变化,测试脚本始终保持一种状态或没有显示任何变化,则表明测试执行发生问题或者需要实施或执行其他则表明测试执行发生问题或者需要实施或执行其他性能评测。性能评测。动态监

280、测动态监测响应时间响应时间/吞吐量报告吞吐量报告n正如其名称的含义一样,响应时间正如其名称的含义一样,响应时间/吞吐量报告评测吞吐量报告评测并计算与时间和并计算与时间和/或吞吐量(处理的事务数)相关的或吞吐量(处理的事务数)相关的性能行为。这些报告通常用曲线图显示,响应时间性能行为。这些报告通常用曲线图显示,响应时间(或事务数)在(或事务数)在“y”轴上,而事件数在轴上,而事件数在“x”轴上。轴上。n除了显示实际的性能行为外,它在计算并显示统计除了显示实际的性能行为外,它在计算并显示统计信息方面也很实用,如显示数据值的平均偏差和标信息方面也很实用,如显示数据值的平均偏差和标准偏差。准偏差。响应

281、时间响应时间/吞吐量报告吞吐量报告百分位报告百分位报告n百分位报告通过显示百分位报告通过显示已收集数据已收集数据类型的全体百分位型的全体百分位值,提供了另一种性能统计计算方法。,提供了另一种性能统计计算方法。比较报告比较报告n比较不同性能测试的结果,以评估测试执行过程之比较不同性能测试的结果,以评估测试执行过程之间所作的变更对性能行为的影响,这种做法是非常间所作的变更对性能行为的影响,这种做法是非常必要的。比较报告应该用于显示两个数据集(分别必要的。比较报告应该用于显示两个数据集(分别代表不同的测试执行)之间的差异或多个测试执行代表不同的测试执行)之间的差异或多个测试执行之间的趋势。之间的趋势

282、。追踪和配置文件报告追踪和配置文件报告n当性能行为可以接受时,或性能监测表明存在可能当性能行为可以接受时,或性能监测表明存在可能的瓶颈时(如当测试脚本保持给定状态的时间过长)的瓶颈时(如当测试脚本保持给定状态的时间过长),追踪报告可能是最有价值的报告。追踪和配置文,追踪报告可能是最有价值的报告。追踪和配置文件报告显示低级信息。该信息包括主角与测试对象件报告显示低级信息。该信息包括主角与测试对象之间的消息、执行流、数据访问以及函数和系统调之间的消息、执行流、数据访问以及函数和系统调用。用。测试:活动概述测试:活动概述测试:工件概述测试:工件概述角色:测试设计员角色:测试设计员n测试设计员是测试中

283、的主要角色。该角色负责对测测试设计员是测试中的主要角色。该角色负责对测试进行计划、设计、实施和评估,包括:试进行计划、设计、实施和评估,包括:u生成测试计划和测试模型生成测试计划和测试模型u执行测试过程执行测试过程u评估测试范围和测试结果,以及测试的有效性评估测试范围和测试结果,以及测试的有效性u生成测试评估摘要生成测试评估摘要n人员配备人员配备n测试设计员应具备的相应技能和知识包括:测试设计员应具备的相应技能和知识包括:u了解系统或所测试的应用程序了解系统或所测试的应用程序u了解测试及测试自动化工具了解测试及测试自动化工具u具备诊断和解决问题的技能具备诊断和解决问题的技能u编程技能(最好具备

284、)编程技能(最好具备)角色:测试设计员角色:测试设计员角色:测试员角色:测试员n测试员负责执行测试,其职责包括:测试员负责执行测试,其职责包括:u设置和执行测试设置和执行测试u评估测试执行过程并修改错误评估测试执行过程并修改错误n人员配备人员配备u测试员应具备的知识和技能可能会因为他们所执行的测试类型和测试员应具备的知识和技能可能会因为他们所执行的测试类型和/或测或测试阶段的不同而有所差异。例如,在执行性能测试或集成阶段的测试试阶段的不同而有所差异。例如,在执行性能测试或集成阶段的测试时,需要更高级的技能。在执行功能测试或系统测试阶段的测试时,时,需要更高级的技能。在执行功能测试或系统测试阶段

285、的测试时,则不需要太高级的技能。以下是测试员所需知识和技能的一些标准:则不需要太高级的技能。以下是测试员所需知识和技能的一些标准:u高级测试员:高级测试员:F了解系统或所测试的应用程序了解系统或所测试的应用程序F了解联网和系统构架了解联网和系统构架F了解测试及测试自动化工具了解测试及测试自动化工具F具备诊断和解决问题的技能具备诊断和解决问题的技能F编程技能(必备)编程技能(必备)u初级测试员:初级测试员:F了解系统或所测试的应用程序了解系统或所测试的应用程序F了解测试及测试自动化工具了解测试及测试自动化工具F具备诊断和解决问题的技能具备诊断和解决问题的技能F编程技能(最好具备)编程技能(最好具

286、备)角色:测试员角色:测试员测试的生命周期测试的生命周期n在软件开发生命周期中,软件是通过迭代来不断加以完善的。在软件开发生命周期中,软件是通过迭代来不断加以完善的。在这种环境中,对于每个作为测试目标的工作版本,测试的在这种环境中,对于每个作为测试目标的工作版本,测试的生命周期还都必须具有一种迭代方法。对于针对每个工作版生命周期还都必须具有一种迭代方法。对于针对每个工作版本执行的测试,都作出了增补和改进,并累积为一个测试体,本执行的测试,都作出了增补和改进,并累积为一个测试体,用于后续阶段的回归测试。该方法表明它将导致在整个流程用于后续阶段的回归测试。该方法表明它将导致在整个流程中重复进行测试,就象修订软件本身一样。这里没有一成不中重复进行测试,就象修订软件本身一样。这里没有一成不变的软件规约,也没有一成不变的测试。变的软件规约,也没有一成不变的测试。测试的生命周期测试的生命周期n在同一张图中,观察不具有项目其余部分的测试的在同一张图中,观察不具有项目其余部分的测试的生命周期。图中展示了不同测试活动在非迭代视图生命周期。图中展示了不同测试活动在非迭代视图中相互联系的方式:中相互联系的方式:测试的生命周期测试的生命周期n该生命周期必须与迭代方法结合起来,这意味着每该生命周期必须与迭代方法结合起来,这意味着每个迭代都将具有遵循该模式的测试周期。个迭代都将具有遵循该模式的测试周期。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号