第6章系统测试、实施与维护 6,1软件测试 6,2调试 6.3系统实施 6,4系统维护 6.5实验五 BACK
第6章 系统测试、实施与维护 6.1 软 件 测 试 6.2 调 试 6.3 系 统 实 施 6.4 系 统 维 护 6.5 实 验 五
61软件测试 611测试的基本概念 软件测试是对软件计划、软件设计、软件编码进行査错和纠错的活 动。测试的目的是为了找出软件开发过程中各个阶段的错误,以便分析 错误的性质和确定错误的位置,并纠正错误。 软件测试伴随着程序设计的出现而出现,随着软件技术的发展,人 们对软件测试的认识也在不断加深。通常人们认为“软件测试是为了证 明软件是正确的”。实际上这种认识是错误的。1983年,IEE提出的软 件工程标准术语中软件测试的定义是:“使用人工或自动手段来运行或 测定某个系统的过程,其目的在于检验它是否满足规定的需求,或弄清 预期结果与实际结果之间的差别”。 G.J. Myers则认为“程序测试是为了 发现错误而执行程序的过程
6.1 软 件 测 试 6.1.1 测试的基本概念 软件测试是对软件计划、软件设计、软件编码进行查错和纠错的活 动。测试的目的是为了找出软件开发过程中各个阶段的错误,以便分析 错误的性质和确定错误的位置,并纠正错误。 软件测试伴随着程序设计的出现而出现,随着软件技术的发展,人 们对软件测试的认识也在不断加深。通常人们认为“软件测试是为了证 明软件是正确的”。实际上这种认识是错误的。1983年,IEEE提出的软 件工程标准术语中软件测试的定义是:“使用人工或自动手段来运行或 测定某个系统的过程,其目的在于检验它是否满足规定的需求,或弄清 预期结果与实际结果之间的差别”。G.J.Myers则认为“程序测试是为了 发现错误而执行程序的过程
上面的两种定义有不同的强调方面,关于软件测试的概念,我们 要注意以下两点: (1)软件测试是为了发现程序中的错误而不是证明程序的正确性。 按照 Myers的观点,“成功的测试是发现了至今尚未发现的错误的测 试”。当然测试的目的不仅仅是发现错误,还包含检验、评价等。 (2)软件测试方法不仅仅是执行程序,也包括人工方法。事实上, 人工测试在某些测试阶段可以发现大部分的错误
上面的两种定义有不同的强调方面,关于软件测试的概念,我们 要注意以下两点: (1) 软件测试是为了发现程序中的错误而不是证明程序的正确性。 按照Myers的观点, “成功的测试是发现了至今尚未发现的错误的测 试”。当然测试的目的不仅仅是发现错误,还包含检验、评价等。 (2) 软件测试方法不仅仅是执行程序,也包括人工方法。事实上, 人工测试在某些测试阶段可以发现大部分的错误
612测试的基本原则 要高质量地完成测试工作,找出软件中的错误,应该遵守下面的 些基本原则: (1)测试队伍与开发队伍应分别建立。 开发和测试工作两者在思想和方法上都是不一样的,为了保证测试 的质量,应分别建立开发和测试队伍。开发工作是建设性的,而在测试 阶段,人们设计出一系列的输入数据(称为测试用例),目的是为了 “破坏”已经建造好的软件。就像给硬件产品做髙低温试验、震动试验、 破坏性试验一样。而且一般程序编写者往往认为自己编写的程序是正确 的,要他们找出自己程序中的错误是十分困难的
6.1.2 测试的基本原则 要高质量地完成测试工作,找出软件中的错误,应该遵守下面的一 些基本原则: (1) 测试队伍与开发队伍应分别建立。 开发和测试工作两者在思想和方法上都是不一样的,为了保证测试 的质量,应分别建立开发和测试队伍。开发工作是建设性的,而在测试 阶段,人们设计出一系列的输入数据(称为测试用例),目的是为了 “破坏”已经建造好的软件。就像给硬件产品做高低温试验、震动试验、 破坏性试验一样。而且一般程序编写者往往认为自己编写的程序是正确 的,要他们找出自己程序中的错误是十分困难的
(2)设计测试用例时,要给出测试的预期结果。 个测试用例应由两部分组成: ①对程序进行测试的一组输入数据的描述; ②由这一组输入数据所产生的程序的预期输出结果的描述 预期输出结果不一定是精确的输出结果,对于一些复杂的计算, 人工计算结果可能需要很大的工作量,可以给出一个对输出结果有效 范围的描述。 (3)设计测试用例时,应包括对有效的和期望的输入条件的测试, 也应包括对无效的和非期望的输入条件的测试 个程序不仅当输入合法时能正确运行,而且当有非法输入时, 应该能够拒绝这些非法输入,并给出适当的提示信息
(2) 设计测试用例时,要给出测试的预期结果。 一个测试用例应由两部分组成: ① 对程序进行测试的一组输入数据的描述; ② 由这一组输入数据所产生的程序的预期输出结果的描述。 预期输出结果不一定是精确的输出结果,对于一些复杂的计算, 人工计算结果可能需要很大的工作量,可以给出一个对输出结果有效 范围的描述。 (3) 设计测试用例时,应包括对有效的和期望的输入条件的测试, 也应包括对无效的和非期望的输入条件的测试。 一个程序不仅当输入合法时能正确运行,而且当有非法输入时, 应该能够拒绝这些非法输入,并给出适当的提示信息
(4)在程序修改之后,要进行回归测试 对程序的任何修改都有可能引入新的错误,所以必须进行回归测 试,即将以前的所有测试用例再次输入测试,而不是仅仅测试以前结 果不正确的测试用例。回归测试有助于发现由于修改程序而引入的新 错误。 (5)对发现错误较多的程序段,应进行深入的测试。 如果发现某个程序段错误较多,则表明这个程序段质量很低,有 可能隐藏有更多的错误,应该进行深入的测试
(4) 在程序修改之后,要进行回归测试。 对程序的任何修改都有可能引入新的错误,所以必须进行回归测 试,即将以前的所有测试用例再次输入测试,而不是仅仅测试以前结 果不正确的测试用例。回归测试有助于发现由于修改程序而引入的新 错误。 (5) 对发现错误较多的程序段,应进行深入的测试。 如果发现某个程序段错误较多,则表明这个程序段质量很低,有 可能隐藏有更多的错误,应该进行深入的测试
613测试方法 软件测试方法有多种,这些测试方法具有不同的思路和 出发点。总的来说,测试方法可分为静态测试方法和动态测 试方法两大类。 所谓静态测试方法,是指不在计算机上运行被测试程序, 而是采用其它手段达到对程序进行检测目的的测试方法。静 态测试方法包括人工测试方法和计算机辅助静态分析方法。 所谓动态测试方法,是指在计算机上运行被测试程序, 并用所设计的测试用例对程序进行检测的方法。动态测试方 法根据设计测试用例的思想不同可分为白盒测试、黑盒测试 以及穷举测试等
6.1.3 测试方法 软件测试方法有多种,这些测试方法具有不同的思路和 出发点。总的来说,测试方法可分为静态测试方法和动态测 试方法两大类。 所谓静态测试方法,是指不在计算机上运行被测试程序, 而是采用其它手段达到对程序进行检测目的的测试方法。静 态测试方法包括人工测试方法和计算机辅助静态分析方法。 所谓动态测试方法,是指在计算机上运行被测试程序, 并用所设计的测试用例对程序进行检测的方法。动态测试方 法根据设计测试用例的思想不同可分为白盒测试、黑盒测试 以及穷举测试等
1.人工测试方法 人工测试方法是指依靠人而不是计算机来对程序进行检测的方法 人工测试可以找出计算机测试不容易发现的错误,可以减少系统测试 的总工作量。根据统计,人工测试能有效地发现30%70%的逻辑设计 和编码错误。 人工测试可以采用人工运行和代码审查的方式。代码审查可以由 程序编写者本人非正式地进行,也可以由审查小组正式进行。代码审 査主要是对照常见程序错误清单对程序代码进行分析审査,并将发现 的错误记录下来 表61是由 Myers提供的常见程序错误清单,该表主要针对 FORTRAN一类的程序设计语言所编写的程序,其它的程序设计语言 编写的程序也可参照该清单。表中的参数相当于C语言中函数的形式 参数,而变元相当于C语言中函数调用时的实际参数
1. 人工测试方法 人工测试方法是指依靠人而不是计算机来对程序进行检测的方法。 人工测试可以找出计算机测试不容易发现的错误,可以减少系统测试 的总工作量。根据统计,人工测试能有效地发现30%~70%的逻辑设计 和编码错误。 人工测试可以采用人工运行和代码审查的方式。代码审查可以由 程序编写者本人非正式地进行,也可以由审查小组正式进行。代码审 查主要是对照常见程序错误清单对程序代码进行分析审查,并将发现 的错误记录下来。 表6.1是由Myers提供的常见程序错误清单,该表主要针对 FORTRAN一类的程序设计语言所编写的程序,其它的程序设计语言 编写的程序也可参照该清单。表中的参数相当于C语言中函数的形式 参数,而变元相当于C语言中函数调用时的实际参数
表61 Myers提供的常见程序错误清单 、模块接口检査表 模块接收的输入参数个数与模块的变元个数是否一致? 2参数与变元的属性是否匹配? 3.参数与变元所用的单位是否一致? 4传送给被调用模块的变元的数目是否等于那个模块的参数的数目? 5传送给被调用模块的变元属性和参数的属性是否一致? 6传送给被调用模块的变元的单位和参数的单位是否一致? 7传送给内部函数的变元属性、数目和次序是否正确? 8是否修改了只是作为输入用的变元? 9全程变量的定义在各个模块中是否一致? 10有没有把常数当作变量来传送?
表6.1 Myers提供的常见程序错误清单 一、模块接口检查表 1.模块接收的输入参数个数与模块的变元个数是否一致? 2.参数与变元的属性是否匹配? 3.参数与变元所用的单位是否一致? 4.传送给被调用模块的变元的数目是否等于那个模块的参数的数目? 5.传送给被调用模块的变元属性和参数的属性是否一致? 6.传送给被调用模块的变元的单位和参数的单位是否一致? 7.传送给内部函数的变元属性、数目和次序是否正确? 8.是否修改了只是作为输入用的变元? 9.全程变量的定义在各个模块中是否一致? 10.有没有把常数当作变量来传送?
、完成外部输入/输出时的检査表 4.文件属性是否正确? 2打开文件语句是否正确? 3格式说明与输入输出语句给出的信息是否一致? 4缓冲区大小与记录大小是否匹配? 5是否所有文件在使用前都已打开了? 6对文件结束条件的判断和处理是否正确? 7对输入/输出错误的处理是否正确? 8.输出信息中有没有正文错误?
二、完成外部输入/输出时的检查表 4. 文件属性是否正确? 2.打开文件语句是否正确? 3.格式说明与输入/输出语句给出的信息是否一致? 4.缓冲区大小与记录大小是否匹配? 5.是否所有文件在使用前都已打开了? 6.对文件结束条件的判断和处理是否正确? 7.对输入/输出错误的处理是否正确? 8.输出信息中有没有正文错误?