软件工程——测试
单元测试 (白盒测试)
1模块接口:
内部检查:传输参数的数目、属性、单位、次序是否匹配;全程变量的定义是否一致;只做输入的变元有无被修改,等等
内部检查:打开、结束、关闭文件的操作;文件和属性;I\O错误处理;输出拼写,等等
2局部数据结构:
数据说明;初始化与缺省值的设置;变量名拼写;数据类型的相容性;上\下溢出及地址异常,等等。
3重要的执行通路:
由于穷尽测试的不可能,故通常针对最常见的错误设计测试方案。
较常见的错误有: 计算次序问题; 不同类型混合运算; 初值设置错误; 精度问题; 表达式错误 循环终止条件错误;
4出错处理通路:
预见出现错误的条件,设置处理。
较常见的问题有:
输出的错误信息难以理解,
不能确定错误位置
描述的错误与实际错误不符
处理之前系统已经干预
处理不正确
5边界条件——单元测试中最后,也可能是最重要的任务,因为软件常在其边界失效。
单元测试的主要手段:
1代码审查
走读 walk_through:
例如 Lucent Technologies 的测试策略,是由三人一组(包括author,reader,和recorder),逐行检查源代码。 预演由人扮演computer,模拟执行情况
优点:一次审查科发现多个错误,不必改一个测一个。
2制作测试软件:
Stub(存根)和Driver(驱动)软件的编写,属额外开支。模块高内聚可简化这一过程。
设计测试方案
任务:
1预定要测试的功能
2设计输入的测试数据
3列出预期结果
主要技术:
1逻辑覆盖(Logical coverage)——适用于白盒测试 覆盖程度由弱到强依次为:
(1)语句覆盖(Statement coverage):每个语句至少执行依次。
(2)判定覆盖(Branch coverage):再(1)的基础上,每个判定的每个分支至少执行依次。
(3)条件覆盖(Condition coverage):在(1)的基础上,使每个判定表达式的每个条件都取到各种可能的结果。
(4)判定/条件覆盖:即判定覆盖∩条件覆盖
(5)条件组合覆盖:每个判定表达式中条件的各种肯能组合都至少出现依次。
(6)点覆盖=语句覆盖
(7)边覆盖=判定覆盖
(8)路径覆盖(Path coverage):每条可能的路径都至少执行依次,若图中有环,则每个环至少经过依次。
(9)路径覆盖/条件组合覆盖
2等价划分(Equivalence Partitioning)——适用于黑盒测试
是一种很常用的测试方法。其对测试数据的选择是基于对程序功能的分析,按照程序输入要求和输出要求,选择若干数据进行测试功能的过程。
(1)划分经验
当规定了输入范围时:无效类【 有效类 】无效类 当规定了一组输入值,且对不同值做不同处理时。
例:教工分房方案中,按教授、副教授、讲师、助教分别计分=》有效类4个;无效类1个(4个有效类之外)
当规定了输入的规则时:例:PASCAL 语言规定,每个语言以“;”结束=》有效类1个;无效类若干(以“,”结束、以“:”结束、以空格结束等等)
当输入为整型时:有效类可分为Z+、0、Z- 三种
当处理表格时:有效类可分为空表、含一项的表、含多项的表等
(2)设计步骤
设计一个新方案以尽可能多地覆盖尚未被覆盖的有效等价类;重复这一步骤直到所有有效类都被覆盖为止。
设计一个新方案以覆盖一个且仅一个尚未被覆盖的无效等价类;重复这一步骤直到所有无效类都背覆盖为止。(通常程序执行一个错误后即不继续检查其他错误)
3边界值分析(Boundary Value Analysis)
注意: (1)程序最容易在边界发生错误; (2)通常与等价划分结合进行。
4错误推测(Failure Prediction)
思路: (1)列出可能有的错误; (2)列出容易发生错误的特殊情况。
以此为基础设计测试方案
根据:经验、直觉
5实用策略(Practical Strategies) 黑盒设计+白盒补充
(1)在任何情况下都应首先实用边界值分析的方法;
(2)必要时用等价划分法补充;
(3)必要时再用错误推测法补充;
(4)对照程序逻辑,检查测试方案。可根据对程序可靠性的要求采用不同的逻辑覆盖标准,必要时补充一些测试方案。
注:即使用上述综合策略设计测试方案,仍不能保证发现一切错误。例如Lucent公司经过包括逐行检查源代码在内的多方面测试之后,其软件能达标运行的成功率为 80%,可想而知,没有经过测试的软件运行成功率更低。