1、复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程2/161 软件测试基础软件测试基础 白盒测试白盒测试 黑盒测试黑盒测试 测试策略测试策略 面向对象测试面向对象测试 测试完成标准测试完成标准 调试调试复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程3/161 白盒测试白盒测试 黑盒测试黑盒测试 测试策略测试策略 面向对象测试面向对象测试 测试完成标准测试完成标准 调试调试复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程4/161 软件测试的目的 软件测试的基本原则 白盒测试和黑盒测试复旦大学计算机科学与工
2、程系复旦大学计算机科学与工程系 软件工程课程软件工程课程5/161“软件测试是为了证明程序是正确的,即测试能发现程序中所有的错误”。事实上这是不可能的。要通过测试发现程序中的所有错误,就要穷举所有可能的输入数据。 对于一个输入三个16位字长的整型数据的程序,输入数据的所有组合情况有248 3*1014,如果测试一个数据需1ms,则即使一年365天一天24小时不停地测试,也需要约1万年。复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程6/161对一个具有多重选择和循环嵌套的程序,对一个具有多重选择和循环嵌套的程序,不同的路径数目可能是天文数字。例如一个不同的路径数目
3、可能是天文数字。例如一个小程序的流程图,它包括了一个执行小程序的流程图,它包括了一个执行20次的次的循环,其循环体有五个分支。这个循环的不循环,其循环体有五个分支。这个循环的不同执行路径数达同执行路径数达520条,如果对每一条路径进条,如果对每一条路径进行测试需要行测试需要1毫秒,那么即使一年工作毫秒,那么即使一年工作365 24小时,要想把所有路径测试完,大约需小时,要想把所有路径测试完,大约需3170年。年。复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程7/161复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程8/161 “程序
4、测试是证明程序正确地执行了预期的功能”。实际上,一个程序不仅要完成它所需完成的功能,而且不应完成它不该做的事。如不能把边长为0、0、0的三条边判断为等边三角形。复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程9/161 Glen Myers给出的软件测试目的:测试是一个为了发现错误而执行程序的过程测试是一个为了发现错误而执行程序的过程一个好的测试用例是指很可能找到迄今为至尚未一个好的测试用例是指很可能找到迄今为至尚未发现的错误的测试用例发现的错误的测试用例一个成功的测试是指揭示了迄今为至尚未发现的一个成功的测试是指揭示了迄今为至尚未发现的错误的测试错误的测试 根据
5、这个测试目的,我们应该排除对测试的错误观点,设计合适的测试用例,用尽可能少的测试用例,来发现尽可能多的软件错误。复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程10/161Davis提出了一组指导软件测试的基本原则:1.所有的测试都应可追溯到客户需求2.应该在测试工作真正开始前的较长时间就进行测试计划3. Pareto原则:测试中发现的80%的错误可能来自于20%的程序代码4.测试应从“小规模”开始,逐步转向“大规模”5.穷举测试是不可能的6.为了达到最有效的测试,应由独立的第三方来承担测试复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程
6、课程11/161其他的测试原则:1.在设计测试用例时,应包括合理的输入条件和不合理的输入条件2.严格执行测试计划,排除测试的随意性3.应当对每一个测试结果做全面检查4.妥善保存测试计划、测试用例、出错统计和最终分析报告,为维护提供方便5.检查程序是否做了应做的事仅是成功的一半,另一半是检查程序是否做了不该做的事6.在规划测试时不要设想程序中不会查出错误复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程12/161 测试用例的设计是软件测试的关键所在测试用例的设计是软件测试的关键所在 设计尽可能少的测试用例来发现尽可能多设计尽可能少的测试用例来发现尽可能多的错误的错误
7、 设计最有可能发现软件错误的测试用例,设计最有可能发现软件错误的测试用例,同时避免使用发现错误效果相同的测试用同时避免使用发现错误效果相同的测试用例例 测试用例的设计方法大体可分为两类:白测试用例的设计方法大体可分为两类:白盒测试和黑盒测试,也称白箱测试和黑箱盒测试和黑盒测试,也称白箱测试和黑箱测试测试复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程13/161 白盒测试(又称为结构测试)把测试对象看作一个透明的盒子,测试人员根据程序内部的逻辑结构及有关信息设计测试用例,检查程序中所有逻辑路径是否都按预定的要求正确地工作。 白盒测试主要用于对模块的测试,包括:程序
8、模块中的所有独立路径至少执行一次程序模块中的所有独立路径至少执行一次对所有逻辑判定的取值(对所有逻辑判定的取值(“真真”与与“假假”)都至少)都至少测试一次测试一次在上下边界及可操作范围内运行所有循环在上下边界及可操作范围内运行所有循环测试内部数据结构的有效性等测试内部数据结构的有效性等复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程14/161 黑盒测试(又称行为测试)把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能需求。 黑盒测试可用于各种测试,它试图发现以下类型的错误:不正确
9、或遗漏的功能不正确或遗漏的功能接口错误,如输入接口错误,如输入/ /输出参数的个数、类型等输出参数的个数、类型等数据结构错误或外部信息数据结构错误或外部信息( (如外部数据库如外部数据库) )访问错误访问错误性能错误性能错误初始化和终止错误初始化和终止错误复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程15/161 软件测试基础软件测试基础 黑盒测试黑盒测试 测试策略测试策略 面向对象测试面向对象测试 测试完成标准测试完成标准 调试调试复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程16/161常用的白盒测试方法有: 逻辑覆盖测试 基
10、本路径覆盖测试 数据流测试 循环测试复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程17/161 语句覆盖语句覆盖 判定覆盖判定覆盖 条件覆盖条件覆盖 判定条件覆判定条件覆盖盖 条件组合覆盖条件组合覆盖 路径覆盖路径覆盖复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程18/161例:对下列子程序进行测试procedure example(y,z:real;var x:real);begin if (y1) and (z=0) then x:=x/y; if (y=2) or (x1) then x:=x+1;end; 该子程序接受x、
11、y、z的值,并将计算结果x的值返回给调用程序。与该子程序对应的流程图如下:复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程19/161入口入口s(y1) and (z=0)a(y=2) or (x 1)c返回返回ebx = x / yftdx = x + 1ft复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程20/161该子程序有两个判定:a: (y1) and (z=0) c: (y=2) or (x1) 判定a中有两个判定条件: y1、 z=0判定c中有两个判定条件: y=2 、“x1” 根据程序的执行流程不同,判定c中的“x1”
12、的含义也不同。当判定a为“真”时, “x1”实际是“x/y1”,即“xy”;当判定a为“假”时, “x1”仍是“x1”。复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程21/161该子程序有四条可执行路径:路径1 sabcde , 其执行条件(L1)是a为“t”且c为“t”L1= (y1) and (z=0) and (y=2) or (x/y1)= (y1) and (z=0) and (y=2) or (y1) and (z=0) and (x y )= (y=2) and (z=0) or (y1) and (z=0) and (x y )seacbdtff
13、ta: (y1) and (z=0) c: (y=2) or (x1)复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程22/161路径2 sace ,其执行条件(L2)是a为“f”且c为“f”)L2 = not(y1) and (z=0) and not(y=2) or (x1)= not (y1) or not (z=0) and not (y=2) and not (x1) = not (y1) and not (y=2) and not (x1) or not (z=0) and not (y=2) and not (x1)=(y1) and (y2) an
14、d (x 1) or (z 0) and (y 2) and (x 1)seacbdtffta: (y1) and (z=0) c: (y=2) or (x1)复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程23/161路径3 sacde ,其执行条件(L3)是a为“f”且c为“t”)L3 = not (y1) and (z=0) and (y=2) or (x1)= not (y1) or not (z=0) and (y=2) or (x1)= not (y1) and (y=2) or not (y1) and (x1) or not (z=0) and (
15、y=2) or not (z=0) and (x1)= (y 1) and (y=2) or (y 1) and (x1) or (z 0) and (y=2) or (z 0) and (x1)seacbdtffta: (y1) and (z=0) c: (y=2) or (x1)复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程24/161路径4 sabce ,其执行条件(L4)是a为“t”且c为“f”)L4 = (y1) and (z=0) and not (y=2) or (x/y1)= (y1) and (z=0) and not (y=2) and no
16、t (x y)=(y1) and (z=0) and (y 2) and (x y)seacbdtffta: (y1) and (z=0) c: (y=2) or (x1)复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程25/161 语句覆盖是指选择足够的测试用例,使得运行这些测试用例时,被测程序的每个可执行语句都至少执行一次 欲使每个语句都执行一次,只需执行路径L1(sabcde)即可。 L1= (y=2) and (z=0) or (y1) and (z=0) and (x y )测试用例如下:测试数据预期结果x=4,y=2,z=0 x=3seacbdtfft
17、a: (y1) and (z=0) c: (y=2) or (x1)复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程26/161 判定覆盖(也称分支覆盖)是指选择足够的测试用例,使得运行这些测试用例时,被测程序的每个判定的所有可能结果都至少执行一次(即判定的每个分支至少经过一次) 复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程27/161欲使每个分支都执行一次,只需执行路径L3(sacde ,a为“f”且c为“t”)和L4(sabce ,a为“t”且c为“f”) 即可。 或者,执行路径L1(sabcde,a为“t”且c为“t”)和L
18、2(sace ,a为“f”且c为“f”).seacbdtffta: (y1) and (z=0) c: (y=2) or (x1)复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程28/161L3(sacde ,a为“f”且c为“t”):(y 1) and (y=2) or (y 1) and (x1) or (z 0) and (y=2) or (z 0) and (x1)L4(sabce ,a为“t”且c为“f”):(y1) and (z=0) and (y 2) and (x y)seacbdtffta: (y1) and (z=0) c: (y=2) or
19、(x1)测试数据预期结果路径acx=1,y=2,z=1x=2sacdeftx=3,y=3,z=0 x=1sabcetf复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程29/161 判定覆盖将每个判定的所有可能结果都至少执行一次,所以,程序中的所有语句也必定都至少执行一次。因此,满足判定覆盖标准的测试用例也一定满足语句覆盖标准。 复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程30/161 条件覆盖是指选择足够的测试用例,使得运行这些测试用例时,被测程序的每个判定中的每个条件的所有可能结果都至少出现一次 复旦大学计算机科学与工程系复旦大
20、学计算机科学与工程系 软件工程课程软件工程课程31/161判定a中各种条件的所有可能结果:y1, y 1 ,z=0, z 0。判定c中各种条件的所有可能结果:y=2, y 2 ,x1(或xy), x 1 (或x y) 。seacbdtffta: (y1) and (z=0) c: (y=2) or (x1)测试数据预期结果路径覆盖的条件x=1,y=2,z=0 x=1.5sabcde y1, z=0, y=2,x=2,y=1,z=1x=3sacde, ,复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程32/161 条件覆盖通常比判定覆盖强,但有时虽然每个条件的所有可
21、能结果都出现过,但判定表达式的某些可能结果并未出现。上面的二个测试用例满足了条件覆盖标准,但判定c为“假”的结果并未出现。复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程33/161 判定/条件覆盖是指选择足够的测试用例,使得运行这些测试用例时,被测程序的每个判定的所有可能结果都至少执行一次,并且,每个判定中的每个条件的所有可能结果都至少出现一次 显然,满足判定/条件覆盖标准的测试用例一定也满足判定覆盖、条件覆盖、语句覆盖标准。 复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程34/161seacbdtffta: (y1) and (
22、z=0) c: (y=2) or (x1)测试数据预期结果路径ac覆盖的条件x=4,y=2,z=0 x=3sabcdetty1, z=0, y=2,x=1,y=1,z=1x=1saceff, ,x 复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程35/161 条件组合覆盖是指选择足够的测试用例,使得运行这些测试用例时,被测程序的每个判定中条件结果的所有可能组合都至少出现一次 显然,满足条件组合覆盖标准的测试用例一定也满足判定覆盖、条件覆盖、判定/条件覆盖、语句覆盖标准。 复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程36/161判定
23、a中条件结果的所有可能组合:y1, z=0 ; y1, z 0;y 1 , z=0 ; y 1 , z 0 判定c中条件结果的所有可能组合: y=2, x1; y=2, x 1 ; y 2 , x1; y 2 , x 1seacbdtffta: (y1) and (z=0) c: (y=2) or (x1)复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程37/161测试数据预期结果路径ac覆盖的条件x=4,y=2,z=0 x=3sabcdetty1,z=0 y=2,xyx=1,y=2,z=1x=2sacdefty1,z 0y=2,x 1x=2,y=1,z=0 x=
24、3sacdefty 1,z=0 y 2,x1x=1,y=1,z=1x=1saceffy 1,z 0 y 2,x1seacbdtffta: (y1) and (z=0) c: (y=2) or (x1)复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程38/161 条件组合覆盖是上述五种覆盖标准中最强的一种,然而,条件组合覆盖仍不能保证程序中所有可能的路径都被覆盖。本例中,满足条件组合覆盖标准的测试用例就没有经过sabce路径。复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程39/161 路径覆盖是指选择足够的测试用例,使得运行这些测试用
25、例时,被测程序的每条可能执行到的路径都至少经过一次(如果程序中包含环路,则要求每条环路至少经过一次) 复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程40/161本例中所有可能执行的路径有:L1 ( sabcde , a为“t”且c为“t”)= (y=2) and (z=0) or (y1) and (z=0) and (x y )L2 ( sace , a为“f”且c为“f”)=(y1) and (y2) and (x 1) or (z 0) and (y 2) and (x 1)L3 ( sacde , a为“f”且c为“t”)= (y 1) and (y=2
26、) or (y 1) and (x1) or (z 0) and (y=2) or (z 0) and (x1)L4 ( sabce , a为“t”且c为“f”)=(y1) and (z=0) and (y 2) and (x y)seacbdtffta: (y1) and (z=0) c: (y=2) or (x1)复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程41/161seacbdtffta: (y1) and (z=0) c: (y=2) or (x1)测试数据预期结果路径acx=4,y=2,z=0 x=3sabcdettx=3,y=3,z=0 x=1s
27、abcetfx=2,y=1,z=0 x=3sacdeftx=1,y=1,z=1x=1saceff复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程42/161 路径覆盖实际上考虑了程序中各种判定结果的所有可能组合,但它未必能覆盖判定中条件结果的各种可能情况。因此,它是一种比较强的覆盖标准,但不能替代条件覆盖和条件组合覆盖标准。复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程43/161复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程44/161 逻辑覆盖测试依赖于程序中的逻辑条件,这些逻辑条件由逻辑表达式组
28、成。对于一个含有n个逻辑变量,或n个关系表达式的逻辑表达式,通常需要2n个测试用例来覆盖其所有可能的条件组合。 当n较大时,我们可以选择对发现逻辑表达式错误比较敏感的组合条件进行测试,以较少的测试用例来发现逻辑表达式中的绝大多数错误。复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程45/161 Tai提出的分支与关系运算符(branch and relational operator,BRO)测试技术能用较少的测试用例发现条件中分支与关系运算符的大多数错误。 采用BRO方法的前提条件:条件中的每个布尔变量和关系运算符至多出现一次,并且无公共变量。 BRO方法引入条
29、件约束的概念,含有n个简单条件Ci的复合条件C的约束D表示为(D1,D2,Dn), Di (0in)表示在Ci的输出(outcome)上的约束,它一般是某种符号。复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程46/161 对布尔表达式,约束为t或f (真、假);对关系表达式,约束为、=。 符合条件C的一次执行覆盖条件约束D是指,C中出现的每个简单条件Ci在这次执行中都满足D中对应的约束Di。 下面分三种情况讨论: 若条件为若条件为C1:B1&B2 其中其中B1、B2为布尔变量,为布尔变量,C1的约束具有的约束具有形式(形式(D1,D2),), D1和和D2为为t
30、或或f。则则C1可能的三种约束为可能的三种约束为(t,t),(f,t),),(t,f)。对其中的每一组设计一组测。对其中的每一组设计一组测试用例。而(试用例。而(f,f)对条件)对条件C1是不敏感的。是不敏感的。复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程47/161 若条件为若条件为C2:B1&(E3=E4) 其中其中B1为布尔表达式,为布尔表达式, E3和和E4为算术为算术表达式。表达式。C2的约束形式为(的约束形式为(D1,D2),), D1为为t或或f;当;当E3=E4时时D2为为=;当;当E3 E4时时D2为为 或或 。则则C2可能的约束集合为可能的
31、约束集合为(t,=),(f,=),(),(t, ),), (t, )。复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程48/161 若条件为若条件为C3: (E1 E2) &(E3=E4) 其中其中E1、E2、E3、E4均为算术表达式。均为算术表达式。则则C2可能的约束集合为可能的约束集合为( ,=),(=,=),), ( ,=) ,(,( , ),), ( , )。复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程49/161 在实际问题中,一个不太复杂的程序,特别是包在实际问题中,一个不太复杂的程序,特别是包含循环的程序,其路径数可
32、能非常大。因此测试含循环的程序,其路径数可能非常大。因此测试常常难以做到覆盖程序中的所有路径,为此,我常常难以做到覆盖程序中的所有路径,为此,我们希望把测试的程序路径数压缩到一定的范围内。们希望把测试的程序路径数压缩到一定的范围内。 基本路径测试是基本路径测试是Tom McCabe提出的一种白盒测提出的一种白盒测试技术,这种方法首先根据程序或设计图画出控试技术,这种方法首先根据程序或设计图画出控制流图,并计算其区域数,然后确定一组独立的制流图,并计算其区域数,然后确定一组独立的程序执行路径(称为基本路径),最后为每一条程序执行路径(称为基本路径),最后为每一条基本路径设计一个测试用例。基本路径
33、设计一个测试用例。复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程50/161 流图由结点和边组成,分别用圆和箭头表示。设计图中一个连续的处理框(对应于程序中的顺序语句)序列和一个判定框(对应于程序中的条件控制语句)映射成流图中的一个结点,设计图中的箭头(对应于程序中的控制转向)映射成流图中的一条边。对于设计图中多个箭头的交汇点可以映射成流图中的一个结点(空结点)。复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程51/161 上述映射的前提是设计图的判定中不包含复合条件。如果设计图的判定中包含了复合条件,那么必须先将其转换成等价的简单
34、条件设计图。123456c)对应的流图)对应的流图a)含复合条件)含复合条件的设计图的设计图a b or c dx = 1x = 2tfy = 0b)只含简单条)只含简单条件的设计图件的设计图ttffx = 1x = 1a b c d x = 2 123456y = 0复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程52/161 我们把流图中由结点和边组成的闭合部分称为一个区域(region),在计算区域数时,图的外部部分也作为一个区域。例如,右图所示的流图的区域数为3。 独立路径是指程序中至少引进一个新的处理语句序列或一个新条件的任一路径,在流图中,独立路径至少
35、包含一条在定义该路径之前未曾用到过的边。在基本路径测试时,独立路径的数目就是流图的区域数。 123456复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程53/161例如,对一个PDL程序进行基本路径测试,该程序的功能是:最多输入N个值(以-999为输入结束标志),计算位于给定范围内的那些值(称为有效输入值)的平均值,以及输入值的个数和有效值的个数。复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程54/161value i minimumvalue i = maximumtotal.valid加加1sum = sum + value i
36、 value i -999total.input ntotal.valid 0average = -999i加加1total.valid加加1赋初值赋初值average = sum / total.valid10111213987123456tffttttfff复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程55/161其区域数为6,我们选取独立路径如下:路径1:1-2-10-11-13路径2:1-2-10-12-13路径3:1-2-3-10-11-13路径4:1-2-3-4-5-8-9-2-10-12-13路径5:1-2-3-4-5-6-8-9-2-10-12-
37、13路径6:1-2-3-4-5-6-7-8-9-2-10-11-13为每一条独立路径设计测试用例。假设:n = 5;minimum = 0;maximum = 100。复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程56/161路径1: 1-2-10-11-13测试数据:value = 90,-999,0,0,0预期结果:Average = 90,total.input = 1,total.valid = 1路径2: 1-2-10-12-13测试数据:value = -999 ,0,0,0,0预期结果:Average = -999,total.input = 0,
38、total.valid = 0路径3: 1-2-3-10-11-13测试数据:value = -1,90,70,-1,80预期结果:Average = 80,total.input = 5,total.valid = 3复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程57/161路径4: 1-2-3-4-5-8-9-2-10-12-13测试数据:value = -1,-2,-3,-4,-999预期结果:Average = -999,total.input = 4,total.valid = 0路径5: 1-2-3-4-5-6-8-9-2-10-12-13测试数据:
39、value = 120,110,101,-999,0预期结果:Average = -999,total.input = 3,total.valid = 0路径6: 1-2-3-4-5-6-7-8-9-2-10-11-13测试数据:value = 95,90,70,65,-999预期结果:Average = 80,total.input = 4,total.valid = 4复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程58/161值得注意的是,某些独立路径(如例中的路径1和路径3)不能以独立的方式进行测试,此时,这些路径必须在其他的独立路径测试中被覆盖。复旦大学
40、计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程59/161 数据流测试是根据程序中变量的定义(赋值)和引用位置来选择测试用例 假定s为语句的标号(每个语句有唯一的标号),x为变量名。定义: DEF(s)= x | 语句s中含有对x的定义 USE(s)= x | 语句s中含有对x的引用 当s为分支或循环语句时, DEF(s)= 设变量x在语句s中被定义,如果存在一条从语句s到语句s 的路径,并且在这条路径上不存在对x的其它定义,则称变量x在s处定义在s处仍有效。复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程60/161 定义:定义-引用链D
41、U 变量x的定义-引用链为x,s,s 其中s, s为语句标号, x DEF(s) USE(s) 且s处定义的x 在s处仍有效 数据流测试就是设计测试用例使得每个DU链至少被覆盖一次 数据流测试适用于嵌套IF和多重循环程序的测试复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程61/161 循环分为4种不同类型:简单循环、嵌套循环、串接循环和非结构循环。 (1) 简单循环 按照下列规则设计测试用例: 零次循环:从循环入口到出口 一次循环:检查循环初始值 二次循环:检查多次循环 m次循环: 检查多次循环 最大次数循环 比最大次数多一次的循环 比最大次数少一次的循环复旦大
42、学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程62/161复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程63/161按照下列规则设计测试用例: 先测试最内层循环:所有外层的循环变量置为最小值,最内层按简单循环测试; 由里向外,测试上一层循环:测试时此层以外的所有外层循环的循环变量取最小值,此层以内的所有嵌套内层循环的循环变量取“典型”值,该层按简单循环测试; 重复上一条规则,直到所有各层循环测试完毕;对全部各层循环同时取最小循环次数,或者同时取最大循环次数(2) 嵌套循环嵌套循环复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件
43、工程课程软件工程课程64/161(3) 串接循环如果串接的各个循环互相独立,则可以分别用简单循环的方法进行测试;但如果第一个循环的循环变量与第二个循环控制相关,则两个循环不独立,此时,把第一个循环看作外循环,第二个循环看作内循环,然后用测试嵌套循环的办法来处理。(4) 非结构循环这一类循环应该先将其结构化,然后再测试。复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程65/161 软件测试基础软件测试基础 白盒测试白盒测试 测试策略测试策略 面向对象测试面向对象测试 测试完成标准测试完成标准 调试调试复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程
44、软件工程课程66/161 黑盒测试是依据软件的需求规约,检查程序的功能是否符合需求规约的要求。 主要的黑盒测试方法有:等价类划分等价类划分边界值分析边界值分析比较测试比较测试错误猜测错误猜测因果图因果图复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程67/161 由于不能穷举所有可能的输入数据来进行测试,所以只能选择少量有代表性的输入数据,来揭露尽可能多的程序错误 等价类划分方法将所有可能的输入数据划分成若干个等价类,然后在每个等价类中选取一个代表性的数据作为测试用例等价类是指输入域的某个子集,该子集中的每个输入等价类是指输入域的某个子集,该子集中的每个输入数据对
45、揭露软件中的错误都是等效的,测试等价类的数据对揭露软件中的错误都是等效的,测试等价类的某个代表值就等价于对这一类其他值的测试。也就是某个代表值就等价于对这一类其他值的测试。也就是说,如果该子集中的某个输入数据能检测出某个错误,说,如果该子集中的某个输入数据能检测出某个错误,那么该子集中的其他输入数据也能检测出同样的错误;那么该子集中的其他输入数据也能检测出同样的错误;反之,如果该子集中的某个输入数据不能检测出错误,反之,如果该子集中的某个输入数据不能检测出错误,那么该子集中的其他输入数据也不能检测出错误。那么该子集中的其他输入数据也不能检测出错误。复旦大学计算机科学与工程系复旦大学计算机科学与
46、工程系 软件工程课程软件工程课程68/161 等价类划分方法把输入数据分为有效输入数据和无效输入数据 有效输入数据指符合规格说明要求的合理的输入数据,主要用来检验程序是否实现了规格说明中的功能 无效输入数据指不符合规格说明要求的不合理或非法的输入数据,主要用来检验程序是否做了规格说明以外的事 在确定输入数据等价类时,常常还要分析输出数据的等价类,以便根据输出数据等价类导出输入数据等价类。复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程69/161 确定等价类根据软件的规格说明,对每一个输入条件(通常是规格说明中的一句话或一个短语)确定若干个有效等价类和若干个无效等
47、价类。 可使用如下表格输入条件有效等价类 无效等价类复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程70/161确定等价类的规则: (1) 如果输入条件规定了取值范围,则可以确定一个有效等价类(输入值在此范围内)和两个无效等价类(输入值小于最小值及大于最大值)例如,规定输入的考试成绩在0.100之间,则有效等价类是“0 成绩 100”,无效等价类是“成绩 0”和“成绩 100”。复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程71/161(2) 如果输入条件规定了值的个数,则可以确定一个有效等价类(输入值的个数等于规定的个数)和两个无
48、效等价类(输入值的个数小于规定的个数和大于规定的个数)例如,规定输入构成三角形的3条边,则有效等价类是“输入边数 = 3”,无效等价类是“输入边数 3”和“输入边数 3”。复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程72/161(3) 如果输入条件规定了输入值的集合(即离散值),而且程序对不同的输入值做不同的处理,那么每个允许的值都确定为一个有效等价类,另外还有一个无效等价类(任意一个不允许的值)。例如,规定输入的考试成绩为优、良、中、及格、不及格,则可确定5个有效等价类和一个无效等价类。复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工
49、程课程73/161(4) 如果输入条件规定了输入值必须遵循的规则,那么可确定一个有效等价类(符合此规则)和若干个无效等价类(从各个不同的角度违反此规则)。例如,在Pascal语言中对变量标识符规定为“以字母开头的串”。那么有效等价类是“以字母开头的串”,而无效等价类有“以数字开头的串”、“以标点符号开头的串”等。复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程74/161(5) 如果输入条件规定输入数据是整型,那么可以确定三个有效等价类(正整数、零、负整数)和一个无效等价类(非整数)。(6) 如果输入条件规定处理的对象是表格,那么可以确定一个有效等价类(表有一项或
50、多项)和一个无效等价类(空表)。以上只是列举了一些规则,实际情况往往是千变万化的,在遇到具体问题时,可参照上述规则的思想来划分等价类。复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程75/161 设计测试用例在确定了等价类之后,建立等价类表,列出所有划分出的等价类。并为每个有效等价类和无效等价类编号。 输入条件有效等价类 无效等价类复旦大学计算机科学与工程系复旦大学计算机科学与工程系 软件工程课程软件工程课程76/161 利用等价类设计测试用例的步骤: (1) 设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖的有效等价类,重复这一步,直到所有的有效等价类都被覆盖