单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,软件系统的开发过程中,软件测试占据着重要地位尽管人们实行了多种保证软件质量的措施,由于软件系统的客观困难性,人们的主观相识不行能完全符合客观实际,完备无缺,每个阶段的技术审查也不行能毫无遗漏地查出和订正全部的设计和分析上的错误,在软件生命周期的各个阶段,都不行避开地会产生差错,这些差错迟早会在软件的生产和运用过程中暴露出来软件工程实践的阅历表明,发觉软件的时刻越晚,改正这些错误所花费的代价也越高,假如在软件投入运用之前没有发觉和订正软件的大部分错误,人们付出的代价会更高,往往会造成恶劣的后果从广义上来说,软件测试工作散布在软件生命周期的各个开发阶段,人们相识到,软件测试是保证软件质量的主要手段,各阶段的评审工作和验证工作,均是广义概念上的测试工作而主要的测试是在编码和测试这两个阶段进行的因此,狭义的软件测试就是程序测试6.1,软件测试基本概念,G.J.Myers给出了关于测试的一些规则,被软件工程领域认可:,(1)测试是为了发觉程序中的错误而执行程序的过程;,(2)好的测试方案极有可能发觉迄今为止尚未发觉的错误;,(3)成功的测试是发觉了至今为止尚未发觉的错误。
6.1,软件测试基本概念,这些规则,事实上是软件测试的狭义概念程序测试狭义的软件测试:测试是为了发觉错误而执行程序的过程是依据软件开发的各个阶段的说明和程序的内部结构而细心设计的一批测试用例(有输入数据及预期的结果),并利用这些测试用例执行程序及发觉错误的过程6.1,软件测试基本概念,广义的软件测试是对软件支配、软件系统分析、软件设计、软件编码进行的查错活动,包括代码执行和人工审查活动,测试的目的是找出软件生命周期的各个阶段的错误,有利于以后进行修改和订正但测试本身不修正错误,调试才会修正错误即找错的活动是测试;分析错误的性质与位置,进行纠错的活动是调试,保证算法的正的确现软件测试与程序测试都是查找错误的活动,差别在于查找错误的范围不同6.1,软件测试基本概念,由于测试的目标是暴露程序的错误,从心理学角度看,由设计者自己进行测试是不恰当的,设计小组和测试小组应当分别设立,有利于进行客观和公正的软件测试测试是有限的,由于通常的测试过程不行能穷尽一切状况,即使经过了严格的测试之后,仍旧可能存在没有被发觉的错误隐藏在程序中,不能证明程序中没有错误6.1,软件测试基本概念,因此,测试仅仅有可能找出程序的错误,测试不能证明程序是正确的。
软件工程中全部其它阶段都是“建设性”的,软件工程师力图从抽象概念动身,逐步设计出具体的软件系统,而测试人员的工作表面上看却是“破坏性”的,竭力证明软件中含有错误,不能按预定要求正确工作凡是进行对比的方式均可理解为测试验证6.1.2,软件测试的对象,软件测试应当贯穿于软件生命期的各个阶段,各阶段的工作是相互连接、相互影响的,前一阶段发生的问题自然要影响到下一阶段的工作为了把握各个环节的正确性,人们须要进行各种确认和验证工作软件确认是广义上的软件测试,它是企图证明软件在一个给定的外部环境中软件的逻辑正确性的一系列活动和过程,如需求说明书的确认、程序的确认等6.1.2,软件测试的对象,程序的确认又分为静态确认与动态确认静态确认一般不在计算机上执行程序,而是通过程序正确性证明、静态分析或人工分析来确认程序的正确性;,动态确认主要通过动态分析和动态测试,用执行程序的过程来检查执行的状态,确认程序是否有问题;,6.1.2,软件测试的对象,正确性证明主要是企图绕过困难的测试,干脆证明程序的正确性如程序的输入输出断言法设程序段为S,其前断言为P,后断言为R假如执行S以前P为真,则执行S后R也为真,则证明S是正确的,记为PSR。
6.1.2,软件测试的对象,任何程序总可以分成S1、S2、Sn个结点,对应的断言为R1、R2、Rn,起初R1为输入断言,R2为输出断言,也是下一个输入断言,Rn为最终的输出断言,我们总可以,将S1、S2、Sn逐个证明,自顶向下或自底向上都可证明程序的正确性,该分支已发展为计算机代数学;,6.1.2,软件测试的对象,软件验证也属于广义上的软件测试,它试图证明在软件生命期的各个阶段、各阶段的逻辑协调性、完备性和正确性包括系统分析员理解用户要求的正确性、表达的正确性、设计人员对需求规格说明理解的正确性、设计与设计表达的正确性、程序编码的正确性和运行软件程序时输入的正确性、运行结果的正确性等,运行结果与用户预期的结果是否一样等,这说明任何一个环节上发生了问题都可能在软件测试中表现出来6.1.3,测试信息流,将测试的过程用数据流图表示,可得测试信息流如图6-1所示至软件配置),软件配置 1 测试结果 2 错误 3 修正的软件,测试配置 测试结果,测试工具 测试 评价 调试 正确,预测结果 出错率 4,数据 可靠性,分析,图,6-1,测试信息流,6.1.3,测试信息流,1.测试过程须要三类输入:,(1)软件配置:包括软件开发文档(用户文档、需求规格说明、软件设计说明、源程序代码)、目标执行程序、数据结构;,(2)测试配置:包括测试支配、测试用例、测试驱动程序等;事实上在整个软件开发过程中,测试配置只是软件配置的一个子集;,(3)测试工具:为提高软件测试效率,运用测试工具为测试工作服务;如:测试数据自动生成程序,静态分析程序、动态分析程序、测试结果分析程序及标准例程测试数据库等。
6.1.3,测试信息流,测试之后,对全部测试结果进行分析,将实际测试的结果与预期的结果进行比较假如发觉出错的数据,则意味着软件有错误,须要纠错,应进行调试,确定错误的位置和出错的性质,改正这些错误,同时修正相关文档修正过的文档一般需经过再次测试,直到通过测试为止6.1.3,测试信息流,通过收集和分析测试结果的有关数据,可以建立软件评估的牢靠性模型假如常常出现须要修改设计的严峻错误,那么软件的质量和牢靠性就值得怀疑,同时也表明须要进一步测试相反,假如软件功能能够正确完成,出现的错误易于修改,那么就可能有两种评价:,6.1.3,测试信息流,一种是软件的质量和牢靠性达到可以接受的程度另一种是所做的测试还不足以发觉软件的严峻错误假如得到的评价是没有发觉错误,很有可能测试的配置考虑得不够充分和细致,软件仍有潜藏的错误,以后改正错误须要付出昂扬的代价6.1.3,测试信息流,2.软件错误可以从不同角度进行分类:,(1)从错误对程序的影响程度来分:,严峻性错误:严峻影响程序的运行,甚至不能运行;,一般性错误:常常影响程序的运行,特殊状况下表现正常;,6.1.3,测试信息流,微小错误:一般状况下程序能运行,特殊状况下表现异样;,无影响性错误:不影响程序的运行。
6.1.3,测试信息流,(2)从开发过程的转换环节上分:,构造错误:编码实现与设计不一样;,设计错误:设计逻辑与说明不一样;,说明书错误:说明书与用户要求不一样;,需求错误:不满足用户的实际要求;,配置错误:软件配置不满足实际环境6.1.3,测试信息流,(3)从测试结果的表现上分类:,1)功能错误:由系统需求分析不完整引起的;,2)结构错误:由总体设计的错误引起的;,3)过程错误:由具体设计的错误引起的;,4)数据错误:由软件编码或具体设计的错误引起的;,5)编码错误:由软件编码引起的错误;,6)其它错误:由文档和其它系统元素引起的错误;,6.1.3,测试信息流,6.1.4,软件测试步骤与软件开发各阶段的关系,软件测试一般分为四个步骤:,(1)单元测试(也称模块测试):针对软件设计的基本单元程序模块,进行正确性检验的测试工作目的在于发觉各个模块内部可能存在的各种差错单元测试须要从程序内部结构动身设计测试用例,多个模块可以平行、独立地进行测试;,6.1.4,软件测试步骤与软件开发各阶段的关系,(2)集成测试(也称组装测试,联合测试):在单元测试的基础上,将全部模块按设计要求集成在一起进行测试,以检验总体设计中各模块间的接口设计问题、模块之间的相互影响、上层模块存在的各种差错及全局数据结构对系统的影响等方面。
6.1.4,软件测试步骤与软件开发各阶段的关系,(3)确认测试(也称验收测试,有效性测试):主要检验软件的功能和性能是否与需求说明书中的规定一样4)系统测试:将软件系统作为一个元素,放入整个实际的计算机系统中,与计算机硬件、其他软件、运用人员等系统元素结合在一起,在实际运用环境下进行综合全面的测试6.1.4,软件测试步骤与软件开发各阶段的关系,前面多次强调,运用软件生命期(瀑布模型)模型,软件开发过程是一个自顶向下,逐步细化的过程,而软件测试过程则是与开发过程相反的次序进行的,是一个自底向上,逐步集成的过程,低一层测试为上一层测试准备测试条件和数据驱动环境,也包含两者平行进行测试6.1.4,软件测试步骤与软件开发各阶段的关系,因此,发觉引起错误的缘由依次也与开发过程的相次序反,首先对每一个模块进行单元测试,消退程序模块内部逻辑上和功能上的错误和缺陷,再比照软件设计进行集成测试(有时也叫整体测试),检测和解除子系统或系统结构上的错误,再比照需求进行确认测试(也称为有效性测试),最终进行系统测试,运行系统,看软件系统是否满足功能和性能及其它要求6.1.4,软件测试步骤与软件开发各阶段的关系,需求分析,软件设计,软件编码,确认测试,集成测试,单元测试,系统,测试,图6-2 软件测试与软件开发过程间的关系,6.1.4,软件测试步骤与软件开发各阶段的关系,需求分析,说明书,概要设计,说明书,详细设计,说明书,源程序,代码,确认测试,集成测试,单元测试,系统测试,图6-3 软件测试与开发文档之间的关系,6.1.5,软件测试原则,(1)将软件测试贯穿于软件开发的各个阶段中,在开发过程中尽早地发觉和预防错误,杜绝隐患,提高软件质量;,(2)测试用例必需包含输入数据和与之对应的预期输出结果,细心设计测试用例;,(3)测试时应避开设计者检查自己设计的程序;,(4)设计测试用例时,应包括合理的与不合理的输入条件;,6.1.5,软件测试原则,(5)充分留意测试中出现的错误群集现象,若发觉错误数目较多,则可能残存的错误数目也较多,这种错误出现的群集现象,已为很多程序测试实践所证明;,(6)严格执行测试支配,以软件需求说明书为基准设计测试用例,解除测试的随意性;,6.1.5,软件测试原则,(7)对每一个测试结果做全面检查,不能遗漏错误出现的征兆,软件修改后要进行回来测试,即用修改前测试过的测试用例进行测试,再用新的测试用例测试;,(8)妥当保存测试支配、测试用例、出错统计数据和最终分析报告,为维护供应便利。
在一个程序段中,还存在着尚未发觉的错误概率与已发觉的错误数正相关6.1.5,软件测试原则,残存错误的可能性,已发现的错误数,图6-4 软件错误的群集现象示意图,6.2,软件测试的方法,软件的测试方法很多,不同的动身点得到不同的测试方法有:,从测试过程来分:静态分析法、动态测试法;,从视察结构的透亮性方式来分:白盒法、黑盒法、灰盒法;,从获得测试数据形式上分:穷尽法;等价类划分法;边界值分析法;,6.2,软件测试的方法,从逻辑分析上分:因果图法;错误推想法;,从测试步骤上分:单元测试、集成测试、确认测试、系统测试等;,从考察形式上分:功能测试,逻辑测试;,6.2,软件测试的方法,如何测试得更完全、怎样进行测试用例的设计,是软件测试中的关键技术无论用哪种方法进行测试,都是设法用较少的测试用例集合测试出程序中较多的潜在错误静态分析时,不执行程序,可对需求分析说明书、软件设计说明书、源程序做结构检查、流图分析、符号执行来分析软件可能导致的异样状况,找出软件错误从测试过程来分:静态分析法、动态测试法;,6.2,软件测试的方法,结构检查是手工分析技术,对需求说明、程序设计、编码、测试工作进行评议,虚拟地(模拟。