软考-软件设计师:软件工程-测试方法(测试分类):静态测试、动态测试、黑盒测试法、白盒测试 作者:马育民 • 2025-04-18 22:32 • 阅读:10003 >273页 # 测试方法分类 软件测试方法分为: - 静态测试 - 动态测试 # 静态测试 采用人工检测,计算机辅助静态分析 - 桌前检查(现场检查) - 代码审查(SVN服务器) - 代码走查(边走代码边检查) - 计算机辅助静态分析。利用静态分析工具对被测试程序进行特性分析,检查程序逻辑的各种缺陷和可疑的程序构造。 # 动态测试 通过运行程序发现错误 - 黑盒测试法(测试功能) - 白盒测试法(测试结构) - 灰盒测试法(黑白结合) # 黑盒测试 黑盒测试也称为 **功能测试**,在完全 **不考虑 软件的内部结构和特性** 的情况下,测试软件的外部特性。 为了发现以下几类错误: - 是否有错误的功能或遗漏的功能? - 界面是否有误?输入是否正确接收?输出是否正确? - 是否有数据结构或外部数据库访问错误? - 性能是否能够接受? - 是否有初始化或终止性错误? ### 常用的技术 - **等价类划分** - **边界值分析** - 错误推测 - 因果图 # 黑盒测试 - 等价类划分 将程序的 **输入域划分为若干等价类**,然后从每个等价类中选取一个 **代表性数据** 作为测试用例。 >输入域:输入数据 ### 有效等价类 和 无效等价类 等价类划分有两种不同的情况: - 有效等价类,即:满足需求、合理的数据 - 无效等价类,即:不满足需求、不合理的数据 ### 等价类划分原则 - 在输入条件规定了 **取值范围** 或 **值的个数** 的情况下,可以定义一个有效等价类和两个无效等价类。 - 在输入条件规定了 **输入值的集合** 或规定了 `必须如何` 的条件的情况下,可以定义一个有效等价类和一个无效等价类。 - 在输入条件是一个 **布尔值** 的情况下,可以定义一个有效等价类和一个无效等价类。 - 在规定了输入数据的 **一组值(假定 n个)**,并且程序要对每一个输入值 **分别处理** 的情况下,可以定义n个有效等价类和一个无效等价类。 - 在规定了输入数据必须 **遵守的规则** 的情况下,可以定义一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则)。 - 在确知已划分的等价类中,各元素在程序处理中的方式不同的情况下,则应将该等价类进一步 **划分为更小** 的等价类。 ### 设计测试用例 设计一个新的测试用例时,根据 **等价类** 分下面两种情况: - 使其尽可能多地 **覆盖尚未覆盖的 有效等价类**,不断重复,最后使得所有有效等价类 **均被测试用例覆盖**。 - 使其只 **覆盖一个 无效等价类**。 # 黑盒测试 - 边界值分析 输入的 **边界值** 比中间值更加 **容易发生错误** 边界值划分选择 **等价类边界** 的测试用例,既注重于 **输入条件边界**,又适用于 **输出域测试用例**。 > 输出域:输出值 ### 测试用例原则 - 如果输入条件规定了 **值的范围**,则应取刚达到这个 **范围的边界的值**,以及刚刚超越这个范围边界的值作为测试输入数据。 - 如果输入条件规定了 **值的个数**,则用 **最大个数、最小个数、比最小个数少1、比最大个数多1的数据** 作为测试数据。 - 根据规格说明的每个 **输出条件 使用上述两条原则**。 - 如果程序的规格说明给出的输入域或输出域是有序集合,则应选取 **集合 的第一个元素** 和 **最后一个元素** 作为测试用例。 - 如果程序中使用了一个 **内部数据结构**,则应当选择这个内部数据结构 **边界上的值** 作为测试用例。 - 分析规格说明,找出其他 **可能的边界条件**。 # 黑盒测试法 - 例子 例:小张帮朋友开发一个成绩分级程序,功能是这样的: 90-100分:优;80-89分:良;70-79分:中;60-69分:及格;0-59分:不及格。 对此,我们若采用等价类划分以及边界值分析,应该如何设计测试用例? #### 答案 等价类划分:-1,50,100,110 边界值分析:101,90-100;80-89;70-79;60-69;0-59,-1 # 白盒测试 白盒测试也称为 `结构测试`,根据程序的内部结构和逻辑来设计测试用例,对程序的路径和过程进行测试,检查是否满足设计的需要。 ### 常用的技术 - **基本路径测试** - **循环覆盖测试** - **逻辑覆盖测试** # 白盒测试 - 逻辑覆盖 逻辑覆盖考察用 **测试数据** 运行被测程序时,**对程序逻辑的覆盖程度** ### 分类 有下面程序: ``` int a = 10; int b = 1; int c = 0; if( a>0 && b >0){ c= c/a } if(a>1 || c>1){ c = c + 1 } c = b + c ``` 概念: - 判定表达式:`a>0 && b >0` - 判定条件:`a>0` 或 `b >0` 流程图如下: [](https://www.malaoshi.top/upload/0/0/1GWyJtE8yL5.png) #### 语句覆盖 使被测试程序中的 **每条语句至少执行一次** [](https://www.malaoshi.top/upload/0/0/1GWyLIpTVOW.png) 当 `a=2,b=1,c=6` 时,就能执行所有的语句 **缺点:** **无法对条件进行测试**,对程序执行逻辑的覆盖很低,很弱的逻辑覆盖 如:没有测试 `a>0 and b>0` 为 `假` 或 `a>1 and c>1` 为 `假` 的情况 #### 判定覆盖(分支覆盖) 使得被测程序中的 **每个判定表达式至少获得一次 `真` 值和 `假` 值**,或者 **说是程序中的每一个取 `真` 分支和取 `假` 分支至少都通过一次**。 [](https://www.malaoshi.top/upload/0/0/1GWyLMS1rIg.png) **优点:**比语句覆盖更强一些 如: - `a=2,b=1,c=6` 可覆盖判断M的Y分支,判断Q的Y分支 - `a=0,b=0,c=0` 可覆盖判断M的N分支,判断Q的N分支 **缺点:**由 **多个条件** 组成的判定来讲,容易 **忽略某个条件的取值** 情况。 如: - 没有覆盖 判断M的 Y 分支,判断Q的 N 分支,如:`a=2,b=1,c=0` - 没有覆盖 判断M的 N 分支,判断Q的 Y 分支,如:`a=2,b=0,c=2` #### 条件覆盖 使得每一判定语句中 **每个逻辑条件** 的各种可能的值 **至少满足一次**。 [](https://www.malaoshi.top/upload/0/0/1GWyLRtlFZr.png) **优点:**测试每个逻辑条件。 如:`a>0 and b>0`,分别测试各个条件可能的值: - `a>0` 为 `假` , `b>0` 为 `真`,此时判定表达式为 `假` - `a>0` 为 `真` , `b>0` 为 `假`,此时判定表达式为 `假` **缺点:**没有测试 **整个判定表达式** 可能的值。如上面,没有测试 `a>0 and b>0` 为 `真` 的情况 #### 判定/条件覆盖 使得判定中 **每个条件** 的所有可能取值(真/假)至少出现一次,并使每个判定本身的 **判定结果(真/假)** 也至少出现一次。 [](https://www.malaoshi.top/upload/0/0/1GWyLW3iXn0.png) **优点:**能同时满足判定,条件两种覆盖标准 **缺点:**未考虑条件的组合 #### 条件组合覆盖 使得每个判定中条件的 **各种可能值的组合** 都至少出现一次。 **理解:** 与 `判定/条件覆盖` 类似,但是测试用例更多,将各钟 判断条件的情况都测试一遍 如:`a>0 and b>0` ,分别测试: - `a>0` 为 `假` , `b>0` 为 `真` - `a>0` 为 `真` , `b>0` 为 `假` - `a>0` 为 `真` , `b>0` 为 `真` - `a>0` 为 `假` , `b>0` 为 `假`,因为是 `逻辑与`,有一个为假就为假,所以没必要测试这种情况 **优点:**满足条件组合覆盖的测试用例,是一定 **满足 判定覆盖、条件覆盖和判定/条件覆盖**的。 **缺点:**线性地增加了测试用例的数量 #### 路径覆盖 路径覆盖是指覆盖被测试程序中 **所有可能的路径**。 [](https://www.malaoshi.top/upload/0/0/1GWyM63T3hH.png) 优点:这种测试方法可以对程序进行彻底的测试,比前面五种的覆盖面都要广 缺点:需要涉及大量,复杂的测试用例,使得工作量呈指数级增长,不见得把所有的条件组合都覆盖 # 题 用白盒测试方法对如下图所示的流程图进行测试。若要满足分支覆盖,则至少需要( )个测试用例,正确的测试用例对是( ) (测试用例的格式为(A,B,X;X)) [](https://www.malaoshi.top/upload/0/0/1GWyMVwJg95.png) A、1 B、2 C、3 D、4 A、`(1,3,3; 3)` 和 `(5,2, 15; 3)` B、`(1,1,5;5)` 和 `(5,2,20;9)` C、`(2,3,10;5)` 和 `(5,2,18;3)` D、`(5,2,16; 3)` 和 `(5,2,21; 9)` ### 分析 格式为(A,B,X;X),`;`前面表示输入,`;`后面表示输出结果,所以: - `A`、`B`、`X;` 是输入 - `;X` 是输出结果 ### 第一问分析 程序有 `2个判定表达式`,所以需要 `2个测试用例`,才能判断出 `2个判定表达式` 分别为 `真` 和 `假` 的情况 **技巧:**从第2问也能知道需要2个测试用例 ### 第二问分析 将各个选项的 `值1`、`值2` 代入 `程序流程图`,让两个 `判定表达式` 的结果不同,如果相同没有意义 A选项不正确: - 将 `(1,3,3; 3)` 代入流程图,第1个 `判定表达式` 为 `真`;第2个 `判定表达式` 为 `假`; - 将 `(5,2, 15; 3)` 代入流程图,第1个 `判定表达式` 为 `真`,与第1个值的第1个 `判定表达式` 结果相同,没有意义 B选项正确: - 将 `(1,1,5;5)` 代入流程图,第1个 `判定表达式` 为 `假`;第2个 `判定表达式` 为 `假`;结果为 `5` - 将 `(5,2,20;9)` 代入流程图,第1个 `判定表达式` 为 `真`;第2个 `判定表达式` 为 `假`;结果为 `9` C选项正确: - 将 `(2,3,10;5)` 代入流程图,第1个 `判定表达式` 为 `真`;第2个 `判定表达式` 为 `假`;结果为 `5` - 将 `(5,2,18;3)` 代入流程图,第1个 `判定表达式` 为 `真`;第2个 `判定表达式` 为 `假`,与第1个值的第2个 `判定表达式` 相同,没有意义 D选项错: - 将 `(5,2,16; 3)` 代入流程图,第1个 `判定表达式` 为 `真`;第2个 `判定表达式` 为 `假`;结果为 `3` - 将 `(5,2,21; 9)` 代入流程图,第1个 `判定表达式` 为 `真`,与第1个值的第1个 `判定表达式` 相同,没有意义 **技巧:**先将各个选项的第1个值代入,基本能够排除几个选项,此时再决定是否代入各个选项的第2个值 ### 答案 B 参考: https://blog.csdn.net/weixin_41043607/article/details/107348483 原文出处:http://malaoshi.top/show_1GWyM8HuUHO.html