1、系统实现,编码和测试统称为实现,系统实现,编码就是把软件设计结果翻译成用某种程序设计语言书写的程序。无论怎样强调软件测试的重要性和它对软件可靠性的影响都不过分。测试的目的就是在软件投入生产性运行之前,尽可能多地发现软件中的错误。,系统实现,软件测试阶段:单元测试、综合测试软件测试的工作量往往占软件开发总工作量的40%以上调试目的:通过测试发现错误之后还必须诊断并改正错误调试是测试阶段最困难的工作,编码,选择程序设计语言:容易测试与维护高级语言明显优于汇编语言:特殊的应用领域或大型系统中执行时间非常关键,编码实用标准,系统用户的要求可以使用的编译程序可以得到的软件工具工程规模程序员的知识软件可移
2、植性要求软件的应用领域,编码风格,源程序代码的逻辑简明清晰、易读易懂是好程序的一个重要标准程序内部的文档:恰当的标识符、适当的注解和程序的视觉组织数据说明:次序标准化、变量按字母顺序、复杂数据结构加注解语句构造:简单直接输入输出,编码风格,效率:效率是性能要求、效率是靠好设计来提高的、程序的效率和程序的简单程度是一致的程序运行时间:算法的效率存储器效率输入输出的效率,软件测试基础,测试阶段的根本目标是尽可能多地发现并排除软件中潜藏的错误软件测试的目标:测试是为了发现程序中的错误而执行程序的过程好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案成功的测试是发现了至今为止尚未发现的错误的测试
3、,软件测试基础,综合测试阶段通常由其他人员组成测试小组来完成测试工作测试决不能证明程序是正确的结论:测试只能查找出程序中的错误不能证明程序中没有错误,软件测试准则,所有测试都应该能追溯到用户需求应该远在测试开始之前就制定出测试计划 Pareto原理:错误中的80%很可能是由程序中20%的模块造成应该从“小规模”测试开始,并逐步进行“大规模”测试穷举测试是不可能的为了达到最佳的测试效果,应该由独立的第三方从事测试工作,测试方法,黑盒测试:根据已知的功能检验能否正常使用白盒测试:根据已知工作过程检验是否按规格说明书规定正常运行。,黑盒测试,把程序看作一个黑盒子,完全不考虑程序的内部结构和处理过程黑
4、盒测试是在程序接口进行的测试,程序是否能适当地接收输入数据并产生正确的输出信息,能否保持外部信息的完整性黑盒测试又称为功能测试,白盒测试,把程序看成装在一个透明的白盒子里,测试者完全知道程序的结构和处理算法按照程序内部的逻辑测试程序,检测程序中的主要执行通路是否都能按预定要求正确工作白盒测试又称为结构测试,测试步骤,模块测试:保证每个模块作为一个单元能正确运行,又称为单元测试,发现编码和详细设计的错误。子系统测试:主要测试模块相互间的协调和通信,着重测试模块的接口。系统测试:装配成一个完整的系统来测试发现软件设计中的错误,或需求说明中的错误,测试步骤,验收测试:作为单一的实体进行测试,用户积极
5、参与下进行,使用实际数据进行测试。发现系统需求说明书中的错误,也称为确认测试。平行运行:目的,测试阶段的信息流,单元测试,检测软件设计的最小单元模块主要使用白盒测试技术测试重点:模块接口:数据流能否正确进出;参数的数目、次序、属性或单位系统与变元全局变量,单元测试,局部数据结构重要的执行通路:选择最有代表性、最可能发现错误的执行通路进行测试边界条件出错处理通路,代码审查,人工测试源程序:本人代码审查:审查小组正式进行30%70%的逻辑设计错误和编码错误组成:组长;程序的设计者;程序的编写者;程序的测试者预排,计算机测试,为每个单元测试开发驱动软件、存根软件驱动程序是一个“主程序”,它接收测试数
6、据,把这些数据传送给被测试的模块,并且印出有关的结果存根程序也可以称为“虚拟子程序”驱动程序和存根程序代表开销,但通常不把它们作为软件产品的一部分交给用户。,集成测试,非渐增式测试方法渐增式测试:自顶向下和自底向上,深度优先或宽度优先的策略步骤:对主控制模块进行测试,用存根程序代替所有直接附属于主控制模块的模块;根据选定的结合策略,每次用一个实际模块代换一个存根程序;在结合进一个模块的同时进行测试;回归测试:保证加入模块没有引进新的错误,自顶向下集成,自顶向下结合,不需要存根程序步骤:把低层模块组合成实现某个特定的软件子功能的族;写一个驱动程序,协调测试数据的输入和输出对由模块组成的子功能族进
7、行测试;去掉驱动程序,沿软件结构自下向上,把子功能族组合成更大的子功能族。,自底向上集成,自底向上结合,不同集成测试策略的比较,改进的自顶向下测试方法混合法:对软件结构中较上层使用的自顶向下方法与对软件结构中较下层使用的自底向上方法相结合,回归测试,集成测试:建立了新的数据流路径,可能出现了新的I/O操作,激活了新的控制逻辑。回归测试:指重新执行已经做过的测试的某个子集,以保证上述这些变化没有带来非预期的副作用,回归测试,回归测试集不同的测试用例:检测软件全部功能的代表性测试用例专门针对可能受修改影响的软件功能的附加测试;针对被修改过的软件成分的测试。,确认测试,也称为验收测试,它的目标是验证
8、软件的有效性确认测试的范围:黑盒测试法、结果软件配置复查Alpha和Beta测试 Alpha测试是在受控的环境中进行的; Beta测试是软件在开发者不能控制的环境中的“真实”应用。,白盒测试技术,测试方案:具体的测试目的+测试用例测试用例:应该输入的测试数据和预期的结果。最困难是设计测试用的输入数据。白盒测试典型技术:逻辑覆盖和控制结构测试,逻辑覆盖,有选择地执行程序中某些最有代表性的通路是对穷尽测试的惟一可行的替代办法逻辑覆盖是对一系列测试过程的总称,这组测试过程逐渐进行越来越完整的通路测试测试数据执行程序的逻辑通路称为覆盖覆盖的标准:语句覆盖:选择足够多的测试数据,使被测程序中每个语句至少
9、执行一次,被测试模块的流程图,语句覆盖,执行路径:Sacbed: A=2,B=0,X=4语句覆盖对程序的逻辑覆盖很少语句覆盖是很弱的逻辑覆盖标准,判定覆盖,判定覆盖(分支覆盖):不仅每个语句必须至少执行一次,而且每个判定的每种可能的结果都应该至少执行一次不关心条件中的取值,只要各个条件的通路都执行即可判定覆盖比语句覆盖强,条件覆盖,条件覆盖:不仅每个语句至少执行一次,而且使判定表达式中的每个条件都取到各种可能的结果主要对条件取各种值,均取到不同的值条件覆盖通常比判定覆盖强缺点:条件的值不代表所有表达式的值,判定/条件覆盖,判定/条件覆盖:选取足够多的测试数据,使得判定表达式中的每个条件都取到各
10、种可能的值,而且每个判定表达式也都取到各种可能的结果有时判定/条件覆盖也并不比条件覆盖更强,条件组合覆盖,条件组合覆盖:要求选取足够多的测试数据,使得每个判定表达式中条件的各种可能组合都至少出现一次满足条件组合覆盖标准的测试数据,也一定满足判定覆盖、条件覆盖和判定/条件覆盖标准。因此,条件组合覆盖是前述几种覆盖标准中最强的。但是,满足条件组合覆盖标准的测试数据并不一定能使程序中的每条路径都执行到。,点、边覆盖,点覆盖:如果连通图G的子图G是连通的,而且包含G的所有结点,称G是G的点覆盖点覆盖标准和语句覆盖标准是相同的边覆盖:如果连通图G的子图G是连通的,而且包含G的所有边,则称G是G的边覆盖边
11、覆盖和判定覆盖是一致的,路径覆盖,路径覆盖:选取足够多测试数据,使程序的每条可能路径都至少执行一次例子:15+sacbd,控制结构测试,基本路径测试: 首先计算程序的环形复杂度,并用该复杂度为指南定义执行路径的基本集合,从该基本集合导出的测试用例可以保证程序中的每条语句至少执行一次,而且每个条件在执行时都将分别取真、假两种值,基本路径测试步骤,根据过程设计结果画出相应的流图计算流图的环形复杂度确定线性独立路径的基本集合设计可强制执行基本集合中每条路径的测试用例,求平均值过程的流图,基本路径测试,独立路径是指至少引入程序的一个新处理语句集合或一个新条件的路径,用流图术语描述,独立路径至少包含一条
12、在定义该路径之前不曾用过的边。程序的环形复杂度决定了程序中独立路径的数量。注意:某些独立路径不能以独立的方式测试,条件测试,检查程序模块中包含的逻辑条件一个简单条件是一个布尔变量或一个关系表达式优点:容易度量条件的测试覆盖率;程序内条件的测试覆盖率可指导附加测试的设计,条件测试,分支测试:对于复合条件C来说,C的真分支和假分支以及C中的每个简单条件,都应该至少执行一次域测试:对一个关系表达式执行3个或4个测试BRO测试:如果在条件中所有布尔变量和关系算符都只出现一次且没有公共变量,则BRO测试保证能发现该条件中的分支错和关系算符错BRO测试利用条件C的条件约束来设计测试用例,循环测试,简单循环
13、嵌套循环串接循环,黑盒测试技术,着重测试软件功能力图发现:功能不正确或遗漏功能;界面错误;数据结构错误或外部数据库访问错误;性能错误;初始化和终止错误,黑盒测试技术,白盒测试在测试过程的早期阶段进行,而黑盒测试主要用于测试过程的后期设计黑盒测试方案时,应该考虑下述问题:怎样测试功能的有效性?哪些类型的输入可构成好测试用例?系统是否对特定的输入值特别敏感?怎样划定数据类的边界?系统能够承受什么样的数据率和数据量?数据的特定组合将对系统运行产生什么影响?,黑盒测试技术,黑盒测试技术测试用例集标准:所设计出的测试用例能够减少为达到合理测试所需要设计的测试用例的总数;所设计出的测试用例能够告诉我们,是
14、否存在某些类型的错误,而不是仅仅指出与特定测试相关的错误是否存在,等价划分,把程序的输入域划分成若干个数据类,据此导出测试用例等价划分法力图设计出能发现若干类程序错误的测试用例,从而减少必须设计的测试用例的数目测试方案首先需要划分输入数据的等价类,确定输入数据的有效等价类和无效等价类。,等价划分,划分等价类启发式规则测试方案步骤:设计一个新的测试方案以尽可能多地覆盖尚未被覆盖的有效等价类,重复这一步骤直到所有有效等价类都被覆盖为止;设计一个新的测试方案,使它覆盖一个而且只覆盖一个尚未被覆盖的无效等价类,重复这一步骤直到所有无效等价类都被覆盖为止。,边界值分析,下标、纯量、数据结构和循环等等的边
15、界附近输入等价类和输出等价类的边界联合使用等价划分和边界值分析,错误推测,错误推测法在很大程度上靠直觉和经验进行。它的基本想法是列举出程序中可能有的错误和容易发生错误的特殊情况,并且根据它们选择测试方案。在一段程序中已经发现的错误数目往往和尚未发现的错误数成正比。,调试,调试不是测试,但是它总是发生在测试之后调试结果:找到了问题的原因并把问题改正和排除掉了没找出问题的原因调试是软件开发中最艰巨的脑力劳动。软件错误的特征是相当重要的原因,调试过程,调试途径,需要把系统地分析、直觉和运气组合蛮干法回溯法原因排除法:对分查找法归纳法演绎法,调试,改正错误需要注意的问题:是否同样的错误也在程序其他地方
16、存在?将要进行的修改可能会引入的“下一个错误”是什么?为防止今后出现类似的错误,应该做什么?,软件可靠性,定义:软件可靠性是程序在给定的时间间隔内,按照规格说明书的规定成功地运行的概率软件可用性: 是程序在给定的时间点,按照规格说明书的规定,成功地运行的概率可靠性和可用性差别:可靠性意味着在0到t这段时间间隔内系统没有失效,而可用性只意味着在时刻t,系统是正常运行的,软件可靠性,如果在一段时间内,软件系统故障停机时间分别为td1,td2,正常运行时间分别为tu1,tu2,则系统的稳态可用性为:Ass=Tup/(Tup+Tdown)(7.1)其中Tup=tui,Tdown=tdi如果引入系统平均
17、无故障时间MTTF和平均维修时间MTTR的概念,则(7.1)式可以变成Ass=MTTF/(MTTF+MTTR),估算平均无故障时间的方法,MTTF符号:ET测试之前程序中错误总数;IT程序长度(机器指令总数);测试(包括调试)时间;Ed()在0至期间发现的错误数;Ec()在0至期间改正的错误数,基本假定,在类似的程序中,单位长度里的错误数ET/IT近似为常数失效率正比于软件中剩余的错误数,而平均无故障时间与剩余的错误数成反比。Ec()=Ed()剩余的错误数为 Er()=ET-Ec()单位长度程序中剩余的错误数为:r()=ET/Ir-Ec()/IT,估算平均无故障时间,平均无故障时间与单位长度程
18、序中剩余的错误数成反比:MTTF=1/K(ET/IT-Ec()/IT) K为常数,典型值是200Ec=ET-IT/(KMTTF),估计错误总数的方法,程序中的错误总数ET与程序规模、类型、开发环境、开发方法论、开发人员的技术水平和管理水平等都有密切关系植入错误法:假定所用的测试方案发现植入错误和发现原有错误的概率相同 则:N=n/nsNs 其中N即是错误总数ET的估计值,估计错误总数的方法,分别测试法:随机地把程序中一部分原有的错误加上标记,根据测试过程中发现的有标记错误和无标记错误的比例,估计程序中的错误总数。,估计错误总数的方法,表示测试时间,假设=0时错误总数为B0;=1时测试员甲发现的
19、错误数为B1;=1时测试员乙发现的错误数为B2;=1时两个测试员发现的相同错误数为bc。估计出测试前程序中的错误总数为 B0 =B2/bcB1,小结,实现包括编码和测试两个阶段高级程序设计语言较汇编语言有很多优点软件测试仍然是保证软件可靠性的主要手段设计测试方案是测试阶段的关键技术问题白盒测试和黑盒测试是软件测试的两类基本方法,小结,白盒测试:逻辑覆盖和控制结构测试;黑盒测试:等价划分、边界值分析和错误推测调试的任务:在测试过程中发现的软件错误必须及时改正测试和调试是软件测试阶段中的两个关系非常密切的过程,它们往往交替进行软件的可靠性,语句构造,不要为了节省空间而把多个语句写在同一行尽量避免复
20、杂的条件测试尽量减少对“非”条件的测试避免大量使用循环嵌套和条件嵌套利用括号使逻辑表达式或算术表达式的运算次序清晰直观,输入输出,对所有输入数据都进行检验;检查输入项重要组合的合法性;保持输入格式简单;使用数据结束标记,不要要求用户指定数据的数目明确提示交互式输入的请求,详细说明可用的选择或边界数值;当程序设计语言对格式有严格要求时,应保持输入格式一致;设计良好的输出报表;给所有输出数据加标志。,平行运行的目的,可以在准生产环境中运行新系统而又不冒风险用户能有一段熟悉新系统的时间可以验证用户指南和使用手册之类的文档能够以准生产模式对新系统进行全负荷测试,可以用测试结果验证性能指标,出错处理通路
21、,对错误的描述是难以理解的;记下的错误与实际遇到的错误不同;在对错误进行处理之前,错误条件已经引起系统干预;对错误的处理不正确;描述错误的信息不足以帮助确定造成错误的位置,启发式规则,如果规定了输入值的范围,则可划分出一个有效的等价类、两个无效的等价类如果规定了输入数据的个数,则类似地也可以划分出一个有效的等价类和两个无效的等价类如果规定了输入数据的一组值,而且程序对不同输入值做不同处理,则每个允许的输入值是一个有效的等价类,此外还有一个无效的等价类如果规定了输入数据必须遵循的规则,则可以划分出一个有效的等价类和若干个无效的等价类如果规定了输入数据为整型,则可以划分出正整数、零和负整数等3个有
22、效类如果程序的处理对象是表格,则应该使用空表,以及含一项或多项的表,软件错误的特征,症状和产生症状的原因可能在程序中相距甚远,也就是说症状可能出现在程序,的一个部分,而实际的原因可能在与之相距很远的另一部分。紧耦合的程序结构更加剧了这种情况。当改正了另一个错误之后,症状可能暂时消失了症状可能实际上并不是由错误引起的,例如,舍入误差症状可能是由不易跟踪的人为错误引起的,软件错误的特征,症状可能是由定时问题而不是由处理问题引起的可能很难重新产生完全一样的输入条件症状可能时有时无,这种情况在硬件和软件紧密地耦合在一起的嵌入式系统中特别常见症状可能是由分布在许多任务中的原因引起的,这些任务运行在不同的处理机上,