第7章05 回归测试

7.1 本章定位

本章关注软件演化和维护阶段的测试问题:软件修改后,如何保证未改变代码的功能不受影响。主观题很适合给出“修改某模块/需求变更/修复 Bug”的场景,要求设计回归测试范围和用例选择策略。

7.2 回归测试定义

回归测试是在程序修改之后,在==保持原有测试覆盖==的前提下,对软件进行重新测试,以验证修改没有引入新的错误。

为什么需要回归测试:软件在演化与维护过程中发生修改,但未修改部分仍可能被影响

  • 软件在演化和维护中经常发生修改;
  • 修改可能破坏未改变代码的功能;
  • 回归测试是软件测试体系的必要组成部分;
  • 系统一旦经过修改,就需要进行回归测试。

7.3 回归测试与一般测试的不同

方面一般测试回归测试
测试计划面向当前版本测试任务可能面对修改过的规格说明、程序和旧测试计划
测试范围检测整个程序是否有缺陷检测被修改相关部分是否有缺陷
资源分配按测试任务安排根据具体修改情况安排
开发信息当前开发信息需要及时记录历史和变更信息
完成时间通常较长通常较短,可借助测试脚本
执行频率阶段性执行软件生命周期内多次执行,修改后即执行

7.4 回归测试过程

标准7步流程

  1. 提出修改需求
  2. 修改软件工件(代码/文档/模型)
  3. ==选择==和==生成==测试用例(T1 + T2)
  4. 执行测试
  5. 识别失败结果
  6. 确认错误
  7. 排除错误

课件在回归测试用例产生处给出:

  • 为测试新改变代码,生成新的测试用例 $T1$;
  • 对原有测试用例组进行有效性重确认 $T \rightarrow T0$;
  • 从 $T0$ 中选择部分测试用例 $T2$;
  • 执行测试用例组 $T1 + T2$;
  • 比较执行结果与预期结果。

7.5 回归测试策略

1.全部重新测试 Retest All

含义:重新执行之前所有测试用例。

优点:

  • 不需要花精力选择测试用例;
  • 当测试用例数量不多,或系统大部分发生改变时适用。

缺点:

  • 测试用例很多且改动很小时非常浪费。

2.选择性重新测试 Selective Retest

含义:选择和使用已有测试用例的一个子集重新测试。

优点:

  • 当测试用例很多且系统改变只涉及一部分时,可节省成本。

缺点:

  • 需要费精力对==测试用例进行选择==
  • 若选择不当,可能遗漏受影响功能。

选择时常用算法是选择与特定模块相关的所有测试用例,以及所有集成测试用例

7.6 测试用例选择与可追溯性

选择性回归测试需要依据可追溯性原则:

$$ 需求 \rightarrow 代码 \rightarrow 测试用例 $$

所有黑盒测试和白盒测试用例都应能追溯到相关需求、代码或变更点。

7.7 波及效应分析 REA

波及效应分析(Ripple Effect Analysis, REA)用于发现所有受影响部分,包括潜在受影响部分,以保证软件改变后仍保持一致性。

分析对象包括:

  1. 需求的波及效应分析;
  2. 设计的波及效应分析;
  3. 代码的波及效应分析;
  4. 测试用例的波及效应分析。

也需要跨阶段分析:从需求文档到设计文档,再到代码,最后到测试用例。

波及效应分析步骤

  1. 识别发生改变的部分;
  2. 识别潜在受影响组件;
  3. 决定这些潜在受影响组件中哪些需要改变;
  4. 迭代分析,直到不再有任何波及。

波及效应分类

类型含义
直接波及直接受初始改变影响的部分
诱发波及由直接波及或其他诱发波及继续引起的影响

直接波及是波及效应分析过程中要进行进一步改变的第一候选集。如果直接波及后不需要进一步的改变,那么诱发波及就不需要分析,以节省波及效应分析时间

课件提示:程序切片能自动化帮助识别潜在波及影响。

两种分析方法

① 字符串匹配(人工)

  • 基于关键词/引用关系
  • 不理解执行逻辑

② 程序切片(Program Slicing)(重点)

  • 可以分析:
    • 直接依赖
    • 间接依赖
  • 可自动化

==回归测试用例生成==

  • 为了测试那些新改变的代码,要生成新的测试用例T1;
  • 对原有的测试用例组进行有效性重确认T→ T0;并从中T0选择部分测试用例T2;
  • 执行测试用例组T1+ T2;
  • 比较测试用例的执行结果与预期结果;
  • 测试失败,查明导致失败的模块或修改。

7.8 自动化回归测试

回归测试频繁执行,测试用例数量大,适合使用自动化工具:

  • 自动执行测试脚本;
  • 自动比较实际结果和预期结果;
  • 帮助分析波及效应;
  • 降低重复测试成本。

但自动化不能替代测试选择和波及分析。

7.9 回归测试情景题答题模板

题目给出软件修改场景时:

  1. 明确修改类型:需求变更、缺陷修复、重构、环境变化等。
  2. 定位变更工件:需求、设计、代码、数据库、配置、接口。
  3. 做波及效应分析:列直接受影响模块和可能诱发影响模块。
  4. 选择策略:改动大或用例少,选全部重新测试;改动小且用例多,选选择性重新测试。
  5. 生成新用例 $T1$:覆盖新增或修改功能。
  6. 从旧用例中选 $T2$:覆盖受影响模块、接口和关键业务流程。
  7. 执行 $T1+T2$,记录失败并分析是否由修改引入。
  8. 必要时更新测试计划、测试用例和追溯关系。

常见扣分点:

  • 只测修改点,不测受影响模块;
  • 不说明选择测试用例的依据;
  • 忽略旧测试用例有效性重确认;
  • 不区分直接波及和诱发波及;
  • 没有写预期结果对比。

7.10 小测关联

第二次小测直接考查回归测试不多,但开发者测试章节已把回归测试列为 V 模型相关测试活动。期末更可能以场景题考选择性回归测试和波及效应分析。

7.11 本章复习检查题

填空题

  1. 回归测试策略主要包括________和________。
  2. 波及效应分析包括需求、设计、代码和________的波及效应分析。
  3. 回归测试用例组可以表示为新生成用例 $T1$ 加旧用例中选择出的________。

选择题

  1. 当测试用例数量很多且系统只发生小范围修改时,更适合:A. 全部重新测试 B. 选择性重新测试 C. 不测试 D. 只做代码审查
  2. 识别修改影响范围时最相关的是:A. 波及效应分析 B. Alpha 测试 C. 字体测试 D. 容量测试

判断题

  1. 回归测试只需要测试被修改的那一行代码。
  2. 程序切片可以辅助识别潜在波及影响。
  3. 全部重新测试一定总是最经济。

参考答案

  1. 填空:全部重新测试、有选择的重新测试;测试用例;$T2$。
  2. 选择:B;A。
  3. 判断:错;对;错。