1、单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,软 件 工 程,第,12,章 软件测试,第一讲,基础知识,引言,基本概念,测试原则,测试方法,2/9/2026,1,复 习,:,软 件 开 发 过 程,一一对应,计 划,&,实 施,单元测试,组装测试,验收测试,详细设计,概要设计,需求分析,2/9/2026,2,软 件 问 题 案 例,中,外,系统时钟,误差累积,联通,2001,年某市话费核算系统,平均,100,元话费误差,0.20,元,美国航天局,火星登陆事故,系统测试,衔接问题,2/9/2026,3,软件测试人才的现状,三个招聘案,慧谷,-,博为峰
2、软件测试工作室曾经接受企业委托,招聘二十名软件测试工程师,结果收到的简历不到十份,合格的只有三份,最后录用的只有一人;而招聘一名程序员就会收到六十多份简历。,上海一位软件企业的副总裁说,他们曾招聘,8,名基于,Unix,操作系统的测试工程师,但是半年多招不到合适的人。,微软亚洲工程院院长张宏江博士曾经告诉媒体:“过去两三个月,我最主要的精力都花在雇人上。遗憾的是,,1,万多名应聘者中,居然找不到足够合适的人。”微软最紧缺的人才包括软件测试人员、软件项目管理员、软件架构师,,1,万多名应聘者中最后合格的只有,50,多人。,2/9/2026,4,软件测试人才的现状(续),软件测试人才紧缺,软件测试
3、人才需求快速增长,体现在:,(,1,)中国软件产业正在快速增长,需要大量软件相关人才;,(,2,)软件企业的发展要求测试人才达到一个合适的比例。,近一两年软件企业开始认识到软件测试对于提高软件质量的重要性,开始重视软件测试,但由于历史的原因,找不到合适的软件测试人员。,2/9/2026,5,软件测试人员的合理比例,在软件产业发达的国家:,软件测试在人员配备和资金投入方面占据相当的比重。,微软为打造,Windows2000,,,1700,多个开发人员,以及,3200,个测试人员,开发和测试人员之比约为三比五。,HP,公司的测试人员和开发人员的比例为一比一,这是很 多先进软件企业通常的人员配比。,
4、在国内:,企业往往忽视软件测试,很多企业都没有软件测试部门,甚至不设置软件测试的岗位,造成产品质量得不到保证。,测试人员大都不到开发人员的,5%,,随着产业和企业的发展,企业必然需要大量的测试人员。,2/9/2026,6,软件测试职业素质,软件测试员的目标:,发现潜在的软件缺陷,软件测试员应具备的素质:,具有探索精神,具有创造性,坚持不懈精神,故障排除专家,判断准确,追求完美,沟通能力,2/9/2026,7,软 件 测 试 基 本 概 念,定义,执行程序、排除的错误的过程;是对软件规格说明、设计和编码的最全面最后的审查,作用,发现软件中的错误提高正确性、可靠性、质量,工作量,工作量占的,40%
5、以上,甚至,35,倍以上,目标,执行,以发现错误,好用例,发现尚未发现的错误,好测试,发现错的测试用例,2/9/2026,8,微软核心项目组的人员构成,Exchange Server2000,Windows2000,程序经理,约,25,人,约,250,人,开发工程师,约,140,人,约,1700,人,测试工程师,约,350,人,约,3200,人,测试,开发,人员比例,2.5:1,1.9:1,2/9/2026,9,软件测试阶段的信息流,测试,评价,纠错,可靠性,评价,软件配置,测试配置,测试结果,错误,错误统计,预期结果,正确的程序,预期的,可靠性,2/9/2026,10,软件测试过程,部件,
6、代码,部件,代码,部件,代码,单元测试,单元测试,单元测试,其他,软件需求,设计,规格说明,系统,功能需求,用户需求,规格说明,集成测试,集成后,的模块,功能测试,功能,系统,性能测试,验证,,生效的,软件,验收测试,被接受,的系统,安装测试,用户,环境,在使用中的系统,测试后,的模块,2/9/2026,11,软件测试的原则,尽早 不断地进行软件“测试”,输入数据,合理不合理都要选,按阶段制定测试计划,严格执行,错多重测。,避免自测,勿用穷举,长期保存文档,2/9/2026,12,软 件 测 试 方 法,静态测试,采用人工检测和,计算机辅助,静态分析的方法,对程序进行检测,2,种方法,动态测试
7、事先设计好一组,测试用例,然后通过运行程序来发现错误,2/9/2026,13,举 例,(,穷 举 法,),一个简单程序:输入,x,、,y,输出,r,,假定此程序在,32,位计算机上运行,且,x,,,y,均为整数,则输入数据可能的组合数目有几种,?,2,32,*,2,32,=2,64,(,种,),2/9/2026,14,合理的输入:,x=4,y=2,黑 盒 测 试,输入,输出,预期结果:,r=4,x=-4,y=4,x,值有误,x=0,y=0,y,值有误,r=x +4/y,输入整数,x,、,y,,求,r,值,不合理的输入:,x=3.5,y=2.6,值不正确,?,x=a,y=&,又称功能测试,不考
8、虑内部结构和处理过程,测试仅在接口上进行。主要应用于快速应用开发环境(,RAD,)。,RAD,:,Rapid Application Development,2/9/2026,15,白 盒 测 试,完全了解程序的内部结构和详细的处理过程,测试在程序内部结构上进行。主要应用于结构化开发环境。,2/9/2026,16,9.,输出,r,值,3.x,值错,10.,结束,6.y,值错,1.,输入,x,,,y,2.x1)AND(y=0),(x=2)OR(z1),语句段,1,语句段,2,开始,结束,T,T,F,F,a,b,c,d,e,2/9/2026,21,4,个条件,共有,8,种组合:,x,1,,,y=0
9、x,1,,,y0,;,x1,,,y=0,;,x1,,,y0,;,x=2,,,z,1,;,x=2,,,z1,;,x2,,,z,1,;,x2,,,z1,。,(x1)AND(y=0),(x=2)OR(z1),语句段,1,语句段,2,开始,结束,T,T,F,F,a,b,c,d,e,x=2,,,y=0,,,z=3,;,覆盖条件组合,和,,,通过路径,abcde,;,x=2,,,y=1,,,z=1,;,覆盖条件组合,和,,,通过路径,acde,;,x=0,,,y=0,,,z=3,;,覆盖条件组合,和,,,通过路径,acde,;,x=1,,,y=1,,,z=1,;,覆盖条件组合,和,,,通过路径,ac
10、e,。,但未通过路径,abce,。,条件组合覆盖,2/9/2026,22,路径覆盖,共有,4,条路径,设计,4,组测试用例,就可以覆盖这,4,条路径:,x=2,,,y=0,,,z=3,;,覆盖路径,abcde,x=2,,,y=1,,,z=1,;,覆盖路径,acde,x=1,,,y=1,,,z=1,;,覆盖路径,ace,x=3,,,y=0,,,z=1,;,覆盖路径,abce,(x1)AND(y=0),(x=2)OR(z1),语句段,1,语句段,2,开始,结束,T,T,F,F,a,b,c,d,e,没有覆盖条件组合,和,x1,,,y=0,x2,,,z,1,2/9/2026,23,开始,i=1,n1=
11、n2=0,sum=0,Score i-1 AND n20 AND scorei0,average=sum/n1,average=1,返回,F,F,F,T,T,T,1,2,和,3,4,5,和,6,7,8,9,10,11,12,举例,2/9/2026,24,白盒测试,基本路径,控制流程,已知,流图,1,环形复杂性,2,基本路径集合,3,测试用例,4,1,2,3,4,5,6,8,9,11,10,12,R,1,R,2,R,4,R,6,7,步骤,2,:,据流图确定环形复杂性度量,V,(,G,):,1,),V,(,G,),=E N+2=16 12+2=6,;,其中,E,为流图中的边数,,N,为结点数;,2
12、V,(,G,),=6,(,个区域);,3,),V,(,G,),=P+1=5+1=6,;,其中,P,为谓词结点的个数。,在流图中,结点,2,、,3,、,5,、,6,、,9,是谓词结点。,步骤,3,:,确定基本路径集合(即独立路径集合)。,路径,1,:,12291012,路径,2,:,1291112,路径,3,:,12391012,路径,4,:,1234582,路径,5,:,12345682,路径,6,:,123456782,步骤,4,:,为每一条独立路径各设计一组测试用例,以便强迫程序沿着该路径至少执行一次。,2/9/2026,25,1,)路径,1,的测试用例:,scorek,=,有效分数
13、值,当,k i,;,score i=1,,,2i50,;,期望结果:根据输入的有效分数算出正确的分数个数,n1,、总分,sum,和平均分,average,。,2,)路径,2,的测试用例:,score 1=1,;,期望的结果:,average=1,,其他量保持初值。,3,)路径,3,的测试用例:,输入多于,50,个有效分数,即试图处理,51,个分数,要求前,51,个为有效分数;,期望结果:,n1=50,、且算出正确的总分和平均分。,4,)路径,4,的测试用例:,score i=,有效分数,当,i50,;,score k 0,,,k i,;,期望结果:根据输入的有效分数算出正确的分数个数,n1,、
14、总分,sum,和平均分,average,。,2/9/2026,26,5,)路径,5,的测试用例:,score i=,有效分数,当,i100,,,k i,;,期望结果:根据输入的有效分数算出正确的分数个数,n1,、总分,sum,和平均分,average,。,6,)路径,6,的测试用例:,score i=,有效分数,当,i50,;,期望结果:根据输入的有效分数算出正确的分数个数,n1,、总分,sum,和平均分,average,。,2/9/2026,27,白盒测试,循环测试,1,)对于最多为,n,次的单循环,可设计测试用例实现下列测试:,跳过循环,即一次也不执行;,仅循环,1,次;,循环,2,次;,
15、循环,m,次,,mn,;,分别循环,n 1,次,,n,次,,n+1,次。,2,)对于嵌套循环的测试:,从最内层循环开始测试,此时外层循环都取最小值,对内层进行单循环的测试;,向外退一层进行测试,此时其内层循环取一些典型值,其外层循环仍取最小值;,继续向外层扩展,直至测试完成。,2/9/2026,28,黑盒测试,目的,:,主要是测试软件是否满足功能需求。,测试的错误类型有:,不正确或遗漏的功能;,接口错误;,性能错误;,数据结构或外部数据访问错误;,初始化或终止条件错误等等。,黑盒测试设计测试用例的方法:,等价类的划分、边界值分析、,错误推测、组合数据测试等。,2/9/2026,29,黑盒测试,
16、等价类划分,【,例,14.1】,设有一个档案管理系统,要求用户输入以年月表示的日期。假设日期限定在,1990,年,1,月,2003,年,12,月,并规定日期由,6,位数字字符组成,前,4,位表示年,后,2,位表示月。现用等价类划分法设计测试用例,来测试程序的“日期检查功能”。,1,)划分等价类并编号,表,14-1,等价类划分的结果,输入等价类,有效等价类,无效等价类,日期的类型,及长度,6,位数字字符,有非数字字符,少于,6,位数字字符,多于,6,位数字字符,年份范围,在,19902003,之间,小于,1990,大于,2003,月份范围,在,0112,之间,等于,00,大于,12,2/9/20
17、26,30,黑盒测试,等价类划分,2,)设计测试用例,以便覆盖所有的有效等 价类,(每个用例尽可能多地覆盖尚未被覆盖过的有效等价类),在表,14-1,中列出了,3,个有效等价类,,编号分别为,、,、,,,设计的测试用例如下:,测试数据 期望结果 覆盖的有效等价类,200211,输入有效,、,、,2/9/2026,31,黑盒测试,等价类划分,3,)为每一个无效等价类设计一个测试用例,设计结果如下:,测试数据 期望结果 覆盖的无效等价类,95June,无效输入,20036,无效输入,2001006,无效输入,198912,无效输入,200401,无效输入,200100,无效输入,200113,无效
18、输入,2/9/2026,32,等价类划分的几条经验性原则,如果规定了,输入值的范围,,则可划分出一个有效的和两个无效的等价类。,如果规定了数据,输入的个数,,则可划分出一个有效的和两个无效的等价类。,如果规定了输入数据的,一组值,,而且程序对不同的输入值进行不同的处理,则每个允许的输入值是一个有效的等价类,有一个无效的等价类(这组值以外的值)。,如果规定了输入数据必须,遵循的规则,,则有一个有效的等价类和若干个无效的等价类(从不同的角度违反规则)。,如果输入条件规定了,一个集合,,则可划分出一个有效的等价类和一个无效的等价类。,2/9/2026,33,黑盒测试,边界值分析,边界值分析(,bou
19、ndary value analysis,,,BVA,),是指设计测试用例,使程序在输入或输出的边界值或者边界值左右的值执行。,边界值分析方法可以单独设计测试用例,也可以作为等价类划分方法的补充,即在各个等价类中主要是选择边界上及其左右的值。例如例,14.1,中对月份范围的测试就可以选择,00,、,01,、,02,、,11,、,12,、,13,等数据作为测试用例。,2/9/2026,34,边界值分析方法设计测试用例的经验性原则,1,)如果输入条件指定了范围,a,,,b,,则,a,、,b,以及紧挨,a,、,b,左右的各一个值都应作为测试用例。比如,学生成绩为,0,,,100,,应取,-1,、,0
20、1,、,99,、,100,、,101,共,6,个值作为测试用例。,2,)如果输入条件指定了输入数据的个数范围,则按最大、最小个数及其左右的个数各设计一个测试用例。比如,一个输入文件应包括,1255,个记录,则应分别设计输入,0,个、,1,个、,2,个、,254,个、,255,个、,256,个记录的测试用例。,3,)将规则,1,)和,2,)应用于输出条件,即设计测试用例使输出值达到边界值及其左右的值。,2/9/2026,35,黑盒测试,错误推测,基本思想是:程序测试员通过已经掌握的测试理论和实际测试中积累的经验,推测程序在哪些情况下可能发生错误,并将可能发生错误的情况列出,然后为每一可能发
21、生错误的情况各设计一个测试用例。,例如,测试一个对线性表(比如数组)进行排序的程序,可推测列出以下几项需要特别测试的情况:,1,)输入的线性表为空表;,2,)表中只含有一个元素;,3,)输入表中所有元素已排好序;,4,)输入表已按逆序排好;,5,)输入表中部分或全部元素相同。,可以针对以上列出的每一种情况各设计一个测试用例。,2/9/2026,36,黑盒测试,组合数据测试,实践表明,在单个测试用例没有测试出错误的情况下,采用测试数据的某种组合却可能检测出程序中隐藏很深的错误。,组合数据测试法可以采用的有效工具有判定表、判定树等。,以判定表为例,即列出输入数据的各种组合情况和程序相应的动作、可能
22、的输出结果之间的对应关系,然后为判定表的每一列至少设计一个测试用例。,2/9/2026,37,测试执行的步骤:单元测试,单元测试的内容,1,)接口,2,)局部数据结构,3,)重要的执行路径,4,)错误处理,5,)边界测试,模块(部件),详细设计,2/9/2026,38,测试执行的步骤:集成测试,集成测试的内容:,通过接口的数据,模块间的功能影响,子功能组合起来有没有实现主功能;,全局数据结构,误差积累,接口,概要设计,2/9/2026,39,测试执行的步骤:集成测试,自顶向下,自底向上,深度优先或广度优先,2/9/2026,40,测试执行的步骤:验收测试,集成测试的内容:,又称为,确认测试,。
23、确认测试是一种验收形式的测试,主要是检查软件是否满足软件需求规格说明书中的确认标准,即测试软件能否按照合同的要求运行。,功能,需求分析,2/9/2026,41,测试执行的步骤:系统测试,几类系统测试简介,恢复测试,安全测试,强度测试,压力测试,性能测试,其他,2/9/2026,42,12.4,调试,调试的概念,调试是在进行了一次成功的测试之后立即开始的。,1,调试的目的是确定错误的位置和引起错误的原因,并加以改正。因此,又称为排错或纠错。,2,错误定位是软件工程中最困难的工作,确定发生错误的位置和内在原因所需的工作量几乎占整个调试工作量的,90%,。,3,2/9/2026,43,隐藏在程序中的
24、错误的特殊的性质包括:,错误的表现远离引起错误的位置和内在原因,尤其对高度耦合的程序结构更是如此;,某些错误现象可能是假象;,纠正一个错误可能引起多个错误,也可能掩盖其他错误;,由于操作员的疏忽致使错误现象无法重现,很难追踪;,错误可能不是直接由程序引起的;,某些输入条件难于精确地再构造(如某些实时系统的输入次序不确定);,错误现象时有时无。,12.4,调试,调试的概念,2/9/2026,44,12.4.2,调试策略,分为三类:原始类;归纳法,排除类;,回溯类。演绎法,1,原始类(,brute force,),其主要思想是“通过程序运行现场找错”。例如输出存储器、寄存器的内容,在程序中插入打印
25、语句等等。这种方法的效率低,还需要修改程序,更依赖测试人员的能力和经验。,2/9/2026,45,12.4.2,调试策略,2.,归纳法调试,1,收集数据,收集程序做对了什么和做错了什么的有关全部数据,2,整理、分析数据,对收集的数据进行分析、比较和整理,注意观察数据间的关系,从错误的症状中发现线索,3,提出假设,对这些线索进行研究和推测,提出有关错误产生的原因和部位的一个或多个假设。如果有多个假设,首先选择可能性最大的一个。,4,证明假设,由数据验证或反正假设,如果假设得到证实,据此阅读程序找出出错原因和位置并进行改正;如果无法验证,则可能假设错误或有多重错误,需要提出新的假设,进行新的验证。
26、2/9/2026,46,12.4.2,调试策略,3,演绎法调试,演绎法是枚举所有可能引起出错的原因作为假设,然后从中排除不可能发生的原因和假设,对余下的假设进行不断地验证和改进,最后从中推演出出错的原因和部位。,4,回溯法调试,对小型程序进行调试,回溯法是一种有效的方法。该方法是从发现错误现象的地方出发,人工沿程序的控制流程向回追踪,直至找到产生错误的原因为止。但是,当程序的规模较大时,由于需回溯的路线显著增加,因此无法做到完全回溯,只好采用其他的调试方法。,2/9/2026,47,12.5,软件可靠性度量,1,软件可靠性,由于大型软件投入使用后还是要残留一定数量的错误。于是,当某些操作或输
27、入数据导致遇到这些错误时,就会使程序失效,从而出现软件故障。,软件可靠性定义为在某个给定时间间隔内,程序按照规格说明成功运行的概率。,12.5.1,软件可靠性的有关概念,2/9/2026,48,1,软件可靠性,令:随机变量,t,表示发生故障的时刻,,t0,,,;,函数,f,(,t,),为随机变量,t,的概率密度函数,,F,(,t,),表示分布函数;,P,(,0 t t,1,),表示从初始时刻到,t,1,时刻程序,发生故障的概率。,设:初始时刻程序运行正常,即,F,(,0,),=0,。,于是有:,F,(,t,),=,f,(,x,),dx,(,12-1,),f,(,t,),=,d F,(,t,),
28、12-2,),d t,0,t,2/9/2026,49,令:,P,f,(,t,1,),表示从,0,到,t,1,时刻程序发生故障的概率,有:,P,f,(,t,1,),=P,(,0 t t,1,),=F,(,t,1,),F,(,0,),=F,(,t,1,),如果在,0,,,t,区间程序成功运行的概率为,P,s,(,t,)、,发生故障的概率为,P,f,(,t,),,则有:,P,s,(,t,),+P,f,(,t,),=1,P,s,(,t,),就是可靠性,一般标记为,R,(,t,)。,由以上几个式子可导出:,R,(,t,),=1P,f,(,t,),=1 F,(,t,),=1 f,(,x,),dx,(,
29、12-3,),上式说明,当软件残留的错误数一定时,程序运行的时间越长,发生故障的次数越多,软件的可靠性越小。,0,t,1,软件可靠性,2/9/2026,50,d R(t),R(t),下面引入故障率函数,Z,(,t,),,以比较一个程序在不同时期、或不同程序在同一时期的可靠性。设系统一直成功运行至时刻,t,,,tt,1,,,t,1,+t,,,P,(,t,1,tt,1,+t,,,t,t,1,),是系统在,t,1,,,t,1,+t,时间间隔且,t,t,1,时发生故障的概率。故障率函数,Z,(,t,1,),的值定义为:,Z,(,t,1,),=,lim,P,(,t,1,tt,1,+t,,,t,t,1,)
30、/t,(,12-4,),可以证明:,Z,(,t,),=,(,12-5,),对式(,12-3,)的两端对时间,t,求导得:,dF,(,t,),/,dt,=,dR,(,t,),/d t,,,代入上式,得:,=Z,(,t,),d t,(,12-6,),1,R(t),d F(t),d(t),1,软件可靠性,2/9/2026,51,对上式两端积分,利用初始条件,R,(,0,),=1,,,可得:,R,(,t,),=exp ,Z,(,x,),dx,(,12-7,),上式即为可靠性和故障率的基本方程式。据此可以导出几个 常用的故障模型:,1,),Z,(,t,),=,,,其中,是常数。,将,代入式(,12-7
31、可得:,R,(,t,),=e,t,(,12-8,),上式称为故障率为常数的可靠性模型。由于故障率是常数,可靠性将随着时间,t,的增加呈指数衰减。,t,0,1,软件可靠性,2/9/2026,52,2,),Z,(,t,),=,kt,,,这里,k,为常数,,t 0,。,将,kt,代入式(,12-7,),可得:,R,(,t,),=e,k t,2,/2,(,12-9,),上式称为故障率是时间的线性函数时的可靠性模型。即当存在损耗和退化时,故障率将随着时间的增加而线性增加。该模型一般不适合于软件产品。,需要指出,软件中的错误一般都是人为的设计错误,其中多数是逻辑错误。随着对软件的测试及修复,软件系统
32、中的错误会越来越少。因此,实际软件系统的故障率函数曲线应如图,2-5-1,所示,即软件故障率不是常数、也不是线性函数,而是按指数规律下降。实际的统计结果也说明了这一点。,1,软件可靠性,2/9/2026,53,图,12-12,软件系统故障率,Z(t),O,t,2,软件的有效性及其度量,2/9/2026,54,2,软件的有效性及其度量,软件的有效性函数,A,(,t,),定义为软件系统在时刻,t,按照规格说明成功运行的概率。,可靠性与有效性之间的差别是,可靠性强调软件系统在,0,t,这段时间间隔内都有效,而有效性强调软件系统在时刻,t,这一时间点有效。,A,(,200,),=0.93,表示假设有,
33、100,个相同的系统同时启动运行,运行到,200,小时这一时刻,其中有,93,个处于正常运行状态,,7,个出现故障,等待修复。,R,(,200,),=0.93,表示假设有,100,个相同的系统有,93,个无故障运行了,200,小时,有,7,个在此期间发生故障。,2/9/2026,55,2,软件的有效性及其度量,一般来说,对,R,(,200,),=0.93,的要求比对,A,(,200,),=0.93,的要求要严格得多。,对于不可修复系统(即不允许程序停止运行的系统)或没有修复能力的情况:,A,(,t,),=R,(,t,),对于可修复系统并能及时修复的情况:,A,(,t,),R,(,t,)。,2/
34、9/2026,56,软件稳态有效性的两种度量方法,1,)软件系统投入运行后,在一段时间内,可,统计软件系统的故障停机时间,t,di,和正常运,行时间,t,uj,,,则软件系统的稳态有效性为:,A,(,t,),=,T,u,/,(,T,u,+T,d,),(,12-10,),其中:,t=,T,u,+T,d,,,T,d,=,t,di,,,T,u,=,t,uj,2/9/2026,57,软件稳态有效性的两种度量方法,2,),软件系统在稳态运行时,可统计其平均故障间隔时间,MTBF,(,mean time between,failurs,,,即程序正常运行时间的平均值)和平均修复时间,MTTR,(,mean
35、 time to repair,,,即平均停机时间),则软件系统的稳态有效性为:,A=MTBF/,(,MTBF+MTTR,),(,12-11,),采用上述方法,在开发阶段和投入运行后都可以定量地度量软件系统的有效性和可靠性。,软件系统投入运行的一段时间内,可以用各种输入和操作来引发程序中残留的错误,经过多次修复后错误将逐渐减少,有效性和可靠性将不断提高。,2/9/2026,58,2.5.2,软件可靠性的估算,软件可靠性估算模型大致分为宏观和微观模型两类。,宏观模型是从程序中残留错误数的角度建立模型,并用统计方法确定模型参数。,而微观模型则以程序的控制结构和语句分析为基础。,下面仅介绍几个典型的
36、宏观模型。,1,残留错误总数的估算模型,对残留错误总数的估算是可靠性估算的基础。,典型的估算模型:错误植入模型;,分别测试模型。,2/9/2026,59,1,)错误植入模型,Mills,首先提出了估算程序中残留错误总数的错误植入模型。即在进行测试之前,由专人(比如统计人员)在程序中随机地植入一些错误(称为带有标记的错误),测试人员测试之后,通过统计测试人员发现的原有错误和植入错误的比例来估算程序中原有错误总数。,设:,N,t,植入的错误数,,,n,测试发现原有的错误,数,,n,t,发现植入的错误数,,,E,T,原有的错误总数。,则有:,E,T,/N,t,n/n,t,于是,E,T,的估算模型为:
37、E,T,=N,t,n/n,t,(,12-12,),2/9/2026,60,2,)分别测试模型,1973,年,,Hyman,对错误植入模型做了改进,即用甲、乙两个程序测试员同时对一个程序的两个副本进行独立测试。,设:,E,T,程序中原有的残留错误总数,,E,1,甲在,0,,,时间内发现的错误数,,E,2,乙在,0,,,时间内发现的错误数,,E,0,两人在,0,,,时间内发现的相同的错误,的个数,,则有:,E,T,=E,1,E,2,/E,0,(,12-13,),Hyman,提出的分别测试模型无论在技术上还是在,经济上都比错误植入模型优越。,2/9/2026,61,2,软件平均故障间隔时间的估算,
38、软件的平均故障间隔时间,MTBF,是可靠性度量的一个重要参数,往往作为一个重要的质量指标由用户提出来。下面介绍,MTBF,的估算方法。,1,)软件故障率为常数,当软件故障率,为常数时,假设程序运行,H,小时,共发生,r,次故障,则,的估算值为:,r/H,于是有:,MTBF=1/=H/r,(,12-14,),2/9/2026,62,2,)软件故障率与程序残留错误数成正比,设:,I,T,程序代码长度;,E,T,测试之前程序中残留错误总数;,E,c,(,),0,,,区间内改正的错误数;,E,r,(,),在,时刻程序中剩余的错误数;,其中,为调试和排错时间。,于是,剩余的错误数为:,E,r,(,),=
39、E,T,E,c,(,),(,12-15,),2/9/2026,63,2,)软件故障率与程序残留错误数成正比,E,r,(,),=E,T,E,c,(,),(,12-16,),用,I,T,去除上式的两边,有:,E,r,(,),/I,T,=E,T,/I,T,E,c,(,),/I,T,令:,r,(,),=E,r,(,),/I,T,,,T,=E,T,/I,T,,,c,(,),=E,c,(,),/I,T,,,于是有:,r,(,),=,T,c,(,),(,12-17,),2/9/2026,64,2,)软件故障率与程序残留错误数成正比,由于软件故障率,=,(,),与程序残留错误数成正比,所以有:,=k,r,(,
40、k,(,T,c,(,),(,12-18,),其中的比例因子,k,可通过实验测试和统计的方法来估算。设进行,n,次软件排错实验,时间区间为,0,,,j,,到,j,时刻为止,共排除了,E,c,(,j,),个错误,而在时间区间,0,,,j,内,程序运行了,H,j,小时,出现了,r,j,个错误,,j=1,,,2,,,,,n,。,此时,k,的估计值为:,k,=,r,j,/,H,j,T,c,(,j,),(,12-19,),n,j=1,n,j=1,2/9/2026,65,2,)软件故障率与程序残留错误数成正比,k,=,r,j,/,H,j,T,c,(,j,),(,12-19,),当,n,=1,时,,k,
41、r,/,H,T,c,(,),(,12-20,),当,n=2,时,,k=,(,r,1,+r,2,),/H,1,T,c,(,1,),+,+H,2,T,c,(,2,),(,12-21,),k,的值估算出来之后,即可利用式(,12-21,)估算,MTBF,,,它是,的函数。,2/9/2026,66,2,)软件故障率与程序残留错误数成正比,对于确定的,值,,=k,r,(,),为常数,于是,经过,0,,,区间的排错后,软件可靠性估算为:,R,(,t,),=exp k,r,(,),t,=exp,(,t/MTBF,),(,12-22,),上式中时间参数,以月计,表示对程序调试和维护的时间,,t 0,,,,
42、以小时计,表示程序运行的时间。式,2-46,可理解为经过,个月的调试后所达到的软件可靠性。,2/9/2026,67,【,例,12-3】,对一个包含,10000LOC,的程序进行一个月的测试后,总共改正了,15,个错误,此时,MTBF=10h,,,又经过一个月测试后,改正了,10,个错误,此时,MTBF=15h,。,试求出:,1,)测试前程序中的错误总数;,2,)为做到,MTBF=100h,,,应进行多长时间的测试?此时程序中还残留多少个错误?,3,)分析测试各阶段的可靠性。,解:,1,),=k,r,(,),,MTBF=1/,E,r,(,),=I,T,r,(,),=I,T,/(k MTBF),
43、E,C,(,),=E,T,I,T,/,(,k MTBF,),即:,15=E,T,10000/,(,k 10,),15+10=E,T,10000/,(,k 15,),解上述方程组,得:,E,T,=45,k=100/3,12.5.3,软件可靠性估算举例,2/9/2026,68,2,),假设:单位时间内改正错误后剩余的错误数与改正前错误总数成正比,于是有:,Er,(,1,),=k,1,E,T,(,1,),Er,(,2,),=k,1,Er,(,1,),=k,1,2,E,T,(,2,),Er,(,),=k,1,E,T,(,3,),由(,1,)式,,45 15=k,1,45,,得,k,1,=2/3,,,M
44、TBF,(,),=I,T,/,(,k,Er,(,),=I,T,/,(,k k,1,E,T,),=10000/,(,100/3,),(,2/3,),45,),=6.666667,(,3/2,),(,4,),12.5.3,软件可靠性估算举例,2/9/2026,69,MTBF,(,),=6.666667,(,3/2,),(,4,),将,已知,MTBF()=100,,,代入(,4,)式:,MTBF,(,),=,(,20/3,),(,3/2,),100=,(,20/3,),(,3/2,),(,1.5,),=15,=,ln,15/,ln,1.5,=6.68,(,月),由上面的(,3,)式,,Er,(,),
45、k,1,E,T,=(2/3),45,,,将,=6.68,(,月)代入,得:,Er,(,6.68,),=45(2/3),6.68,=2.998633,(,个),3,)分析测试各阶段的可靠性:,12.5.3,软件可靠性估算举例,2/9/2026,70,(,月,),MTBF,与,的关系曲线,MTBF,(,)(,小时),120,110,100,90,80,70,60,50,40,30,20,10,1 2 3 4 5 6 7 8,113.9,75.9,50.6,37.75,22.25,15,10,100,2/9/2026,71,可靠性的公式如下:,R,(,t,),=exp k,r,(,),t =exp
46、t/MTBF,(,),当,=1,(,月)时,,MTBF,(,1,),=10h,,,此时的可靠性公式为:,R,(,t,),=exp,(,t/MTBF,(,1,),=exp,(,t/10,),=e,0.1t,当,=6.68,(,月)时,,MTBF,(,6.68,),=100h,,,则:,R,(,t,),=exp,(,t/MTBF,(,6.68,),=exp,(,t/10 0,),=e,0.01t,12.5.3,软件可靠性估算举例,2/9/2026,72,t,(,小时),测试,月后的可靠性,R,(,t,),曲线,1,0.9,0.8,0.7,0.6,0.5,0.4,0.3,0.2,0.1,R(t
47、10 20 30 40 50 60 70 80,=6.68,月,,R,(,t,),=e,0.01t,=1,月,,R,(,t,),=e,0.1t,2/9/2026,73,12.6,测试工具,测试执行与评价,测试设计与开发,测试计划,评审与检查,Test Execution&Evaluation,Tools for Test Design&Development,Tools for Test planning,Tools for reviews and inspections,2/9/2026,74,12.6,测试工具,12.6.1,自动测试工具,1,)模块驱动工具(,module anima
48、te tool,),2,),静态分析器(,static analyzers,);,3,),测试覆盖监视器;,4,)程序正确性证明器;,5,)测试数据生成器(,test data generators,);,6,),环境模拟器;,此外,还有:代码审查器、测试文件产生器、测试验证器、符号处理系统、输出比较器、测试套具,等等。,2/9/2026,75,12.6.2,调试工具,在早期,调试工具用符号调试器。,目前的大多数程序设计环境,如,VB,、,VC+,、,Borland C+Builder,、,PB,、,C#,等都是带有,CASE,工具的集成开发环境,即将编辑、编译、连接、运行、调试、打包、项目管理、文件管理、部件管理、数据库等多个工具集成在一起。其中的调试工具常见的功能有设置断点,单步执行,跟踪,查看、修改变量或表达式的值等等。,2/9/2026,76,2/9/2026,77,






