1 / 130

第 7 章 实现 - 软件测试(下)

第 7 章 实现 - 软件测试(下). 软件测试方法. 白盒测试技术 黑盒测试技术 软件系统调试 软件可靠性 小结. 白盒测试技术. 逻辑覆盖测试 判定结构测试 循环结构测试 基本路径测试. 测试用例设计. 选择和设计测试用例 是软件测试员最重要的一项工作。 测试用例的属性 : 属性 描述 name 测试用例的名称 (可选) location 可执行的完全路径名 (可选) input 输入数据或命令 (必要) oracle 期待测试结果 (必要) log 测试实际产生的输出. 逻辑覆盖测试.

cana
Télécharger la présentation

第 7 章 实现 - 软件测试(下)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第7章 实现-软件测试(下)

  2. 软件测试方法 • 白盒测试技术 • 黑盒测试技术 • 软件系统调试 • 软件可靠性 • 小结

  3. 白盒测试技术 • 逻辑覆盖测试 • 判定结构测试 • 循环结构测试 • 基本路径测试

  4. 测试用例设计 • 选择和设计测试用例是软件测试员最重要的一项工作。 • 测试用例的属性: 属性 描述 name测试用例的名称 (可选) location可执行的完全路径名(可选) input输入数据或命令(必要) oracle期待测试结果 (必要) log 测试实际产生的输出

  5. 逻辑覆盖测试 • 含义:对一系列测试过程的总称,它逐渐进行越来越完整的通路测试; • 测试数据覆盖程度的不同又可划分出不同级别的逻辑覆盖测试等级;

  6. 逻辑覆盖种类 • 语句覆盖 • 判定覆盖 • 条件覆盖 • 判定/条件覆盖 • 条件组合覆盖 • 点覆盖 • 边覆盖 • 路径覆盖

  7. a b c F T (A>1)and(B=0) X = X/A e d F T (A=2)or(X>1) X = X+1 逻辑覆盖举例

  8. 测试用例的设计方法 较正式的方法 • 根据路径的逻辑表达式 • 观察法 具备一定经验

  9. 被测程序中每条路径的逻辑表达式 为什么? L1 ( a  c  e )(第1个判定和第2个判定都为“真”) = {(A > 1) and (B = 0)} and {(A = 2) or (X/A> 1)} = (A > 1) and (B = 0) and (A = 2) or (A > 1) and (B = 0) and (X/A > 1) = {(A = 2) and (B = 0)}or {(A > 1) and (B = 0) and (X/A > 1)} L2 ( a b  d )(第1个判定和第2个判定都为“假”) = not{(A > 1) and (B = 0)}and not{(A = 2) or (X > 1)} = { not (A > 1) or not (B = 0) } and { not (A = 2) and not (X>1) } ={not (A > 1) and not (A = 2) and not (X > 1) } or {not (B = 0) andnot (A = 2) and not (X > 1)}

  10. 被测程序中每条路径的逻辑表达式 L3 ( a b e)(第1个判定为“假”,第2个判定为“真”) = not {(A > 1) and (B = 0)} and {(A = 2) or (X> 1)} = { not (A > 1) or not (B = 0)} and {(A = 2) or (X > 1)} = {not (A > 1) and (A = 2)}or{not ( A> 1) and(X > 1)}or {not (B = 0) and (A = 2)} or{not(B=0) and (X>1)} L4 ( a c  d ) (第1个判定为“真”,第2个判定为“假”) = {(A > 1) and (B = 0)}and not{(A = 2) or (X/A > 1)} = (A > 1) and (B = 0) and not (A = 2) andnot (X/A > 1) 为什么?

  11. 确定测试用例的格式 • 【输入的(A, B, X),预期输出的(A, B, X)】 • 如【(2, 0, 4),(2, 0, 3)】 • 注意:在设计测试用例之前,必须首先确定测试用例的格式!

  12. 语句覆盖 • 每个语句至少执行一次; • 为图例设计满足语句覆盖的测试用例是:【(2, 0, 4),(2, 0, 3)】 • 语句覆盖是最弱的覆盖;

  13. 判定覆盖 • 不但每个语句都要执行,且每个判定的取真分支和取假分支都至少执行一次; • 覆盖程序的每条分支; 【(2, 0, 4),(2, 0, 3)】覆盖ace【L1】【(1, 1, 1),(1, 1, 1)】覆盖abd【L2】 【(2, 1, 1),(2, 1, 2)】覆盖abe【L3】【(3, 0, 3),(3, 1, 1)】覆盖acd【L4】 • 判定覆盖仍是较弱的逻辑覆盖 测试用例1 测试用例2

  14. 条件覆盖 • 设计若干个测试用例,运行被测程序,使得每个判定中的每个条件的可能取值都要至少执行一次; • 对于第1个判断: 条件A>1取真为 ,取假为 条件B=0取真为 ,取假为 • 对于第2个判断: 条件A=2取真为 ,取假为 条件X>1取真为 ,取假为 T4

  15. 条件覆盖 为什么? 测试用例覆盖分支条件取值 【(2, 0, 4),(2, 0, 3)】 L1(c, e) 【(1, 1, 1),(1, 1, 1)】 L2(b, d) 【(3, 1, 2),(3, 1, 3)】 L3(b, e) • 需要注意的是,在测试用例中可能有些条件取值在执行时覆盖不到,需要增加测试用例。  

  16. 判定-条件覆盖 • 设计足够多的测试用例,使得每个条件的可能取值至少执行一次,且每个判定中的每条分支也至少执行一次。 • 既满足判定覆盖,又满足条件覆盖; 测试用例覆盖分支条件取值 【(2, 0, 4),(2, 0, 3)】L1(c, e) 【(1, 1, 1),(1, 1, 1)】L2(b, d) 【(3, 1, 2),(3, 1, 3)】L3(b, e)  

  17. 条件组合覆盖 • 每个判定的所有条件的可能组合都至少执行一次。 记 ① A>1, B=0 作 ② A>1, B≠0 作 ③ A≯1, B=0 作 ④ A≯1, B≠0 作 ⑤ A=2, X>1 作 ⑥ A=2, X≯1 作 ⑦ A≠2, X>1 作 ⑧ A≠2, X≯1 作

  18. 条件组合覆盖 测试用例覆盖条件覆盖组合 【(2, 0, 4), (2, 0, 3)】(L1) ①, ⑤ 【(2, 1, 1), (2, 1, 2)】(L3) ②, ⑥ 【(1, 0, 3), (1, 0, 4)】(L3) ③, ⑦ 【(1, 1, 1), (1, 1, 1)】(L2) ④, ⑧    

  19. 条件组合覆盖 • 前述几种逻辑覆盖中,条件组合覆盖的标准最强; • 但满足条件组合覆盖的并不一定满足路径覆盖;

  20. 点覆盖 • 选取足够多的测试数据,使得程序执行路径至少经过流图的每个结点一次; • 它和语句覆盖的标准是相同的;

  21. 边覆盖 • 选取足够多的测试数据,使得程序执行路径至少经过流图的每个边一次; • 通常,它和判定覆盖的标准是相同的; 什么时候不同

  22. a b c d e f a b x y 边覆盖 • 当程序结构中判定中仅包含1个条件,此时,边覆盖标准和判定覆盖标准一致! • 当程序结构中判定中包含多个条件,此时,边覆盖标准和判定覆盖标准不一致! T T

  23. 路径覆盖 • 选取足够多的测试数据,使得程序的每条可能的执行路径至少执行一次; 测试用例通过路径覆盖条件 【(2, 0, 4), (2, 0, 3)】 ace (L1) 【(1, 1, 1), (1, 1, 1)】 abd(L2) 【(1, 1, 2), (1, 1, 3)】 abe(L3) 【(3, 0, 3), (3, 0, 1)】 acd(L4)   

  24. 判定结构测试 • 当程序中判定多于一个时,形成的分支结构可以分为两类:嵌套型分支结构和连锁型分支结构。 • 对于嵌套型分支结构,若有 n个判定语句,则存在 n+1条路径,需要 n+1 个测试用例; • 对于连锁型分支结构, 若有 n个判定语句,则存在2n条路径,需要2n 个测试用例,覆盖所有的路径。

  25. p1 p1 s2 s1 p2 p3 p2 s4 s3 s1 s4 s2 s3 p3 s6 s5 3个判定,故需要4个用例 3个判定,故需要8个用例 F T F T T F 连锁型分支结构 嵌套型分支结构

  26. 连锁型的测试方法 • 对于连锁型分支结构,当 n较大时将无法测试,测试路径非线性递增。 • 为减少测试用例的数目,可采用试验设计法,抽取部分路径进行测试。 • 在假定各条路径的重要性相同,或暂不明确各条路径的重要性的情况下可以做到均匀抽样。 • 如果明确了各条路径的重要性,还可以采取加权的办法,筛选掉部分路径,再用如下的措施进行抽样。

  27. 连锁型的测试方法 • 设连锁型分支结构中有n 个判定,计算满足关系式n+1≤2m的最小自然数m; • 设t = 2m,取正交表Lt,并利用它设计测试数据。 • 例如,一个连锁型分支结构中有三个判定语句p1,p2,p3。全部路径是23=8条。先计算3+1≤2m = t 的 t,得 t = 4。取正交表L4,把每一列当做一个判定,每一行当做可取的测试用例,可得4个测试用例。

  28. 用例 p1 p2 p3 路 径 s1 – s3 – s5 s2 – s3 – s6 s1 – s4 – s6 s2 – s4 – s5 1 2 3 4 s1 s3 s5 s2 s3 s6 s1 s4 s6 s2 s4 s5 • 用各个判定的取假分支取代正交表L4中的“0”,用取真分支取代正交表中的“1”,就建立起一个测试路径矩阵。这样,测试路径数目从23=8条减少到3+1=4条。 判定 L4 1 2 3 1 2 3 4 0 0 0 1 0 1 0 1 1 1 1 0 正交表L4 测试路径矩阵 测试用例

  29. p1 p1 p1 p1 s2 s2 s1 s1 p2 p2 p2 p2 s4 s4 s3 s3 p3 p3 p3 p3 s6 s6 s5 s5 用例1 用例2 用例3 用例4

  30. 循环结构测试 • 循环分为4种不同类型:简单循环、连锁循环、嵌套循环和非结构循环。 (1) 简单循环 ① 零次循环:从循环入口到出口② 一次循环:检查循环初始值③ 二次循环:检查2次循环④ m次循环: 检查在多次循环、最大次数循环、比最大次数多一次、少一次的循环。

  31. 嵌套循环 连锁循环 简单循环 避免出现 非结构循环

  32. k = i ; j = i+1; a c j <= n? f b e A[j]<A[k]? d k = j j++ 简单循环设计测试用例的例子:求最小值 程序代码如下: k = i; for ( j = i+1; j <= n; j++ ) if ( A[j] < A[k] ) k = j; 为什么是简单循环? 程序流程图

  33. 测试用例选择 不执行循环体 什么含义?

  34. (2) 嵌套循环 ①对最内层循环做简单循环的全部测试。此时,所有其他层的循环变量置为最小值; ②逐步外推,对其外面一层循环进行简单循环测试。测试时保持所有外层循环的循环变量取最小值,所有其他嵌套内层循环的循环变量取“典型”值。 ③反复进行,直到所有各层循环测试完毕。 ④对全部各层循环同时取最小循环次数,或者同时取最大循环次数。

  35. (3) 连锁循环如果各个循环互相独立,则可以用与简单循环相同的方法进行测试。 如果几个循环不是互相独立的,则需要使用测试嵌套循环的办法来处理。 (4) 非结构循环这一类循环应该使用结构化程序设计方法重新设计测试用例。

  36. 基本路径测试(非常重要) • 基本路径测试方法把覆盖的路径数压缩到一定限度内,程序中的循环体最多只执行一次。它的实现有如下步骤: • 根据过程设计结果画出相应的程序流图,并计算其环行复杂度; • 确定线性独立路径的基本集合; • 设计可强制执行的基本集合中每条路径的测试用例;

  37. switch 多分支 选择结构 do-while 后判断 重复结构 while-do 先判断 重复结构 IF 两分支 选择结构 顺序结构 程序流图复习 • 符号○为控制流图的一个结点,表示一个或多个无分支的PDL语句或源程序语句。箭头为边,表示控制流的方向。 • 在选择或多分支结构中,分支的汇聚处应有一个汇聚结点。

  38. a b x y 程序流图复习 • 边和结点圈定的部分叫做区域,当对区域计数时,图形外的区域也应记为一个区域。 • 如果判断中的条件表达式是由一个或多个逻辑运算符(or, and, ...)连接的复合条件表达式,则需改为 一系列只有单个条件的嵌套的判断。 T if (a or b) then do x else do y; T

  39. 1 1 2,3 2 6 4,5 3 8 6 7 4 R1 R3 7 8 R2 5 9 9 10 10 R4 11 11 Step1:设计被测对象的程序流图

  40. Step2:确定基本路径集合 • 程序环路复杂性给出了程序基本路径集中的独立路径条数,这是确保程序中每个可执行语句至少执行一次所必需的测试用例数目的上界。 • 从控制流图来看,一条独立路径是至少包含有一条在其他独立路径中从未有过的边的路径。 • 例如,在图示的控制流图中,一组独立的路径是path1:1 - 11path2:1 - 2 - 3 - 4 - 5 - 10 - 1 - 11path3:1 - 2 - 3 - 6 - 8 - 9 - 10 - 1 - 11path4:1 - 2 - 3 - 6 - 7 - 9 - 10 - 1 - 11 • 路径 path1,path2,path3,path4组成了控制流图的一个基本路径集。

  41. Step3:导出测试用例 • 导出测试用例,确保基本路径集中的每一条路径的执行。(必须全部覆盖) • 根据判断结点给出的条件,选择适当的数据以保证某一条路径可以被测试到 — 用逻辑覆盖的方法。 • 每个测试用例执行之后,与预期结果进行比较。 • 必须注意,一些独立的路径(如例中的path1),往往不是完全孤立的,有时它是程序正常的控制流的一部分,这时,这些路径的测试可以是另一条路径测试的一部分。

  42. 1 2 3 4 10 5 12 11 6 8 7 13 9 基本路径测试举例1 • 课本P156求平均值的例子。 1: i=1; total.input = total.valid = 0; sum = 0; 2: Do While value[i] <>-999 3: and total.input<100 4: increment total.input by 1; 5: if value[i]>=minmum 6: and value[i]<=maximum 7: then increment total.valid by 1; sum = sum + value[i]; 8: endif; increment i by 1; 9: EndDo 10: if total.valid >0 11: then avarage = sum / total.valid; 12: else avarage = -999; 13: endif End avarage

  43. 1 2 3 4 10 5 12 11 6 8 7 13 9 画出程序流图并计算复杂度 区域数目:6 判定结点:5,5+1 = 6 E-N+2=17-13+2=6 区域2 区域3 区域5 区域4 区域6 区域1

  44. 确定线性独立路径的基本集合 • 路径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-… • 路径5:1-2-3-4-5-6-8-9-2-… • 路径6:1-2-3-4-5-6-7-8-9-2-… 此外,判定结点是2、3、5、6、10

  45. 确定独立路径集合 • 为每一条路径都设置它的测试用例; • 选取测试数据使得在测试每条路径时都适当地设置好了各个判定结点的条件;

  46. 设计测试用例 • 测试用例由两部分组成; • 执行完所有测试用例后,可以确保程序中所有的语句都至少被执行了一次,而且每个条件都分别取过真和假;

  47. 设计测试用例 • 路径1的测试用例: value[k] = 有效输入值,其中k<i value[i]=-999,其中2<=i<=100 • 预期结果:基于k的正确平均值和总数 • 注意:由于路径10-11-13是计算正确的平均值和总数,所以,路径1无法独立测试,必须作为路径4、5、6的一部分来测试。

  48. 设计测试用例 • 路径2的测试用例 value[1] = -999 • 预期结果:avarage = -999,其他都保持初始值

  49. 设计测试用例 • 路径3的测试用例 试图处理101个或更多个值 前100个数值应该是有效输入值 • 预期结果:前100个数的平均值,总数为100 • 注意:和路径1同理,路径3无法独立测试,必须作为路径4、5、6的一部分来测试。

  50. 设计测试用例 • 路径4的测试用例 value[i] = 有效输入值,其中i<100 value[k] < minmum,其中k<i • 预期结果:基于k的正确平均值和总数

More Related