有判断的程序,里面有好几条路径。**未测试的分支(untested branch)**是你的测试数据从未走过的路径。错误常常藏在那里,因为里面的代码从来没有运行过。
这是验证、核实与测试单元的最后一课,接在预测预期结果之后。
怎样列出分支?
对每个 IF,写出每一条路径,再给每条路径写上会走到那里的条件。以三路等级规则为例:
| 分支 | 到达它的条件 |
|---|---|
| A | Score >= 80 |
| B | Score < 80 且 Score >= 50 |
| C | Score < 50 |
分支 C 在代码里没有写出条件。它在前两个条件都为 FALSE 时才运行,所以你得自己算出对应的输入。
例题
一个虚构的程序应该对 80 或以上给 A,50 到 79 给 B,低于 50 给 C。
INPUT Score
IF Score >= 80 THEN
Grade ← "A"
ELSE
IF Score >= 50 THEN
Grade ← "B"
ELSE
Result ← "C"
ENDIF
ENDIF
OUTPUT Grade
测试员运行了两个测试:Score = 85 和 Score = 70。
**第 1 步,追踪 Score = 85。**85 >= 80 为 TRUE,所以 Grade ← “A”。输出:A。预期 A。**通过。**这到达了分支 A。
**第 2 步,追踪 Score = 70。**70 >= 80 为 FALSE,接着 70 >= 50 为 TRUE,所以 Grade ← “B”。输出:B。预期 B。**通过。**这到达了分支 B。
第 3 步,标记表格。
| 分支 | 被测试到达? |
|---|---|
| A | 是(85) |
| B | 是(70) |
| C | 否 |
**第 4 步,为分支 C 补一个测试。**选 Score = 40。40 >= 80 为 FALSE,40 >= 50 也是 FALSE,所以分支 C 运行。那一行是 Result ← "C",Grade 始终没有被赋值,输出为空或未定义。预期 C。失败。
在缺漏的分支被测试之前,这个错误完全看不见。那一行应该是 Grade ← "C"。
然后再加上边界测试 80、79、50 和 49,检查比较条件。它们应该依次得到 A、B、B 和 C。
要小心的错误
错误的结论:“两个测试都通过了,所以程序没问题。”
学生只看了结果,没有看测试到达了哪些代码。
通过的测试只能告诉你它走过的那条路径。下结论之前,先数分支,再数你的测试覆盖了几条路径。如果数字不同,程序就还没有被完整测试。
自我检测
1. 一个 IF 带有一个 ELSE IF 和最后的 ELSE。一共有几个分支?
Show answer
三个:IF 分支、ELSE IF 分支和 ELSE 分支。
2. 在等级程序中,哪个测试值会到达分支 C?
Show answer
任何低于 50 的分数,例如 40 或 0。边界选择是 49。
3. 测试只有 90 和 95。哪些分支没有被测试?
Show answer
两个测试都到达分支 A。分支 B 和 C 没有被测试。
接下来学什么?
用综合练习测试你对整个单元的掌握。想回到单元的起点,请看选择验证规则。受限伪代码追踪训练器很适合用来追踪每一个分支。
如果你想要帮助建立完整的测试计划,这正是我们在一对一线上计算机科学补习中会帮你处理的。