-
1 电子教材
-
2 PPT
11.3 功能测试的测试方法汇总
11.3.1 输入不同情况的数据测试
案例演示
打开Word 2000软件,选择“插入”à“索引和目录”命令,设置“栏数”等于5,然后按Enter键,程序提示输入必须介于0到4之间的值,如图11-1所示。

图11-1 索引和目录错误信息
单击图11-1中的“确定”按钮,得到如图11-2所示的界面,即再次出现了错误提示对话框。

图11-2 索引和目录错误信息重复显示
11.3.1.1 输入非法数据
1. 分析缺陷产生的原因
开发人员通常用以下3种技术来处理非法输入:
Ø 防止不正确的输入进入被测软件。过滤掉不正确的输入,只允许合法输入通过界面。
Ø 输入了不正确的数据后,软件提示错误信息,拒绝不正确的输入。例如,开发人员可以加入if语句来保证输入的合法性,if输入合法then处理输入,else显示错误信息。在测试时,要确保可以看到这样的信息。
Ø 允许不正确的输入进入系统并进行处理,软件失效时调用异常处理程序,它通常包括重新设置内部变量,关闭文件,存储软件等代码。一般还要显示一些错误信息。
可见,开发人员除了编写主要的功能代码外,还必须编写对非法输入的检查代码,这些代码经常会被遗忘,或者编写完这部分代码后,开发人员很少认真检查,导致处理非法输入经常出现错误。特别是当突然执行异常处理程序时,常会发生很多问题:文件仍旧打开,内存没有被释放等。再回到主程序时,打开文件可能会失败,因为文件已经被打开。或者数据结构中仍旧包含数据,程序再次使用。
2. 如何发现这类问题
软件应该能够拒绝非法的输入或对非法的输入做出反应。我们可以给出一组不正确的输入来测试软件的这个能力。无论测试的是GUI的输入还是API调用的参数,在进行测试时,都必须从输入的属性出发,一般要考虑的属性有以下3点。
Ø 输入类型:键入无效的类型常会产生错误信息。例如必须输入整型,而键入了实型或字符型。
Ø 输入长度:对于字符型,键入太多的字符常会引出错误信息。
Ø 边界值:输入边界值或超过边界值的数据,例如,上面例子的边界值为4,可以输入4及4以上的数值。
3. 测试方法小结
Ø 应用场合:GUI的输入。
Ø 测试方法:分别从输入数据的类型、输入数据的长度、输入数据的边界值等方面进行考虑。
Ø 测试信息的检查:除了考虑输入非法数据,还要留意错误信息本身,特别要注意以下几点:
l 错误信息和错误要一致,防止A的错误提示显示给了错误B,B的错误提示信息给了错误C。
l 错误信息的内容是空,用户不知道为什么出错。
l 显示的错误信息是给开发人员调试使用的,例如“Error 5-unknown data”,开发人员可以通过该信息很容易地找到错误类型,但是用户根本不明白,不知道做错了什么。
Ø 测试知识储备:牢记表11-1中基本数据类型的边界值。
表11-1 基本数据类型的边界值
类型 | 长度 | 范围 |
无符号整型 | 2字节 4字节 | 0~65535 0~4294967295 |
有符号整型 | 2字节 4字节 | -32768~32767 -2147483648~2147483647 |
字符型 | 1字节 2字节 | 256个值 65536个值 |
布尔型 | 1字节 | 真或假 |
浮点类型 | 4字节 8字节 10字节 | 1.2e-3 8~3.4e+ 38 2.2e-308~1.8e+308 3.4e-4932~ 1.1 e+4932 |
11.3.1.2 输入特殊字符集(或数据类型的合法输入)
1. 分析缺陷产生的原因
应用程序接受字符串输入,如果程序没有针对特殊输入进行特殊编程,那么就有可能导致程序挂起,主要包括以下3种情况:
字符集包括普通字符和特殊字符。例如,ASCII字符集包括普通字符和特殊字符。应用程序有时只能处理普通字符,当输入特殊字符时就会出现错误。
实现应用程序的程序设计语言有特定的处理一些字符和字符串的方法。例如,C语言把像\n、++和&这样的字符用于特殊目的。如果将这些字符串键入到对话框中,程序必须进行错误处理,否则容易产生错误。
应用程序有时也使用设备名称、系统对象和程序的保留字符串集合。只要在程序中使用了这些字符串,就可能导致失效。
2. 如何发现这类问题
根据被测软件所处的操作系统、使用的程序设计语言、字符集等信息列出表格,通过测试小组的讨论,标明应用表格中的哪些字符和数据类型作为输入来测试。
根据经验,软件很少会因为这种操作而崩溃,通常它会挂起没有响应,测试人员可以通过任务管理器结束该任务。
3. 测试方法小结
Ø 应用场合:需要接受字符输入的地方。
Ø 测试方法:根据被测软件的具体情况输入非法字符。
Ø 测试知识储备:尽可能多地了解字符集、程序设计语言和操作系统中的保留字符串及其特定含义,可以使我们更好地分辨这类缺陷。表11-2列出了ASCII字符集及一些可能出问题的字符,供大家参考。
表11-2 ASCII字符集对应得常见故障模型
字符值 | ASCII值 | 适用范围 | 用途 途 | 故障模型 |
NUL | 0 | Windows DOS | MS-DOS的系统函数使用NUL终止字符串 | 嵌入的空串可能会影响用于系统调用的字符串。NUL可能会使后面的所有字符被忽略 |
C语言及C++ 语言 | 对所有标准库函数,C用NUL作为字符串终止符 | 嵌入的空串可能会影响用任何字符输入域, NUL可能会使后面的所有字符被忽略 | ||
ETX | 3 | Windows DOS | MS-DOS使用ETX作为程序中断符 | 输入ETX程序就会中断 |
EOT | 4 | UNIX | UNIX使用EOT作为文本的文件结束符 | 忽略输入以后出现的字符或程序可能终止,或其他预料不到的行为 |
BS | 8 | Windows | 退格 | 在持久数据中嵌入退格。引起退格或没有视觉效果的光标移动 |
Tab | 9 | 所有 | Tab键 | 将Tab键扩展作为持久数据中的空格,或者当应扩展时,仍然作为一个Tab字符 |
LF | 10 | Windows | 换行 | Windows使用CRILF作为换行字符。多余的LF可能会引起持久数据的问题 |
FF | 12 | 所有 | 走纸 | 如果嵌入可能会引起持久数据的显示问题,特别是打印问题 |
CR | 13 | 所有 | 回车 | 可能使指定的Ctrl+M不能实现其功能 |
CAN | 24 | Windows | 使得以前输入的文本取消,获得新输入 | 可能会忽略以前的输入 |
SUB | 26 | Windows | 文本中的文件结束符 | 输入字符串SUB有很宽的有效范围,输入后的字符会被忽略;输入或程序会终止,或者会发生预料不到的行为 |
11.3.1.3 输入使缓冲区溢出的数据
1. 分析缺陷产生的原因
引起这种缺陷的原因是开发人员没有考虑传送给内存缓冲区的字符串的大小。如果缓冲区只能保留固定长度的字符串,输入的更长字符串就会改写其他的内存存储单元,引起操作系统强制性地终止应用程序。
键入一长串字符使之溢出缓冲区,也是黑客最喜欢的攻击系统的一种方法,因为有时应用程序在崩溃后仍然在执行某个进程,如果黑客在输入的长字符串最后加上某个可执行的字符串,那么进程就会执行该字符串。
2. 如何发现这类问题
当应用程序允许输入字母、数字时,通过GUI控件(如文本框),或者通过API调用的参数来进行这种测试。
Ø 首先弄清楚要测试的输入域的长度,输入最大字符串测试。
Ø 输入一个比最大字符串更长的字符串,应用程序可能出现错误提示信息,提示不允许输入;或者输入了更长的字符串使应用程序崩溃。
3. 测试方法小结
Ø 应用场合:需要接受字符输入的地方。
Ø 测试方法:根据被测软件的具体情况输入最大字符串或输入一个比最大字符串更长的字符串。
Ø 测试知识储备:尽可能多地和开发人员讨论,以了解和确定输入域的合理长度。
11.3.1.4 输入使得计算结果溢出的数据
1. 案例分析
先看一个简单的等式:
sum = sum + value[i]
假设value是一数组,其值作为程序的输入,sum是内部存储的结果。以前应用的输入攻击会确保对边界和Value[i]的非法值进行测试。同样,应用数据攻击会全面测试sum,将此计算执行多次,就会使sum的数值溢出。
2. 分析缺陷产生的原因
当所有的输入和数据都有效时,计算的最终结果也可以是无效的。例如,等式x=x+l,多次执行该行代码,留给x的内存最终会溢出该变量允许的最大值:同样,对于负值,若x=-32768,等式y=x-l就会失效。所有变量都有值域范围,有时开发人员在执行计算时会忘记检查这些上限。在对输入或存储的数据进行校验时,他们可能会记得,但是对计算结果进行校验会更加困难。
3. 如何发现问题
一次又一次地执行计算或使用很大或很小的输入和数据进行计算,重点测试数据类型的初始值或边界值附近的值。例如下面的程序:
const count 2
void main ()
{
int sum,value[count];
sum=0;
for (i =0 ; i <count; ++i)
{
sum=sum + value[i];
}
}
在输入如下数据时就会使程序崩溃:
value[0]=32700,value[1]= 70结果32770,比32767大。
count=33000,value[0..32999]= 1结果为33000,也超过了边界。
4. 测试方法小结
应用场合:应用程序执行能够导出待产生结果并进行内部存储的计算。
测试方法:强制数据产生上溢或下溢。
测试知识储备:全面掌握被测软件的需求,了解计算变量的上下限。
11.3.1.5 输入不合法的文件名
1. 分析缺陷产生的原因
操作系统本身具有自己的文件命名规范,例如,Dos的8.3格式(8个字符的文件名和3个字符的扩展名)。在Windows中,文件名不能超过255个字符,并且文件名不可以含有/ \: < > ? * | 这8个字符,以及AUX、COM1、COM2、COM3、COM4、CON、LPT1、LPT2、LPT3、LPT4、 NUL及PRN这些操作系统的保留字。
开发人员在应用程序中使用不相同的规则管理文件名,当应用程序和操作系统使用的文件名命名规则不一致的时候,就会发生问题。例如,应用程序允许命名了一个在操作系统中无效或产生特殊意义的文件名,操作系统会给程序返回一个错误信息,如果应用程序没有编程处理该错误,就会使程序崩溃或出现错误。如图10-3所示,在Word中保存文件时,程序可以自动给出扩展名“.doc”,但是当把分号符号和圆点符号组合起来使用的时候,就会产生错误,使应用程序把“ .2004”作为扩展名赋给了文件。
2. 如何发现问题
Ø 保存文件为操作系统不允许的文件名,例如,文件名中含有/ \:< > ? * | 这8个字符,测试应用程序是否不允许输入包含这些字符的文件名。
Ø 输入一些应用程序不允许使用的文件名,例如,使用过长的、含有特殊字符的、可能相互作用的字符作为文件名,检查应用程序能否识别该文件。
3. 测试方法小结
Ø 应用场合:几乎所有涉及需要输入文件名功能的应用程序。
Ø 测试方法:输入操作系统不允许的文件名和应用程序不允许使用的文件名。
Ø 测试知识储备:全面掌握被测软件的需求,了解操作系统和应用程序对文件名的要求。
11.3.2 有关默认值的测试
1. 分析缺陷产生的原因
一旦软件中使用了变量,就必须赋给初始值,如果在赋值之前就使用了这些变量,软件就会失效,正确地使用变量的顺序是:声明变量→给变量赋值→使用变量。通常会由于以下两个原因使变量的默认值不正确:
Ø 给变量赋值这一步经常会被开发人员不经意地跳过。虽然在编译期间,使用代码分析工具就可以发现这种情况,但是开发人员有可能没有使用这种工具。使用未初始化的变量的一种结果就是会引发一般保护性错误,使应用程序崩溃。另一种情况是内存中的值被随机地赋给了变量,软件不会崩溃,但是会产生错误的结果。测试人员必须仔细分析存在问题的软件的输出,寻找无用字符、显示或返回的错误数据类型(例如,在希望显示数字的地方显示字母)等。
Ø 开发人员有时不确定到底要赋什么初始值,就随便给了一个值,但用户并不认可该值,这种情况下,软件并不一定会失效。但对用户的使用会带去很多不方便。例如某程序把打印默认输出份数设置为2份,将给用户造成很大麻烦。测试人员必须认真检查软件显示的每个默认值,以确定是否是用户想要的正确的默认值。
2. 如何发现这类问题
创建默认值是相当难的程序设计工作。开发人员要确保变量在进入循环或进行函数调用之前就做了初始化。如果没做初始化,使用这样的变量将产生严重的后果。确定应用软件中所使用的数据有以下一些基本原则:
Ø 查找选项按钮、配置面板、安装屏幕等。这种屏幕上显示的数据常常在应用程序的许多地方用到。
Ø 查阅源代码的数据声明部分(如果可以得到)。
Ø 确定了要测试的数据,可以通过以下操作来强制使用或不使用默认值:
l 接受软件显示的默认值。有时软件需要用户输入一个值,如果没有输入任何值,软件就可能失效。这时可以只是简单地单击"确定"按钮来接受默认值,完成这个功能测试。
l 键入空值。删掉默认值,使输入域变成空值。
l 将默认值改为另一个值,这样会使应用程序以不同的值来运行。
l 将默认值改为另一个值,然后再变为空值。
一个好的软件会这样处理以上情况,将输入的不合法内容默认为合法边界内的某个合理值,或者返回错误提示信息。
3. 测试方法小结
Ø 应用场合:需要有默认值的地方。
Ø 测试方法:分别从选项按钮、配置面板、安装配置、开始界面等方面进行考虑,强制使用或不使用默认值等。
Ø 测试知识储备:全面理解需求规格说明书中对默认值的要求:同时深刻理解被测软件的行业背景。
11.3.3 输入产生错误的合法数据组合
1. 分析缺陷产生的原因
本测试主要是测试多个输入值的组合,每个输入值已被单独测试过,但是这些值的组合可能会互相影响而引起软件失效。例如,用两个参数作为输入值的某一API,需要在一个参数值的基础上为另一个参数选择某个值,同样面板上有多个输入域的GUI可能包含多个相关输入,这些值包含的逻辑关系很复杂,编程时很容易弄错它们之间的关系。
在编程的时候对某个变量的单个值进行检查相对要简单一些。必须对多个变量进行检查时,就需要更复杂的控制结构。开发人员可能会写出多层嵌套的“if”语句来检查多个相关的值;由于很难全面考虑这种结构,调试起来也比较困难,很容易出现缺陷。另外,代码修改也会产生许多无法预料的问题影响输入关系,使缺陷更难被调试。
2. 如何发现这类问题
首先要确定测试哪些输入组合,并弄清楚它们之间的“关系”。如果具备以下任一特性,就可以认为这些变量是有“关系”的:
Ø 描述的是有关单个内部数据结构的属性和内容。例如,输入面板需要用户键入列表的“行”和“列”,这时测试人员要输入单个内部数据结构“列表”的属性“行和列”。
Ø 一起用在了一个计算中,也就是将多个输入用做一个内部计算的操作数,因此这些输入变量具有了相互“关系”。例如,字处理程序将左、右、上、下边界作为输入,利用这些值来计算页面大小。
一旦确定了哪些输入组合有关系,就要确定使用哪些值进行测试。由于不可能对所有的输入组合都进行详尽的测试,所以必须从可能的组合中挑选出有效的值来测试。我们可以用等价类划分和边界值的方法选择输入数据。如同前面学过的,选择单个值来测试通常是指选择可接受值的极值,例如非常小或非常大的整数。当考虑多个输入域时,可以使用非常大的值作为一个输入,非常小的值作为另一个输入。
3. 测试方法小结
Ø 应用场合:输入值之间存在依赖关系。
Ø 测试方法:输入可能是出现问题的组合值。
Ø 测试知识储备:尽可能多的内部数据结构的属性和内容,并与开发人员多探讨,以确定输入的数据值。
11.3.4 输出属性修改后的结果
1. 分析缺陷产生的原因
输出常常具有可修改的属性,如颜色、形状、维数及大小等,用户可以修改这些属性。在这种情况下,开发人员必须编码、设立初始或默认属性值,然后编码允许用户编辑这些属性。
当用户改变了这些属性值后,内部的相应变量值也随着变化,再次进行处理时,这些值没有被重新恢复为默认值,输出的属性就被强制改变了。
2. 如何发现问题
该测试方法可以使用在那些输出具有可编辑性、可修改性的功能中。测试人员首先要仔细了解能够产生的输出,特别要注意具有可编辑属性的输出。测试人员的任务就是强制每个输出产生,并编辑其属性,然后再次强制输出产生。
3. 测试方法小结
Ø 应用场合:输出的结果,可以由用户修改属性得出。
Ø 测试方法:强制每个输出产生,并编辑其属性,然后再次强制产生输出。
Ø 测试知识储备:全面理解需求规格说明书中的内容,了解能够产生的输出。
11.3.5 数据结构溢出或不符合约束
案例演示
(1)启动Word,选择“表格”à“插入”命令,在打开的对话框中给“列数”赋一个小值,将32768赋给“行数”,如图11-3所示。

图11-3 在插入表格中输入数值
(2)现在添加行数让该结构上溢。增加12行左右的新行后,将光标移到表的底部。
注意:在Windows底部的状态条上的页数,页数将大约每半秒钟增加一页,几分钟后,Word停止运行。
1. 分析缺陷产生的原因
所有数据结构的大小都有上限。一些数据结构会逐步增加长度以充满机器内存容量或磁盘空间,而其他数据结构具有固定的上限。例如,使用中的月销售平均值可以存储在长度为12的数组中,其中每个数组元素存放这一年中一个月的值。
开发人员经常对有关数据结构的内容进行编码,忘记结构本身的物理局限(特别是大小)。
例如,编写“AddElement”程序用来给数组添加新值,若程序没有对数组的尾端进行说明,最后在试图添加元素时会超过数组的上限,应用程序就会失效。
在编程过程中,对内部数据结构都有所约束,包括大小、维数、类型、形状、屏幕上的位置等。我们测试的重点就是用户能够设置的属性,这些属性使用了一组参数来约束。例如,“年”取值在1980~2095之间,“撤销”操作最多只能执行20次。
在建立数据项和随后对数据项进行修改的任何时刻都要对数据属性的约束进行检查。创建数据项时,开发人员通常很愿意检查这些数据项,可是在修改数据项时却常常忽略这些检查。
有的是因为数据对象的建立和后来的修改是由不同的函数完成的,或是同一函数中不同的代码部分完成的。在这两个地方都要包含检查约束的代码,这个问题经常会被一些项目忽略。
这些项目由多个开发人员共同完成,而这些开发人员对如何编程实现约束又互不交流。
另一个原因是初始化代码中修改后的代码有错误,在修改错误的时候只修改了初始化部分,而忽略了对其他部分的修改,使得修改不完全,不彻底。
2. 如何发现问题
Ø 确定数据结构的界限,尝试将过多的值输入数据结构。应该特别注意界限为数据类型的边界256、1024、32768等上溢的测试。
Ø 对于下溢的测试,可以尝试多删除一个数据,例如,当结构为空的时候,尝试再删除,或者添加一个数据,尝试删除两个元素时的情况。
Ø 确认候选数据,并列出其可修改的属性。对每个属性列出有效值的允许范围、约束的条件等。
Ø 确定所有可修改属性的功能位置。
Ø 对数据进行初始化,改变每个属性以确定是否正确执行了约束。
Ø 如果数据约束遭到破坏,可能导致系统崩溃,或者表现为响应时间延迟,错误信息不正确(软件发现了错误,但不知道是什么错误)以及使用错误数据产生的无效输出。
3. 测试方法小结
Ø 应用场合:程序中存在数组或应用程序内部的数据结构存在约束。
Ø 测试方法:尝试将过多的值输入数据结构,测试上溢:对于下溢的测试,可以尝试多删除一个数据,破坏内部数据的约束。
Ø 测试知识储备:全面理解需求规格说明书中的内容,确定数据结构的界限,确定内部数据结构的所有约束。
11.3.6 操作数与操作符不符
案例演示
(1)打开Windows 2000的计算器,进入科学计算模式,输入“2”,求平方根(选中Inv复选框,并单击按钮x^2),得到如图11-4所示的结果。

图11-4 2的平方根
(2)再次单击按钮x^2,计算平方数,屏幕显示结果为2,如图11-5所示。

图11-5 2的平方根的平方
(3)但2仅仅是显示的答案,计算器存储的实际值并不是2,这可以通过减2来验证,减2的结果不是0(图11-6),而是和零很接近的数值。可见,在上面的计算过程中计算器程序从浮点数据转换到整型数据会失去精度。

图11-6 精度差
1. 分析缺陷产生的原因
几乎每个运算符都有它无效的操作数,对于具体的操作符,开发人员在使用它们时,必须编写错误检查代码。例如,除以零的问题,开发人员应该通过将所有除法运算包含在“if”语句内,或其他处理方法来避免带有除数为零的操作。如果不这样做,可能就会使应用程序崩溃。
2. 如何发现问题
找到程序中包含的数据或输入(即操作数)的计算(即操作符)、数学表达式(操作符和操作数的组合)及对图形的操作,这里面有大量的计算,例如,字处理程序中的文本位置、页边界、页边距、字体大小等。另外,对多个操作数进行组合也更容易发生错误。例如,字符和数字都可以使用“+”操作符。对字符通过“+”把它们连成一串;对数字通过“+”来进行加法运算。如果系统尝试把字符和数字相加,即进行相互矛盾的操作,就会引起软件失效。
3. 测试方法小结
Ø 应用场合:需要进行数值计算的程序或图形操作的程序,例如加、减、乘、除等。
Ø 测试方法:对于数值计算考虑操作数和操作符之间的限定关系,对于图形计算还要考虑各种输入数据之间的组合关系。
Ø 测试知识储备:全面掌握被测软件中操作符对操作数的要求。掌握不同的操作符和操作数具有的不同的有效和无效的取值范围。
11.3.7 数据共享或关联功能计算出错
案例演示
(1)在Word文档中插入脚注。
(2)选择“格式”à“分栏”命令,将“栏数”改为2列,如图11-7所示。

图11-7 分栏对话框
(3)再看Word文档中的脚注,同一页上有两个脚注。一个是从单列位置引用的,一个是从双列位置引用的,单列脚注把双列脚注挤到了下一页,如图11-8所示。

图11-8 故障截图
1. 分析缺陷产生的原因
通常对孤立的功能进行测试时不会发生很多缺陷,而当把单独的功能和同一软件中的其他功能结合时,就可能出现很多软件缺陷。例如,在字处理程序中,可以生成带有脚注(一个功能)以及同一页上两栏(另一个功能〉的文档,这两个功能都能单独有效地运行,但彼此交互就可能会失效。
这种缺陷的产生往往是在两个或更多的功能使用了共享数据集,而每个功能允许使用的数据范围不同引起的。例如,一个功能可能会将某数据项设置为特定大小,然而另一个功能却允许该数据项的大小可以超过第一个功能的处理能力。开发人员根本没考虑到该数据项在其他功能处也可以被修改,他们只是编码保证在该功能中数据的合法性,而当使用该数据时,没有再编码来检查可以使用的范围:而此时,另一个功能修改了共享数据,当再使用这些数据时,就产生了缺陷。
2. 如何发现问题
当应用程序在同一时间完成一个以上的功能或当一个以上的功能在同一时间处于运行状态时,就可以使用该方法进行测试。利用一个功能影响输入、输出数据或另一个功能的计算。
在测试前要确定哪些功能是相互依赖或共享数据的:
Ø 能应用同样输入的每个功能。如果这些功能有相互重叠的输入域,就可能存在交互问题。
Ø 有类似的输出产生的功能。如果某些功能结合起来产生单个输出,就说明这些部件之间存在关系,应该被一起测试。
Ø 一个功能被包含在另一个功能的计算中。例如,要测试鼠标选取对象的功能,不仅要测试鼠标选取屏幕上的文本的功能,还可以把包含超链接文本、粗体、斜体、符号及图形等元素放在一起,测试鼠标选取这些元素的功能。
3. 测试方法小结
Ø 应用场合:一个以上的功能在同一时间处于运行状态。
Ø 测试方法:以点代面,重点测试某一功能,对可能与这个功能相连的其他功能附带测试。
Ø 测试知识储备:全面掌握被测软件的需求,在测试之前对被测功能之间的依赖关联有所掌握,另外还需要对共享数据有所掌握。
11.3.8 文件系统超载
案例
按容量填满文件系统会确保应用程序能很好地处理满磁盘的情况。一旦Canned HEAT模拟了满状态下的磁盘,就应该抓住每个机会试着强制应用程序打开、关闭、读取、写入和修改文件。这样能发现访问文件的位置,但是对满状态下的磁盘,软件无法实施检查。
1. 分析缺陷产生的原因
目前几十甚至几百GB字节的硬盘都很常见,但是想填满如此大的空间也不是很难的事情。陪着时间的推移,文件系统越来越满。许多用户从来不清空回收站,并在有严重碎片的硬盘上操作;另外,用户保存的文件也越来越大,例如几个小时的DV摄像内容。因此说巨大的硬盘很容易被填满。
大多数开发人员也已习惯于过大的存储器,他们可能会忘记编写代码处理满状态的文件系统,或者根本就没想到现实中最终会发生这种情况。他们完全忽略了诸如CreateFile、WriteFile等操作系统API的错误检查代码,没有这样的代码,当显示满状态的文件系统时,API调用就会失效,软件就会在没有任何警告的情况下崩溃。
2. 如何发现问题
分析应用程序,并记录下属于通过输入或输出访问文件系统的操作。如打开、保存、另存为、新建、关闭文件等菜单项,都需要用户操作才能访问文件系统。另一种情况是应用程序自动启动的文件读取和写入,如自动保存文件功能(如在Word中设置每隔10分钟自动存储文件),简单的页面交换等不需要用户操作就可以访问文件的操作。
创建满容量或近乎满容量的文件系统,然后强制执行各种通过输入或输出访问文件系统的操作;或者打开足够多的文件,打开文件时会强制备份创建的副本,从而占用双倍的存储空间,这种操作达到一定程度时,会达到该系统的容量,于是就能测试应用程序处理超载状态的文件系统的能力。
但是执行这种测试所必需的满文件系统的维护很繁琐,如果每次测试都要删除文件并重新生成,就会增加大量的工作量。所以通常在进行关于文件系统的测试时,可以使用一些测试具模拟磁盘的状况。例如,模拟没有足够的磁盘空间。
3. 测试方法小结
Ø 应用场合:系统较大,运行时需要较大的空间。
Ø 测试方法:强制磁盘系统满容量或容量小于等于被测软件运行时所需容量后,运行被测软件或利用测试工具模拟磁盘状况。
Ø 测试知识储备:全面掌握被测软件的需求,了解被测软件处理超载状态的文件系统的能力。
11.3.9 介质忙、不可用或损坏
强制介质忙或不可用会保证与存在问题的存储设备相关的错误条件得到测试。其思想是,当应用程序访问硬盘驱动、软盘驱动或其他外部存储设备时,强制错误返回码标明介质存在的问题。如果开发人员无法对这些条件编写适当的错误处理程序,应用程序就会失败。
1. 分析缺陷产生的原因
大多数操作系统都能同时运行许多应用程序(多任务),一些应用程序在后台运行,且用户不可见,这些应用程序常被称为服务程序;用户应用程序也能同时运行,在Windows中,用户可以利用Alt+Tab键在用户启动的前台和后台应用程序之间进行切换。
当多个应用程序同时访问硬盘(或其他存储器),操作系统为提供多请求服务会慢下来,并且必须对应用程序进行编程以处理这些延迟,当延迟变得很长时,没有对这些错误进行响应的应用程序就会出现错误。
损坏的介质可能会使操作系统传回错误代码,这些错误代码没有在应用程序中编程处理。(无法通过对应用程序编程进行处理)
操作系统不能检测出所有这样的错误,操作系统自己也有错误或者损坏的介质损坏了部分操作系统。
2. 如何发现问题
通过启动大量应用程序,强制它们都打开并保存文件使文件系统处于繁忙状态;或者同时下载大量文件也可以使后台拥挤:可以使用一些测试工具模拟磁盘的状况,例如,模拟系统打开了太多的文件。检查被测软件能否正确处理这种情况,应用程序应该给出错误信息或等待指示,提示用户正在处理。
损坏介质的方法并不多,只有少数公司采用,大多是开发操作系统、设备驱动程序以及以安全性为主的应用程序的公司会采用这种测试方法。确定是否使用该方法,主要要考虑数据对用户的重要性。
用该方法来测试时,只能使用实际损坏了的介质,例如,刮伤、灰尘、磁干扰等。检查应用程序对错误的处理能力,应用程序可以对错误进行处理或者将问题告诉用户,并要确保用户数据文件不丢失、不损坏。
3. 测试方法小结
Ø 应用场合:应用程序的运行需要消耗大量内存或运行时需求其他相关软件同时运行,应用程序对安全的要求较高,对灾难恢复的要求较高。
Ø 测试方法:启动大量程序或利用测试工具模拟磁盘状况,用实际损坏介质的方法测试应用程序。
Ø 测试知识储备:全面掌握被测软件的需求,了解被测软件运行时对系统的要求。
11.3.10 更改文件访问权限
1. 分析缺陷产生的原因
在操作系统中,可以设置不同用户(如普通用户、管理员用户)对不同的文件具有不同的访问权限(如读写、只读等)。例如,当以只读方式打开一个文件,并尝试给文件中写数据的时候就会出现问题。程序员必须在访问文件的函数中考虑文件的访问权限,例如在每个文件写入之前检查文件的访问权限。如果没有进行检查,就会导致程序出错。另外,如果文件访问失败,程序员必须要有正确处理错误的代码,以保证程序可以正确捕获所产生的错误。
2. 如何发现问题
Ø 打开两个应用程序,关闭同一个文件。例如,把同一应用程序的不同版本安装在同一机器上,在不同版本的应用程序中打开和关闭同一文件,或试着在某个应用程序中打开在另一个程序中已打开的文件,这可能会导致文件访问权限的冲突。
Ø 打开一个文件,在操作系统中修改该文件的访问权限。有些操作系统允许权限高的用户控制一般用户已经打开的文件
3. 测试方法小结
Ø 应用场合:需要对文件进行读写操作的应用程序。
Ø 测试方法:修改文件访问权限或用低权限的用户访问文件。
Ø 测试知识储备:全面掌握被测软件的需求,了解读写文件所需的权限。
11.3.11 文件内容受损
案例分析
在WindowsXP的Excel 2000中新建文件,然后在Office字处理软件中编辑该文件,并再次保存成.xls格式,由于该字处理软件的问题,此时文件内容被破坏,而后在Excel 2000中打开并编辑该文件后保存,Excel不能处理内容遭到破坏的文件,如图11-9所示,彻底崩溃。

图11-9 出现系统错误提示
1. 分析缺陷产生的原因
开发人员编写代码来读取和写入文件,他们也编写代码来调用系统API得到文件指针,并打开和关闭文件。由于某些原因,这些系统API会失败或传回异常返回值。如果开发人员没有编写代码来验证传回的预期返回值,则应用程序会由于无法处理异常而失败。
存在异常返回值可能是因为某个文件被另一个用户锁住,或有写保护,或有访问权限限制。
文件API也会因为其他不常见的原因而失败,如文件处于硬盘的某个坏扇区或有格式不正确的数据。
另外,除了要检查API返回码,开发人员也必须编写代码验证文件的格式和内容。验证格式包括验证与二进制相对的文本格式、合适的分隔符以及数据类型正确的字段值。验证内容包括验证用于预期目标的数据是否在正确的合法范围内。如果这一代码的任何部分发生错误或丢失,软件也会失效。没有确认文件格式或内容意味着受测软件可能要处理非法数据。分隔符不匹配会引起字段读取次序错误,并且常会破坏使用这些值的内部计算。
2. 如何发现问题
Ø 手工损坏文件。从应用程序已创建的某个完整文件开始对其进行编辑,改变文件格式和内容。若是文本文件,使用标准编辑器进行文件修改:若是二进制文件,使用如UltraEdit的十六进制编辑器,可以对文件的分隔符和实际的字段值进行删除、复制、添加和修改。
Ø 使用测试工具。模拟CRC(循环冗余校验)错误,或强制文件API返回无效的返回码。
3. 测试方法小结
Ø 应用场合:需要对文件格式和内容进行校验的应用程序。
Ø 测试方法:手工损坏文件或利用测试工具模拟CRC错误。
测试知识储备:全面掌握被测软件的需求,了解文件读写需要的权限。

