根据第4条测试准则,测试过程也必须分步骤进行,后一个步骤在逻辑上是前一个步骤的继续。 大型软件系统通常由若干个子系统组成,每个子系统又由许多模块组成,因此,大型软件系统的测试过程基本上由模块测试、子系统测试、系统测试、验收测试和平行运行等五个步骤组成。
模块不是一个独立的程序,因此必须为每个单元测试开发驱动软件和(或)存根软件。 驱动程序是一个“主程序”,它接收测试数据,把这些数据传送给被测试的模块,并且印出有关的结果。 存根程序代替被测试的模块所调用的模块,它使用被它代替的模块的接口,可能做最少量的数据操作,印出对入口的检验或操作结果,并且把控制归还给调用它的模块。
模块结合进软件结构的具体过程由下述4个步骤完成: ① 对主控制模块进行测试,测试时用存根程序代替所有直接附属于主控制模块的模块; ② 根据选定的结合策略(深度优先或宽度优先),每次用一个实际模块代换一个存根程序(新结合进来的模块往往又需要新的存根程序); ③ 在结合进一个模块的同时进行测试; ④ 为了保证加入模块没有引进新的错误,可能需要进行回归测试(即全部或部分地重复以前做过的测试)。 从②开始不断地重复进行上述过程,直到构造起完整的软件结构为止。
回归测试集(已执行过的测试用例的子集)包括下述3类不同的测试用例。 (1) 检测软件全部功能的代表性测试用例。 (2) 专门针对可能受修改影响的软件功能的附加测试。 (3) 针对被修改过的软件成分的测试。 在集成测试过程中,回归测试用例的数量可能变得非常大。因此,应该把回归测试集设计成只包括可以检测程序每个主要功能中的一类或多类错误的那样一些测试用例。
确认测试必须有用户积极参与,或以用户为主进行。用户应该参与设计测试方案,使用用户界面输入测试数据并且分析评价测试的输出结果。 确认测试通常使用黑盒测试法。应该仔细设计测试计划和测试过程,测试计划包括要进行的测试的种类及进度安排,测试过程规定了用来检测软件是否与需求一致的测试方案。 通过测试和调试要保证软件能满足所有功能要求,能达到每个性能要求,文档资料是准确而完整的,此外,还应该保证软件能满足其他预定的要求(例如安全性、可移植性、兼容性和可维护性等)。 确认测试有下述两种可能的结果: (1) 功能和性能与用户要求一致,软件是可以接受的。 (2) 功能和性能与用户要求有差距。
1.语句覆盖
语句覆盖对程序的逻辑覆盖很少,在上面例子中两个判定条件都只测试了条件为真的情况,如果条件为假时处理有错误,显然不能发现。 语句覆盖只关心判定表达式的值,而没有分别测试判定表达式中每个条件取不同值时的情况。为了执行sacbed路径,以测试每个语句,只需两个判定表达式(A>1)AND(B=0)和(A=2)OR(X>1)都取真值,因此使用上述一组测试数据就够了。但是,如果程序中把第一个判定表达式中的逻辑运算符AND错写成OR,或把第二个判定表达式中的条件X>1误写成X<1,使用上面的测试数据并不能查出这些错误。 综上所述,可以看出语句覆盖是很弱的逻辑覆盖标准。
2.判定覆盖 3.条件覆盖 只需要使用下面两组测试数据就可以达到上述覆盖标准: ① A=2,B=0,X=4(满足A>1,B=0,A=2和X>1,执行路径sacbed) ② A=1,B=1,X=1(满足A≤1,B≠0,A≠2和X≤1,执行路径sabd) 条件覆盖通常比判定覆盖强,但满足条件覆盖的测试数据不一定满足判定覆盖。例如,上面两组测试数据也同时满足判定覆盖标准。但是,如果使用下面两组测试数据,则只满足条件覆盖标准并不满足判定覆盖标准(第二个判定表达式的值总为真): ① A=2,B=0,X=1(满足A>1,B=0,A=2和X≤1,执行路径sacbed) ② A=1,B=1,X=2(满足A≤1,B≠0,A≠2和X>1,执行路径sabed)
4.判定/条件覆盖 5.条件组合覆盖 下面的4组测试数据使上面列出的8种条件组合每种至少出现一次: ① A=2,B=0,X=4(针对(1)和(5),执行路径sacbed) ② A=2,B=1,X=1(针对(2)和(6),执行路径sabed) ③ A=1,B=0,X=2(针对(3)和(7),执行路径sabed) ④ A=1,B=1,X=1(针对(4)和(8),执行路径sabd) 显然,满足条件组合覆盖标准的测试数据,也一定满足判定覆盖、条件覆盖和判定/条件覆盖标准。因此,条件组合覆盖是前述几种覆盖标准中最强的。但是,满足条件组合覆盖标准的测试数据并不一定能使程序中的每条路径都执行到,例如,上述4组测试数据都没有测试到路径sacbd。
6.点覆盖 7.边覆盖和路径覆盖
路径3的测试用例: 试图处理101个或更多个值 前100个数值应该是有效输入值 预期结果:前100个数的平均值,总数为100 注意,路径3无法独立测试,必须作为路径4或5或6的一部分来测试。 路径4的测试用例: value[i]=有效输入值,其中i<100 value[k]<minimum,其中k<i 预期结果:基于k的正确平均值和总数 路径5的测试用例: value[i]=有效输入值,其中i<100 value[k]>maximum,其中k<i 预期结果:基于k的正确平均值和总数 BRO测试利用条件C的条件约束来设计测试用例。包含n个简单条件的条件C的条件约束定义为(D1,D2,…,Dn),其中Di(0<i≤n)表示条件C中第i个简单条件的输出约束。如果在条件C的一次执行过程中,C中每个简单条件的输出都满足D中对应的约束,则称C的这次执行覆盖了C的条件约束D。 对于布尔变量B来说,B的输出约束指出,B必须是真(t)或假(f)。类似地,对于关系表达式来说,用符号>,=和<指定表达式的输出约束。 作为第一个例子,考虑下列条件: C1:B1 & B2 其中,B1和B2是布尔变量。C1的条件约束形式为(D1,D2),其中D1和D2中的每一个都是t或f。值(t,f)是C1的一个条件约束,并由使B1值为真B2值为假的测试所覆盖。BRO测试策略要求,约束集{(t,t),(f,t), (t,f)}被C1的执行所覆盖。如果C1因布尔算符错误而不正确,则至少上述约束集中的一个约束将迫使C1失败。
作为第二个例子,考虑下列条件 C2:B1 & (E3=E4) 其中,B1是布尔变量,E3和E4是算术表达式。C2的条件约束形式为(D1,D2),其中D1是t或f,D2是>,=或<。除了C2的第二个简单条件是关系表达式之外,C2和C1相同,因此,可以通过修改C1的约束集{(t,t),(f,t),(t,f)}得出C2的约束集。 注意,对于(E3=E4)来说,t意味=,而f意味着<或>,因此,分别用(t,=)和(f,=)替换(t,t)和(f,t),并用(t,<)和(t,>)替换(t,f),就得到C2的约束集{(t,=),(f,=),(t,<),(t,>)}。覆盖上述条件约束集的测试,保证可以发现C2中布尔算符和关系算符的错误。
作为第三个例子,考虑下列条件 C3:(E1>E2)&(E3=E4) 其中,E1、E2、E3和E4是算术表达式。C3的条件约束形式为(D1,D2),而D1和D2的每一个都是>,=或<。除了C3的第一个简单条件是关系表达式之外,C3和C2相同,因此,可以通过修改C2的约束集得到C3的约束集,结果为:{(>,=),(=,=),(<,=),(>,<),(>,>)}覆盖上述条件约束集的测试,保证可以发现C3中关系算符的错误。
白盒测试在测试过程的早期阶段进行,而黑盒测试主要用于测试过程的后期。设计黑盒测试方案时,应该考虑下述问题。 (1)怎样测试功能的有效性? (2)哪些类型的输入可构成好测试用例? (3)系统是否对特定的输入值特别敏感? (4)怎样划定数据类的边界? (5)系统能够承受什么样的数据率和数据量? (6)数据的特定组合将对系统运行产生什么影响? 应用黑盒测试技术,能设计出满足下述标准的测试用例集。 (1)所设计出的测试用例能够减少为达到合理测试所需要设计的测试用例的总数。 (2)所设计出的测试用例能够告诉人们,是否存在某些类型的错误,而不是仅仅指出与特定测试相关的错误是否存在。
划分等价类需要经验,下述的启发式规则可能有助于等价类划分。 (1) 如果规定了输入值的范围,则可划分出一个有效的等价类(输入值在此范围内),两个无效的等价类(输入值小于最小值或大于最大值)。 (2) 如果规定了输入数据的个数,则类似地也可以划分出一个有效的等价类和两个无效的等价类。 (3) 如果规定了输入数据的一组值,而且程序对不同输入值做不同处理,则每个允许的输入值是一个有效的等价类,此外还有一个无效的等价类(任一个不允许的输入值)。 (4) 如果规定了输入数据必须遵循的规则,则可以划分出一个有效等价类(符合规则)和若干个无效等价类(从各种不同角度违反规则)。 (5) 如果规定了输入数据为整型,则可以划分出正整数、零和负整数3个有效类。 (6) 如果程序的处理对象是表格,则应该使用空表,以及含一项或多项的表。 假设有一个把数字串转变成整数的函数。运行程序的计算机字长16位,用二进制补码表示整数。这个函数是用Pascal语言编写的,它的说明如下: function strtoint (dstr:shortstr):integer; 函数的参数类型是shortstr,它的说明是: type shortstr=array[1…6] of char; 被处理的数字串是右对齐的,也就是说,如果数字串比6个字符短,则在它的左边补空格。如果数字串是负的,则负号和最高位数字紧相邻(负号在最高位数字左边一位)。 考虑到Pascal编译程序固有的检错功能,测试时不需要使用长度不等于6的数组做实在参数,更不需要使用任何非字符数组类型的实在参数。
为了测试前述的把数字串转变成整数的程序,除了上一小节已经用等价划分法设计出的测试方案外,还应该用边界值分析法再补充下述测试方案。 根据边界值分析方法的要求,应该分别使用长度为0,1和6的数字串作为测试数据。
等价划分法和边界值分析法都只孤立地考虑各个输入数据的测试功效,而没有考虑多个输入数据的组合效应,可能会遗漏了输入数据易于出错的组合情况。 选择输入组合的一个有效途径是利用判定表或判定树为工具,列出输入数据各种组合与程序应作的动作(及相应的输出结果)之间的对应关系,然后为判定表的每一列至少设计一个测试用例。 选择输入组合的另一个有效途径是把计算机测试和人工检查代码结合起来。
平均维修时间MTTR是修复一个故障平均需要的时间,它取决于维护人员的技术水平和对系统的熟悉程度,也和系统的可维护性有重要关系。平均无故障时间MTTF是系统按规格说明书规定成功地运行的平均时间,它主要取决于系统中潜伏的错误的数目。
(2) 分别测试法 为了随机地给一部分错误加标记,分别测试法使用两个测试员(或测试小组),彼此独立地测试同一个程序的两个副本,把其中一个测试员发现的错误作为有标记的错误。具体做法是,在测试过程的早期阶段,由测试员甲和测试员乙分别测试同一个程序的两个副本,由另一名分析员分析他们的测试结果。用τ表示测试时间,假设 τ=0时错误总数为B0; τ=τ1时测试员甲发现的错误数为B1; τ=τ1时测试员乙发现的错误数为B2; τ=τ1时两个测试员发现的相同错误数为bc。
1.实现包括编码和测试两个阶段。 2.高级程序设计语言较汇编语言有很多优点。 3.通常软件测试至少分为单元测试、集成测试和验收测试3个基本阶段。 4.软件测试不仅仅指利用计算机进行的测试,还包括人工进行的测试(例如,代码审查)。 5.白盒测试和黑盒测试是软件测试的两类基本方法,设计白盒测试方案的技术主要有,逻辑覆盖和控制结构测试;设计黑盒测试方案的技术主要有,等价划分、边界值分析和错误推测。 6.及时改正测试过程中发现的软件错误就是调试的任务。 7.程序中潜藏的错误的数目,直接决定了软件的可靠性。通过测试可以估算出程序中剩余的错误数。