简答题
1.为什么说软件测试是软件开发中不可缺少的重要一环,但不是软件质量保证的安全网?
① 软件测试是软件开发中不可缺少的重要一环,原因是:
• 测试的工作量约占整个项目开发工作量的40%左右,几乎一半。如果是关系到人的生命安全的软件,测试的工作量还要成倍增加。
• 软件测试代表了需求分析、设计、编码的最终复审。
② 软件测试不是软件质量保证的安全网,因为软件测试只能发现错误,不能保证没有错误。
2.软件测试的目的是什么?为什么把软件测试的目的定义为只是发现错误?
软件测试的目的有:
① 软件测试是为了发现错误而执行程序的过程。
② 一个好的测试用例能够发现至今尚未发现的错误。
③ 一个成功的测试是发现了至今尚未发现的错误。
软件测试的目标定义为只是发现错误,原因是软件测试可以有两个目标,一个是预防错误,另一个是发现错误。由于软件开发是人的创造性劳动,人的活动不可能完美无缺,错误可能发生在任何一个阶段,因此预防错误这一目标几乎是不可实现的,所以软件测试的目标定义为只是发现错误。
3.软件测试应当遵循什么原则?为什么要遵循这些原则?
软件测试应当遵循的原则及原因如下:
① 用例由输入数据和预期的输出数据两部分组成,因为这样便于对照检查,做到有的放矢。
② 用例不仅选用合理的输入数据,还要选择不合理的输入数据。因为当以特殊方式使用程序时,会突然发现程序中有许多错误,故使用预期的不合理的输入数据进行程序测试,比用合理的输入数据收获要大,从而能更多地发现错误,提高程序可靠性。
③ 除了检查程序是否做了它应该做的事,还应该检查程序是否做了它不应该做的事,因为如果程序做了它不应该做的事,即使程序能做它应该做的事,程序也是错误的。
④ 应制定测试计划并严格执行,因为这样可以排除随意性。
⑤ 长期保留测试用例,因为测试用例的设计耗费很大的工作量,而修改后的程序可能有新的错误,需要进行回归测试,故必须将测试用例作为文档保存,使测试具有可重复性,同时测试用例是将来系统维护测试与确认的依据,保存测试用例也为以后的维护提供方便。
⑥ 对发现错误较多的程序段,应进行更深入的测试,因为发现错误较多的程序段,其质量较差,同时在修改错误过程中又容易引入新的错误。
⑦ 程序员避免测试自己设计的程序,因为测试目的是找错。从心理学角度讲,程序员大多对自己的程序存有偏见,总认为没有错误或错误不大,另外程序员对需求规格说明的理解而引入的错误则更难发现,应该由别人或另外的机构来测试会更客观、更有效。
4.软件测试的步骤是什么?这些测试与软件开发各阶段之间的关系?
软件测试的步骤及关系如下所示:
5.软件测试的过程是什么?
软件测试是一个规则的过程,包括测试设计、测试执行以及测试结果比较等。
① 测试设计:根据软件开发各阶段的文档资料和程序的内部结构,利用各种设计测试用例技术精心设计测试用例。
② 测试执行:利用这些测试用例执行程序,得到测试结果。
③ 测试结果比较:将预期的结果与实际测试结果进行比较,如果二者不符合,对于出现的错误进行纠错,并修改相应文档。修改后的程序还要进行再次测试,直到满意为止。如果测试发现不了错误,可能由于测试配置考虑不周到,应考虑重新制定测试方案,设计测试用例。
6.单元测试、集成测试和确认测试各自主要目标是什么?它们之间有什么不同?相互有什么关系?
单元测试、集成测试和确认测试各自主要目标是:
① 单元测试的主要目标是检查各个模块是否正确实现规定的功能,从而发现模块在编码中或算法中的错误。
② 集成测试的主要目标是检查与设计相关的软件体系结构的有关问题。
③ 确认测试的主要目标是检查已实现的软件是否满足需求规格说明书中确定的各种需求。
单元测试、集成测试和确认测试之间的不同如下:
① 测试内容不同:单元测试集中于单个模块的功能和结构检验,其测试内容主要包括模块接口、局部数据结构、重要的执行路径、错误处理和边界测试;集成测试集中于模块组合的功能和软件结构检验,其测试内容主要包括模块组装中可能出现的问题,即数据穿过接口可能丢失、一个模块可能破坏另一个模块的内容、子功能组装可能不等于主功能、全程数据结构问题、误差累积问题;确认测试集中于论证软件需求的可追溯性,主要包括测试软件功能和性能是否与软件需求一致、测试软件配置的所有程序与文档是否正确完整而且一致。
② 测试的方法不同:单元测试总是使用白盒测试法,为被测模块设计驱动模块和桩模块;集成测试使用渐增式测试和非渐增式测试,渐增式测试又有分为自顶向下结合法和自底向上结合法;确认测试总是使用黑盒测试法。
③ 发现的错误不同:单元测试发现的错误主要是在编码阶段产生的错误,集成测试发现的错误主要是在设计阶段产生的错误,确认测试发现的错误主要是在需求分析阶段产生的错误。
④ 涉及的文档不同:单元测试涉及编码和详细设计文档,集成测试涉及详细设计文档和概要设计文档,确认测试涉及软件需求规格说明书和用户手册。
三者相互关系是:单元测试、集成测试和确认测试是顺序实现的。首先单元测试对各个模块进行测试,然后集成测试以单元测试为基础,将所有已测模块按照设计要求组装成一个完整的系统,对模块组合的功能和软件结构检验进行测试,最后确认测试是以集成测试为基础,测试集成的软件是否满足需求规格说明书中确定的各种需求。
7.什么是黑盒测试与白盒测试?它们都适应哪些测试?
① 黑盒测试指把测试对象看成一个黑盒子,测试人员完全不考虑程序的内部结构和处理过程,只在软件的接口处进行测试,依据需求规格说明书,检查程序是否满足功能要求,又称为功能测试或数据驱动测试。
② 白盒测试指把测试对象看成一个打开的盒子,测试人员需了解程序的内部结构和处理过程,以检查处理过程的细节为基础,对程序中尽可能多的逻辑路径进行测试,检验内部控制结构和数据结构是否有错,实际的运行状态与预期的状态是否一致。
③ 白盒测试适应的测试有单元测试、逻辑覆盖(按逻辑覆盖程度不同,有语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。)、循环覆盖(限制循环次数,有单循环和嵌套循环)和基本路径测试。
④ 黑盒测试适应的测试有:确认测试、等价类划分、边界值分析、错误推测和因果图。
8.简述软件测试与软件调试的区别。
软件测试与软件调试在目的、技术和方法等方面存在很大的区别,主要表现在:
① 测试从一个侧面证明程序员的失败,而调试是为了证明程序员的正确。
② 测试从已知条件开始,使用预先定义的程序,且有预知的结果,不可预见的只是程序是否通过测试。调试一般以不可知的内部条件开始,除统计性调试外,结果是不可预见的。
③ 测试是有计划的,并要进行测试设计,而调试是不受时间约束的。
④ 测试是一个发现错误、改正错误、重新测试的过程,而调试是一个推理过程。
⑤ 测试的执行是有规程的,而调试的执行往往要求程序员进行必要的推理及知觉的飞跃。
⑥ 测试经常由独立的测试组在不了解软件设计的前提下完成,而调试必须由了解详细设计的程序员完成。
⑦大多数测试的执行和设计可由工具支持,而调试时,程序员能利用的工具主要是调试器。