预期结果(expected result)是程序对给定输入应该输出的内容,在程序运行之前,根据需求或追踪算法算出。测试就是拿它来比较的。如果跳过这一步,错误的输出看起来也可能很合理。
这一课接在设计测试数据之后,属于验证、核实与测试单元。
怎样算出预期结果?
使用追踪表。把变量写成列,从初始值开始,按顺序跟着每一行走,并记录每一次变化。
如果需求是用文字给出的,你也可以直接从需求推理。无论哪种方法,都要先把预期值写下来。
例题
一位虚构的老师计算五个测验分数中有几个及格。及格分数是 50 或以上。
Total ← 0
FOR Count ← 1 TO 5
INPUT Mark
IF Mark >= 50 THEN
Total ← Total + 1
ENDIF
NEXT Count
OUTPUT Total
输入的五个分数是 62、48、50、91、49。
第 1 步,建立表格,列为 Count、Mark、Mark >= 50、Total。从 Total = 0 开始。
第 2 步,追踪每一次循环。
| Count | Mark | Mark >= 50 | Total |
|---|---|---|---|
| (开始) | 0 | ||
| 1 | 62 | TRUE | 1 |
| 2 | 48 | FALSE | 1 |
| 3 | 50 | TRUE | 2 |
| 4 | 91 | TRUE | 3 |
| 5 | 49 | FALSE | 3 |
**第 3 步,读出输出。**循环结束后,OUTPUT Total 给出 3。
**第 4 步,对照需求检查。**及格的分数是 62、50 和 91,共三个,所以代码与需求一致。
表中第 3 行很重要:Mark 是 50,而 >= 使它及格。这种边界值正是预测最容易出错的地方。
要小心的错误
错误的预测:“输出是 2,因为分数必须高于 50 才算及格。”
学生把
>=读成了>。
符号 >= 的意思是大于或等于,所以 50 及格。这位学生的表在第 3 行会写 FALSE,最后得到 2,预期结果就错了。看到比较符号要放慢,并念出来:“大于或等于”。
写下预测之后,再运行程序。如果它输出 3,测试通过。如果输出 2,你就发现了代码中的错误,因为你的预测来自需求。
自我检测
1. 追踪下面的算法,写出输出。
Sum ← 0
FOR N ← 1 TO 6
IF N MOD 2 = 0 THEN
Sum ← Sum + N
ENDIF
NEXT N
OUTPUT Sum
Show answer
N MOD 2 = 0 在 2、4、6 时为 TRUE。Sum 依次是 0、2、6、12。输出是 12。
2. 把分数 70、30、50 输入上面的及格计数算法,并把循环改为运行三次。预期输出是什么?
Show answer
70 及格,30 不及格,50 及格。输出是 2。
3. 一位学生对第 2 题预测为 5,理由是”有五个分数”。哪里出错了?
Show answer
他用了原程序的循环次数,并把每个分数都算进去,而不是只算及格的。这道题只有三个分数,其中只有两个满足 Mark >= 50。
接下来学什么?
下一课学习找出没有被任何测试执行到的分支。你可以在受限伪代码追踪训练器中练习追踪,综合练习则把追踪和测试设计结合在一起。
如果你的追踪在循环中卡住,这正是我们在一对一线上计算机科学补习中会帮你处理的。