本文总结于《软件工程——原理、方法与应用》第三版
第八章 编码与测试
1、软件测试
动态查找程序代码中的各类错误和问题的过程。
软件测试是一个与项目开发并行的过程,按照新的观点,测试活动应分布于需求、分析、设计、编码、测试和验收等各个阶段。它是软件开发时期最繁重的任务,也是保证软件可靠性的最主要手段。
·测试与纠错
- 测试:
·目的:发现程序的错误;
·任务:通过在计算机上执行程序,暴露程序中潜在的错误 - 纠错:
·目的:定位和纠正错误
·任务:消除软件故障,保证程序的可靠运行
测试用例:一次执行需要的测试数据。
测试用例={测试数据+预期结果}({}表示重复)
测试结果={测试数据+预期结果+实际结果}
每一个测试用例产生一个相应的测试结果,如果它与期望结果不相符合,便说明程序中存在错误,需要通过纠错来改正。
选择测试用例的目标:是用尽可能少的测试数据,达到尽可能大的程序覆盖面,发现尽可能多的软件错误和问题。
·测试的特性:
挑剔性、复杂性、不彻底性、经济性
穷举测试:让被测程序在一切可能的输入情况下全部执行一遍。
选择测试:选择一些典型的、有代表性的测试用例进行有限的测试。
·测试的种类
·静态分析(程序不执行): 静态分析器分析(自动方式)
代码评审(人工方式):代码会审、走查、办公室检查
·动态测试(程序执行):黑盒测试(测试程序功能)、白盒测试(测试程序结构)
·黑盒测试(功能测试)
1、等价分类法
所谓等价分类,就是把输入数据的可能值划分为若干等价类,使每类中的任何一个测试用例,都能代表同一等价类中的其他测试用例。
注意:
一是划分等价类不仅要考虑代表有效输入值的有效等价类,还需考虑代表无效输入值的无效等价类;
二是每一无效等价类至少要用一个测试用例,不然就可能漏掉某一类错误,但允许若干有效等价类合用同一个测试用例,以便进一步减少测试的次数。
例:某公司公开招工,规定报名者年龄应在16周岁至35周岁之间(到2008年3月止)。若出生年月不在上述范围内,将拒绝接受,并显示“年龄不合格”等出错信息。试用等价分类法设计对这一程序功能的测试用例。
测试等价类表
边界值分析法
在数组容量、循环次数以及输入数据域输出数据的边界值附近程序出错的概率往往较大。采用边界值分析法,就是要这样来选择测试用例,使得被测程序能在边界值及其附近运行,从而更有效地暴露程序中隐藏的错误。
所谓边界值分析,就是要把测试的重点放在各个等价类的边界上,选取刚好等于,刚好小于,刚好大于边界值的数据为测试数据,并据此设计出相应的测试用例。
比较:
①等价分类法的测试数据是在各个等价类允许的值域内任意选取的,而边界类分析的测试数据必须在边界值附近选取;
②一般的说,用边界值分析法设计的测试用例比等价分类法的代表性更广,发现错误的能力也更强。
错误猜测法
所谓猜错,就是猜测被测程序在哪些地方容易出错,然后针对可能的薄弱环节来设计测试用例。
因果图法
是一种简化了的逻辑图,当被测程序具有多种输入条件,程序的输出又依赖于输入条件的各种组合时,用因果图直观地表明输入条件和输出动作之间的因果关系,能帮助测试人员把注意力集中到与程序功能有关的那些输入组合上,比采用等价分类法有更高明的测试效率。
·白盒测试
白盒测试以程序的结构为依据,所以又称为结构测试早期的白盒测试把注意咯放在流程图的各个判定框,使用不同的逻辑覆盖标准来表达对程序进行测试的详尽程度,称为逻辑覆盖测试;
用程序图代替流程图来设计测试用例,称为路径测试。
逻辑覆盖测试的5种标准
发现错误的能力由弱到强
1、语句覆盖:每条语句至少执行一次 A与B为true
2、判定覆盖:每一判定的每个分支至少执行一次 A与B为true,A与B为false
3、条件覆盖:每一判定中的每个条件,分别按“真”“假”至少各执行一次 A=true,B=true,A=fasle,B=false
4、判定/条件覆盖:同时满足判定覆盖和条件覆盖的要求 A与B=true,A与B=false,A=true,B=true,A=false,B=false
5、条件组合覆盖:求出判定中所有条件的各种可能组合值,每一可能的条件组合至少执行一次 A=true与B=true,A=true与B=false,A=false与B=true,A=false与B=false
语句覆盖发现错误的能力最弱,一般不单独采用。判定覆盖与条件覆盖的差别在于:前者把判定看成一个整体,后者则着眼于其中的一个条件。当一个判定只含一个条件时,判定覆盖也就是条件覆盖。但如果一个判定含有一个以上的条件(称其为复合条件),采用判定覆盖有可能出现漏洞:盘定制有些条件得到测试,另一些条件却被忽略。判定/条件覆盖解决了条件覆盖的不足之处。条件组合覆盖在5种覆盖中发现错误的能力最强。
路径测试法
着眼于程序的执行路径,程序图是考察测试路径的有用工具。
· 顺序执行的多个结点,在程序图中可以合并画成一个结点。
· 含有复合条件的判定框,应先将其分解成几个简单条件判定框,然后再画程序图
程序图关心的是程序中的判定框,而不是顺序执行部分的细节。
路径测试的特征
对程序图中每一条可能的程序执行路径至少测试一次,如果程序中含有循环(在程序图中表现为环),则每个循环至少执行一次。
①满足结构测试的最低要求。语句覆盖(点覆盖)加判定覆盖(边覆盖)是对白盒测试的最低要求,同时满足这两种标准的覆盖称为完全覆盖。
②有利于安排循环测试。对单循环结构的路径测试包括:
· 零次循环,即不执行循环体,直接从循环入口跳到出口;
· 一次循环,循环体仅执行一次,主要检查在循环初始化中可能存在的错误;
· 典型次数的循环
· 最大值次循环,如果循环次数存在最大值,应按此最大值进行循环,需要时还可增加比最大值次数少一次或多一次的循环测试
选择测试路径的原则
①选择具有功能含义的路径
②尽量用短路径代替长路径
③从上一条测试路径到下一条测试路径,应尽量减少变动的部分(包括变动的边和结点)
④由简入繁,如果可能,应先考虑不含循环的测试路径,然后补充对循环的测试;
⑤除非不得已(如为了要覆盖某条边),不要选取没有明显功能含义的复杂路径。
2、多模块程序的测试策略
测试的层次:
单元测试、集成测试、高级测试(确认测试、系统测试)
1、单元测试==(编码阶段,以白盒(结构)测试为主)==
单元测试是层次测试的第一步,也是整个测试的基础。在编码阶段完成。单元一般以模块或子程序为单位,故又称模块测试。
目的:通过对象模块的静态分析与动态测试,使其代码达到模块说明书的需求。
·静态分析与动态测试的重点,均应放在模块内部的重要执行路径、出错处理路径和局部数据结构,也要重视模块的对外接口。
2、集成测试(测试阶段,以黑盒(功能)测试为主)
集成测试是一个逐步组装的过程,它从一个单元开始,逐一地添加新的单元,边添加边测试边纠错,直至最终将所有单元集成为一个系统。
除进行新的测试项目外,还需重复先前已经进行过的测试,也称为回归测试。回归测试可用于防止因软件组装改变而导致新的不协调,出现不可预料的错误。
目的:将经过单元测试的模块逐步组装成具有良好一致性的完整的程序
集成测试的策略:可以分为自顶向下、由底向上以及两头逼近的混合方式。
3、确认测试(测试阶段,以黑盒(功能)测试为主)
确认测试是对整个程序的测试,用于确认组装完毕的程序确能满足需求规格说明书(SRS)的要求。
①有效性测试(黑盒测试)和配置复审
②验收测试(由用户进行)
③a与β测试
a测试是在一个受控的环境下,由用户在开发者的指导下进行的测试,由开发者负责记录错误和使用中出现的问题。
β测试是由最终用户在自己的场所进行的,开发者通常不会在场,也不能控制应用的环境。所有在β测试中遇到的问题均由用户记录,并定期把报告给开发者。、
4、系统测试(安装与验收阶段,以黑盒(功能)测试为主)
系统测试是在验收阶段进行。
目的是检查把确认测试合格的软件安装到系统以后,能否与系统的其余部分协调进行,并且实现SRS的要求。