这套练习涵盖整个验证、核实与测试单元:选择验证检查、区分 validation 与 verification、设计测试数据、通过追踪预测结果,以及找出未测试的分支。所有情境都是虚构的。
题目由易到难。先写出你的答案,再打开解答。受限伪代码追踪训练器可帮助做追踪题,错误记录与重测队列则是记录失误的地方。
题目
1. 表格写着:“用户名必须是 6 到 12 个字符。“请说出验证检查的名称。
Show answer
长度检查(length check)。它数字符个数,最少 6,最多 12。
2. 一个网站要求用户输入两次电子邮件地址并比较两者。这是验证还是核实?说出方法。
Show answer
核实(verification),方法是重复输入(double entry)。程序比较两份内容,确认用户输入了想输入的内容。
3. 产品代码必须是三个字母加两个数字,例如 ABC12。请说出检查名称。XYZ99 能通过吗?AB123 呢?
Show answer
格式检查(format check)。XYZ99 能通过,因为是三个字母加两个数字。AB123 不能通过,因为是两个字母加三个数字。
4. 范围检查接受 13 到 17 岁。一位成员的真实年龄是 15,却输入了 14。会被接受吗?什么能抓出这个错误?
Show answer
会,14 被接受,因为 13 <= 14 <= 17。验证不知道真实年龄。核实,例如重复输入或与来源进行目视检查,可以抓出这个错误。
5. 规则写着:“百分比必须是 0 到 100(含)的整数。“请完成测试表,列出正常、边界和无效数据,以及各自的预期结果。
Show answer
| 类型 | 测试值 | 预期结果 |
|---|---|---|
| 正常 | 55 | 接受 |
| 边界 | 0 | 接受 |
| 边界 | 100 | 接受 |
| 边界,紧贴界限之外 | -1 | 拒绝 |
| 边界,紧贴界限之外 | 101 | 拒绝 |
| 无效 | “fifty” | 拒绝 |
6. 追踪这个算法并写出输出。
X ← 3
Y ← 0
WHILE X > 0
Y ← Y + X
X ← X - 1
ENDWHILE
OUTPUT Y
Show answer
| 循环 | 之前的 X | 之后的 Y | 之后的 X |
|---|---|---|---|
| 1 | 3 | 3 | 2 |
| 2 | 2 | 5 | 1 |
| 3 | 1 | 6 | 0 |
此时 X > 0 为 FALSE,循环结束。输出是 6。
7. 这段代码应该接受 0 到 100(含)的百分比。第 5 题中哪些测试值会让它失败?为什么?
INPUT Percent
IF Percent > 0 AND Percent < 100 THEN
OUTPUT "Accepted"
ELSE
OUTPUT "Rejected"
ENDIF
Show answer
0 和 100 会失败。预期 Accepted,但 0 > 0 为 FALSE,100 < 100 为 FALSE,所以输出 “Rejected”。代码应该用 >= 和 <=。正常值 55 能通过,这就掩盖了错误。
8. 运行之前,用追踪表预测输出。输入是 5、12、10、20。
Count ← 0
FOR I ← 1 TO 4
INPUT Value
IF Value > 10 THEN
Count ← Count + 1
ENDIF
NEXT I
OUTPUT Count
Show answer
| I | Value | Value > 10 | Count |
|---|---|---|---|
| 1 | 5 | FALSE | 0 |
| 2 | 12 | TRUE | 1 |
| 3 | 10 | FALSE | 1 |
| 4 | 20 | TRUE | 2 |
输出是 2。10 并不大于 10。
9. 预测输入 150、-2、40 时的输出。
REPEAT
INPUT Mark
IF Mark < 0 OR Mark > 100 THEN
OUTPUT "Invalid"
ENDIF
UNTIL Mark >= 0 AND Mark <= 100
OUTPUT Mark
Show answer
150 > 100,所以输出 “Invalid”,循环继续。-2 < 0,再次输出 “Invalid”。40 通过两项检查,循环结束,输出 40。完整输出:Invalid、Invalid、40。
10. 一个票价程序规定:12 岁以下票价 5,12 到 59 岁票价 10,60 岁及以上票价 7。目前的测试使用年龄 8 和 30。哪个分支没有被测试?你会补什么测试?
INPUT Age
IF Age < 12 THEN
Price ← 5
ELSE
IF Age < 60 THEN
Price ← 10
ELSE
Price ← 7
ENDIF
ENDIF
OUTPUT Price
Show answer
年龄 8 到达第一个分支(票价 5),年龄 30 到达第二个分支(票价 10)。**60 岁及以上的 ELSE 分支没有被测试。**补上 Age = 60,预期票价 7。边界测试 11、12、59 和 60 应依次得到 5、10、10 和 7。
11. 写出伪代码,不断要求输入密码,直到密码至少有 8 个字符。然后说明为了核实还必须做什么。
Show answer
REPEAT
INPUT Password
IF LENGTH(Password) < 8 THEN
OUTPUT "At least 8 characters needed"
ENDIF
UNTIL LENGTH(Password) >= 8
这是长度检查,所以属于验证。要做核实,用户要再输入一次密码,程序比较两次输入。如果不同,就再次要求输入。
答错了怎么办?
| 失误 | 去看 |
|---|---|
| 说错检查名称,或混淆范围与长度 | 选择验证规则 |
| 写成验证能让数据变正确 | 核实与验证 |
| 漏掉边界,或只选正常数据 | 设计测试数据 |
| 追踪表得出错误的输出 | 说明预期结果 |
| 有分支从未运行却说程序已测试 | 找出未测试的分支 |
把每个失误记在错误记录与重测队列,几天后再做一次。如果某一类错误总是回来,那是值得带到一对一线上计算机科学补习的好话题。