一、测试分类
1、软件测试分几种类型,主要解决什么问题?
答:1、按是否查看程序内部结构划分:
(1)白盒测试(white-box testing):研究源代码和程序结构;
(2)黑盒测试(black-box testing):只关心输入和输出的结果。其中黑盒测试包括功能测试和性能测试:功能测试有【逻辑功能测试、界面测试、易用性测试、安装测试、兼容测试】;性能测试有【一般性能测试、稳定性测试、压力测试、负载测试】。
2、按是否运行程序划分:
(1)静态测试(static testing):指不实际运行被测软件,而只是静态地检查程序代码、界面或文档可能存在的错误的过程;
(2)动态测试(dynamic testing):指实际运行被测程序,输入相应的测试数据,检查输出结果和预期结果是否相符的过程。
3、按阶段划分:
(1)单元测试(unit testing):指对软件中的最小可测试单元进行检查和验证;
(2)集成测试(integration testing):指单元测试的下一阶段,将通过测试的单元模块组装成系统或子系统,再进行测试,重点测试不同模块的接口部分。集成测试就是用来检查各个单元模块结合到一起能否协同配合,正常运行;
(3)系统测试(system testing):指将整个软件系统看做一个整体进行测试,包括对功能、性能以及软件所运行的软硬件环境进行测试。系统测试的主要依据是《系统需求规格说明书》文档。
(4)验收测试(acceptance testing):指在系统测试的后期,以用户测试为主,或有测试人员等质量保障人员共同参与的测试,它也是软件正式交给用户使用的最后一道工序。
其他还有回归测试、冒烟测试、随机测试。
1.2、论述软件测试的基本任务,方法和策略及其在现代软件工程的地位。
答:测试的目的:
1)为了证明程序有错,而不是证明程序无错;
2)一个好的测试用例在于能够发现至今未发现的错误;
3)一个成功的测试是发现了至今未发现的错误的测试。
测试的方法:1)白盒测试方法;2)黑盒测试方法;3)其他测试方法。
测试的策略:按阶段进行测试是一种基本的测试策略。
1)单元测试
2)集成测试
3)系统测试
4)确认测试
软件测试在软件工程中的地位:覆盖整个生命周期。从需求阶段已介入,编写测试计划、测试用例、测试总结等。
1.3、什么是软件可测试性?讨论软件工程与软件可测试性。
答:软件的可测试性是指一个计算机程序能够被测试的容易程度,以及在一定的时间和成本前提下,软件【发现+隔离+定位】故障的能力特性。软件工程是研究用工程化方法开发和维护【高质量、经济、有效、大型】的软件的一门学科。
软件工程的目标是:在给定成本、进度的前提下,开发出具有【适用性、有效性、可修改性、可靠性、可理解性、可维护性、可重用性、可移植性、可追踪性、可互操作性和满足用户需求】的软件产品。
在软件完成后,必须保证其能够防止因概念、设计和结构等方面的不完善造成的软件系统失效,具有挽回因操作不当造成软件系统失效的能力,也就是要达成软件可靠性。软件测试正是保证软件可靠性的一项非常重要的技术保障。因此,在软件工程中,必须在软件设计时就考虑好软件的可测试性,这样才能在软件完成后通过测试,调整改进软件的不足,满足其可靠性要求。
二、测试用例
2、在软件测试中,应注意哪些原则?
什么叫测试用例,如何设计测试用例?
答:(1)测试用例由【输入数据+预期输出结果】两部分组成。这样便于对照检查,做到“有的放矢”。
(2)测试用例选择【合理输入+不合理输入】数据组成。这样能更多地发现错误,提高程序的可靠性。对于不合理的输入数据,程序应拒绝接收(错误处理),并给出相应提示。
(3)长期保留测试用例。测试用例的设计耗费很大的工作量,必须作为文档保存。因为修改后的程序可能有新的错误,需要进行回归测试。同时,为以后的维护提供方便。
(4)检查程序【该做的事+不应该做的事】。例如:程序是否打印出用户并不需要的多余信息。
(5)制定【测试计划+严格执行】,排除随意性。
(6)对发现【错误较多程序段+深入的测试】。有统计数字表明,一段程序中己发现的错误越多,其中存在的错误概率也越大。因为发现错误数越多的程序段,其质量较差。同时在修改错误过程中又容易引入新的错误。
(7)避免程序员自测程序。测试是一种“挑剔性”的行为,心理状态是测试自己程序的障碍。另外,对需求规格说明的理解而引入的错误则更难发现。因此由别的人或另外的机构来测试程序员编写的程序会更客观、更有效。
解析:测试用例(Test Case)是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求。
测试种类:白盒测试、黑盒测试、静态测试、动态测试;
种类组合:静态白盒测试、静态黑盒测试、动态白盒测试、动态黑盒测试。
2.2、什么是测试用例?动态测试有哪些方法?
简述黑盒测试和白盒测试及其适用性。
答:答:(1)测试用例的定义:为寻找程序中的错误而精心设计的一组测试数据,每个测试用例一般是一个二元组(输入数据、预期输出结果)。
(2)动态测试的分类:白盒法和黑盒法。但无论白盒法还是黑盒法都只能选择一些有代表性的测试用例进行有限的测试。
①白盒法:也称结构测试或逻辑驱动测试,它是按照程序内部的结构测试程序,通过测试来检测产品内部动作是否按照设计规格说明书的规定正常进行,检验程序中的每条通路是否都能按预定要求正确工作。这一方法是把测试对象看作一个打开的盒子,测试人员依据程序内部逻辑结构相关信息,设计或选择测试用例,对程序所有逻辑路径进行测试,通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。
②黑盒法:着重测试被测试程序的功能,而不关心内部如何实现其功能的结构,是从用户观点出发的测试。具体方法有四种:采用黑盒法的综合策略是先用等价类划分法(包括边界值分析法,即取边值上的数)设计出测试用例,然后用错误推测法补充。如果被测试程序含有多个条件的逻辑组合,则开始就用因果图法。黑盒子测试力图发现以下问题:
1、功能是否正确或者符合要求;
2、界面是否错误;
3、数据结构错误或外部数据库访问错误;
4、性能不符合。
解析:对于白盒和黑盒测试,他们两者是不能互相替代的,白盒测试主要是早阶段进行的,黑盒测试时后阶段进行的。
三、测试回溯
3、简述回溯测试和作用。
答:回溯法采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。回溯法通常用最简单的递归方法来实现,在反复重复上述的步骤后可能出现两种情况:
1、找到一个可能存在的正确的答案;
2、在尝试了所有可能的分步方法后宣告该问题没有答案;
作用:找出满足约束条件的所有解。
四、质量度量模型
4、说明McCall软件质量度量模型。
软件的可维护性与哪些因素有关,如何提高软件的可维护性?
答:McCall质量度量模型:McCall等人于1979年提出的软件质量模型。针对面向软件产品的运行、修正、转移,软件质量概念包括11个特性,其定义如下。
(1)面向产品运行
①正确性:软件满足设计规格说明及用户预期目标的程度。
②可靠性:软件按照设计要求,在规定时间和条件下不出故障、持续运行的程度。
③易用性:用户熟悉、使用及准备输入和解释输出所需工作量的大小。
④效率:为了完成预定功能,软件系统所需的计算机资源和程序代码数量。
⑤完整性:对非授权人访问软件或数据行为的控制程度。
(2)面向产品修正
①可维护性:找到并改正程序中的一个错误所需代价。
②可测试性:测试软件以确保其能够执行预定功能所需工作量。
③灵活性:修改可运行程序所需要付出的努力。
(3)面向产品转移
①连接性:将一个系统耦合到另一个系统所需的工作量。
②可移植性:将一个软件系统从一个计算机系统或环境移植到另一个计算机系统或环境中运行所需的工作量。
③复用性:一个软件(或软件的部件)能再次用于其他相关应用的程度。
如何提高:1.建立明确的软件质量目标。2.采用现代化的开发方法。3.建立明确的质量保证审查。4.选择可维护的语言。5.改进程序员的文档。
4.2、一个程序能既正确又不可靠吗?解释自己的答案。
答:(1)软件可靠性:软件按照设计要求,在规定时间和条件下不出故障、持续运行的程度。软件可靠性包含【正确性+健壮性】,即不仅在预定环境下程序应该能正确地完成预期功能,而且在硬件发生故障、输入的数据无效或用户操作错误等意外环境下,程序也应该能作出适当的响应。
(2)如果一个程序在预定环境下能够正确地完成预期的功能,但是在意外环境下不能作出适当的响应,则该程序就是既正确又不可靠。
五、渐进式测试
5、非渐增式测试与渐增式测试有什么区别?
答:(1)集成测试的方法主要有两种:非渐增式测试和渐增式测试。
①非渐增式测试:首先对每个模块分别进行单元测试,然后再把所有的模块按设计要求组装在一起进行测试。
②渐增式测试:逐个把未经过测试的模块组装成到已经测试的模块上去,进行集成测试。每加入一个新模块进行一次集成测试,重复此过程直至程序组装完毕。
(2)非渐增式测试和渐增式测试的区别
①非渐增式:把单元测试和集成测试分成两个不同的阶段,前一阶段完成模块的单元测试,后一阶段完成集成测试。而渐增式测试把单元测试与集成测试合在一起,同时完成。
②非渐增式:需要更多的工作量,因为每个模块都需要驱动模块和桩模块,而渐增式利用己测试过的模块作为驱动模块或桩模块,因此工作量较少。
③非渐增式:开始可并行测试所有模块,能充分利用人力,对测试大型软件很有意义。
④渐增式:有利于排错,发生错误往往和最近加进来的模块有关,而非渐增式发现接口错误推迟到最后,很难判断是哪一部分接口出错。
⑤渐增式:可以较早地发现接口之间的错误,非渐增式最后组装时才发现。
⑥渐增式:占用的时间较多,但非渐增式需更多地驱动模块。桩模块也占用一些时间。
⑦渐增式:比较彻底,己测试的模块和新的模块再测试。
6、应该由谁来进行确认测试?是软件开发者还是软件用户?为什么?
答:(1)在对照需求做有效性测试和配置审查时,由软件【开发者】在开发环境下进行的测试。接下来做验收测试时则以【用户】为主,软件【开发和QA(quantity Assurance——质量保证)人员】也应参加。由用户参加设计测试用例,使用用户界面输入测试数据,并分析测试的输出结果,一般使用生产中的实际数据进行测试。
(2)如果软件是为多个用户开发的,则需要进行α和β测试:
α测试是由一个用户在开发环境下进行的测试,也可以是公司内部的用户在模拟实际操作环境下进行的测试,软件在应该自然设置状态下使用。开发者坐在用户旁边,随时记录错误情况和使用中的问题,这是在【受控制的环境下】进行的测试。
β测试是由多个用户在一个用户或多个用户的实际使用环境下进行的测试。这些用户是与公司签订了支持产品预发行合同的外部用户,他们要求使用产品,并愿意返回有关错误信息给开发者。与α测试不同的是,开发者通常不在测试现场。因此,β测试是在开发者【无法控制的环境下】进行的软件现场应用。
7、调试的目的是什么?调试有哪些技术手段?
答:(1)调试是在进行了成功的测试之后才开始的工作。调试的目的是确定错误的原因和位置,并改正错误,因此调试也称为纠错。
(2)调试技术
①简单的调试方法
a.插入打印语句:优点是能显示程序的动态过程,较易检查源程序中的有关信息。缺点是低效率,可能输出大量的无关的数据,发现错误带有偶然性,同时因插入打印语句要修改程序,这种修改可能会掩盖错误,改变关键的时间关系或把新的错误引入程序。
b.运行部分程序段:有时为了测试某些被怀疑有错的程序段,整个程序反复执行多次,使很多时间浪费在执行已经是正确的程序段上。在此情况下,应设法使被测程序只执行需要检查的程序段,以提高效率。可通过注释程序或开发语言所带的调试工具来查找错误。
②归纳法调试:从调试结果发现的线索(错误迹象、征兆)入手,分析它们之间的联系,导出错误原因的假设,然后再证明或否定这个假设。归纳法调试的具体步骤如下:
a.收集有关数据列出程序做对了什么,做错了什么的全部信息。
b.组织数据整理数据以便发现规律,使用分类法构造一张线索表。
c.提出假设分析线索之间的关系,导出一个或多个错误原因的假设。如果不能推测一个假设,再选用测试用例去测试,以便得到更多的数据。如果有多个假设,首先选择可能性最大的一个。
d.证明假设假设不是事实,需证明假设是否合理。不经证明就根据假设改错,只能纠正错误的一种表现(即消除错误的征兆)或只纠正一部分错误。如果不能证明这个假设成立,需提出下一个假设。
③演绎法调试:列出所有可能错误原因的假设,然后利用测试数据排除不适当的假设,最后再测试数据验证余下的假设确实是出错的原因。演绎法调试的具体步骤如下:
a.列出所有可能错误原因的假设;b.排除不适当的假设;c.精化余下的假设;d.证明余下的假设。
④回溯法调试:该方法从程序产生错误的地方出发,人工沿程序的逻辑路径反向搜索,直到找到错误的原因为止。该方法是对小型程序寻找错误位置的有效方法。
7.2、纠错技术中的归纳法和演绎法的中心思想是什么?
答:1.归纳法:从许多个别事例中获得一个较具概括性的规则。这种方法主要是从收集到的既有资料,加以抽丝剥茧地分析,最后得以做出一个概括性的结论。归纳法是从特殊到一般,优点是能体现众多事物的根本规律,且能体现事物的共性。缺点是容易犯不完全归纳的毛病。
2.演绎法:则与归纳法相反,是从既有的普遍性结论或一般性事理,推导出个别性结论的一种方法。由较大范围,逐步缩小到所需的特定范围。演绎法是从一般到特殊,优点是由定义根本规律等出发一步步递推,逻辑严密结论可靠,且能体现事物的特性。缺点是缩小了范围,使根本规律的作用得不到充分的展现。
归纳法和演绎法在应用上并不矛盾,有些问题可采用前者,有些则采用后者。而更多情况,将两者结合着应用,则能收到更好的效果。
8、什么是软件的可靠性?它们能否定量计算?
答:(1)软件可靠性是指在给定的时间内,在规定的环境条件下系统完成所指定功能的概率。
(2)软件可靠性可以进行定量计算,常用指标是平均失效等待时间MTTF与平均失效间隔时间MTBF。假如对n个相同的系统(硬件或软件)进行测试,它们的失效时间分别是t1,t2,…,tn,则平均失效等待时间MTTF定义为:
MTBF是平均失效间隔时间,它是指两次相继失效之间的平均时间。
MTBF在实际使用时通常是指当n很大时,系统第n次失效与第n+1次失效之间的平均时间。
9、什么时候测试结束,为什么?
答:通过在测试过程中进行风险、测试、覆盖率、缺陷和信心这5个方面的评估,并和测试计划中的要求进行比较,若能满足要求,就结束测试。在软件消亡之前,如果没有测试的结束点,那么软件测试就永无休止,永远不可能结束。软件测试的结束点,要依据自己公司具体情况来制定,不能一概而论!个人认为测试结束点由以下几个条件决定:
1)基于“测试阶段”的原则
2)基于“测试用例”的原则
3)基于“缺陷收敛趋势”的原则
4)基于“缺陷修复率”的原则
5)基于“验收测试”的原则
6)基于“覆盖率”的原则
7)基于“项目计划”的原则
8)基于“缺陷度量”的原则
9)基于“质量成本”的原则
10)基于“测试行业经验”的原则
六、软件质量
10、论述软件测试与软件质量的关系。
答:1、软件质量:软件产品的特性可以满足用户的功能、性能需求的能力。软件过程:是人们通常所说的软件生命周期中的活动,包括软件需求分析、设计、编码、测试、交付、安装和维护。随着软件过程的开始,软件质量也逐渐建立起来。软件过程的优劣决定了软件质量的高低、好的过程是高效高质量的前提、人员和过程是决定软件质量的关键因素。高质量的人员和好的过程应该得到好的产品。
2、软件系统的开发包括一系列生产活动,其中由"人"带来的错误因素非常多,错误可能出现在程序的最初需求分析阶段,设计目标可能是错误的或描述不完整,也可能在后期的设计和开发阶段,因为人员之间的交流不够,交流上有误解或者根本不进行交流,所以尽管人们在开发软件的过程中使用了许多保证软件质量的方法和技术,但开发出的软件中还会隐藏许多错误和缺陷。可见,只有通过严格的软件测试,才能很好的提高软件质量,而软件质量并不是依靠软件测试来保证的,软件的质量要靠不断的提高技术水平和改进软件开发过程来保证,软件测试只是一种有效的提高软件质量的技术手段,而不是软件质量的安全网。
3、软件测试能够找出软件缺陷,确保软件产品满足需求。但是测试不是质量保证,二者并不等同。测试可以查找错误并进行修改,从而提高软件产品的质量。软件测试避免错误以求高质量,并且还有其他方面的措施以保证质量问题,如软件质量保证。
4、正规的软件测试系统主要包括:【制定计划、设计、实施、建立和更新测试文档】。而软件质量保证的工作主要为:【制定要求、组织度量、测试管理、变更控制、质量度量、对软件质量情况及时记录和报告】。软件质量保证的职能是向管理层提供正确的可行信息,从而促进和辅助设计流程的改进。软件质量保证的职能还包括监督测试流程,这样测试工作就可以被客观地审查和评估,同时也有助于测试流程的改进。二者的不同之处在于软件质量保证工作侧重对软件开发流程中的各个过程进行管理与控制,杜绝软件缺陷的产生。而测试则是对已产生的软件缺陷进行修复。
10.2、什么是软件质量?试叙述它与软件可靠性的关系。
答:(1)软件质量是软件与明确地和隐含地定义的需求相一致的程度。
(2)软件质量是软件与明确地叙述的功能和性能需求、文档中明确描述的开发标准以及任何专业开发的软件产品都应该具有的隐含特征相一致的程度。软件可靠性是程序在给定的时间间隔内按照规格说明书的规定成功地运行的概率。
10.3、提高软件质量和可靠性的技术有哪些?
答:(1)避开错误技术即在开发的过程中不让差错潜入软件的技术。进行质量管理,实现产品应有质量所必不可少的技术。但是,无论使用多么高明的避开错误技术,也无法做到完美无缺和绝无错误。
(2)容错技术即对某些无法避开的差错,使其影响减至最小的技术。容错技术即使错误发生也不影响系统特性,使错误发生时对用户影响限制在某些允许的范围内。
七、等价划分类
11、简要说明如何划分等价类。
答:(1)如果某个输入条件规定了取值范围的个数,则可确定一个合理的等价类(输入值或数在此范围内)和两个不合理等价类(输入值和个数小于这个范围的最小值或大于这个范围的最大值)。
(2)如果规定了输入数据的一组值,而且程序对不同的输入值做不同的处理,则每个允许输入值是一个合理的等价类,此外还有一个不合理等价类(任何一个不允许的输入值)。
(3)如果规定了输入数据必须遵循的原则,可确定一个合理等价类(符合规则)和若干个不合理等价类(从各种不同角度违反规则)。
(4)如果己划分的等价类中各元素在程序中的处理方式不同,则应将此等价类进一步划分为更小的等价类。
11.2、使用边界值分析方法设计测试用例的设计原则有哪些?
答:(1)如果输入条件规定了值的范围,可以选择正好等于边界值的数据作为合理的测试用例,还要选择刚好越过边界值的数据作为不合理的测试用例。
(2)如果输入条件指出了输入数据的个数,则按最大个数、最小个数、比最小个数少1、比最大个数多1等情况分别设计测试用例。
(3)对每个输出条件分别按照以上一组(1)和(2)确定输出值的边界情况。由于输出值的边界不与输入值的边界值相对应,所以要检查输出值的边界不一定可能,要产生超出输出值之外的结果也不一定能做到,但必要时还需试一试。
(4)如果程序的规格说明书给出的输入或输出域是个有序集合(如顺序文件、线性表、链表等),则应该选取集合的第一个元素和最后一个元素作为测试用例。
11.3、什么是边界值分析,与等价类划分有什么不同?
答:边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。
(1)边界值分析不是从某等价类中随便挑一个作为代表,而是使这个等价类的每个边界都要作为测试条件。
(2)边界值分析不仅考虑输入条件,还要考虑输出空间产生的测试情况。
八、桩模块
12、比较在集成测试中,自顶向下与自底向上、深度优先与宽度优先的优缺点。
答:自顶向下
优点:1、较早地验证主要的控制和判断点;2、可以首先实现和验证一个完整的软件功能,增强信心;3、减少了测试驱动程序开发和维护的费用;4、可以和开发设计工作一起并行执行集成测试,能够灵活的适应目标环境;5、容易进行故障隔离和错误定位。
缺点:桩模块的开发和维护费用大。
自底向上
优点:1、减少了桩模块的工作量;2、容易对错误进行定位。
缺点:1、直到最后一个模块加进去之后才能看到整个系统的框架;2、只有到测试过程的后期才能发现时序问题和资源竞争问题;3、驱动模块的设计工作量大;4、不能被及时发现高层模块设计上的错误。
自底向上的组装测试方案是工程实践中最常用的测试方法,相关技术也较为成熟。它的优点很明显;管理方便、测试人员能较好地锁定软件故障所在位置。但它对于某些开发模式不适用,如使用XP开发方法,它会要求测试人员在全部软件单元实现之前完成核心软件部件的组装测试。尽管如此,自底向上的组装测试方法仍不失为一个可供参考的组装测试方案。
自顶向下集成的优点在于能尽早地对程序的主要控制和决策机制进行检验,因此较早地发现错误。缺点是在测试较高层模块时,低层处理采用桩模块替代,不能反映真实情况,重要数据不能及时回送到上层模块,因此测试并不充分。
自底向上集成方法不用桩模块,测试用例的设计亦相对简单,但缺点是程序最后一个模块加入时才具有整体形象。它与自顶向综合测试方法优缺点正好相反。
12.2、简述软件测试中桩模块和驱动模块的作用。
答:桩模块(Stub)是指模拟被测试的模块所调用的模块,而不是软件产品的组成的部分。主模块作为驱动模块,与之直接相连的模块用桩模块代替。
桩模块的作用:在集成测试前要为被测模块编制一些模拟其下级模块功能的“替身”模块,以代替被测模块的接口,接受或传递被测模块的数据,这些专供测试用的“假”模块称为被测模块的桩模块。
传统的单元测试术语(unit testing terminology),包括了驱动模块(driver)和桩模块(stub)。驱动模块是用来模拟被测试模块的上一级模块,相当于被测模块的主程序。它接收数据,将相关数据传送给被测模块,启用被测模块,并打印出相应的结果。
作用:驱动模块的目的很单纯,就是为了访问类库的属性和方法,来检测类库的功能是否正确。