测试数据是你挑选来检查程序是否正常工作的一组输入。好的一组涵盖三种类型:正常、边界(boundary)和无效(invalid)。每个输入你还要根据需求,在程序运行之前写出预期结果。
这一课接在核实与验证之后,属于验证、核实与测试单元。
怎样建立测试表?
以这条需求为例:“接受 13 到 17(含)的整数年龄,其余全部拒绝。”
| 类型 | 含义 | 测试值 | 预期结果 |
|---|---|---|---|
| 正常 | 典型、被允许 | 15 | 接受 |
| 边界(被接受) | 正好在界限上 | 13、17 | 接受 |
| 边界(被拒绝) | 紧贴界限之外 | 12、18 | 拒绝 |
| 无效 | 类型错误或远超范围 | “abc”、-5、200 | 拒绝 |
为什么除了 13 和 17,还要选 12 和 18?因为边界错误就是数值落在界限哪一边的错误,只有两边都测试才能看出来。
例题
一位程序员写了下面的检查,它应该接受 13 到 17(含)的年龄。
INPUT Age
IF Age > 13 AND Age < 17 THEN
OUTPUT "Accepted"
ELSE
OUTPUT "Rejected"
ENDIF
**第 1 步,运行正常值。**Age = 15:15 > 13 为 TRUE,15 < 17 为 TRUE,输出 “Accepted”。预期:Accepted。通过。
第 2 步,运行被接受的边界值。
| Age | Age > 13 | Age < 17 | 输出 | 预期 | 结果 |
|---|---|---|---|---|---|
| 13 | FALSE | TRUE | Rejected | Accepted | 失败 |
| 17 | TRUE | FALSE | Rejected | Accepted | 失败 |
**第 3 步,运行被拒绝的边界值。**Age = 12:12 > 13 为 FALSE,所以 “Rejected”。Age = 18:18 < 17 为 FALSE,所以 “Rejected”。两者都与预期一致,通过。
**第 4 步,诊断。**正常值通过了,掩盖了错误。只有边界测试 13 和 17 失败。错误在于 > 和 < 应该是 >= 和 <=。
修正后的一行:
IF Age >= 13 AND Age <= 17 THEN
再次运行 13 和 17,现在输出 “Accepted”,与预期一致。
要小心的错误
**错误的测试表:**正常 14、15、16。预期:全部接受。
学生选了三个中间的值,所以没有任何值能暴露边界错误。
三个正常值几乎没有增加任何信息。把其中两个换成 13、17、12 和 18,再加一个像文字这样的无效值。每一行都应该有不同的目的。
自我检测
1. 规则写着:“数量必须是 1 到 10(含)。”请给出两个被接受的边界值,以及两个紧贴界限之外的被拒绝值。
显示答案
被接受的边界值:1 和 10。紧贴界限之外、被拒绝的值:0 和 11。
2. 对同一条规则,各给出一个正常值和一个无效值,并写出预期结果。
显示答案
正常:5,预期接受。无效:“five”(文字),预期拒绝。像 500 这样的值,也是用于测试拒绝的有效测试数据。
3. 代码是 IF Quantity > 1 AND Quantity <= 10 THEN OUTPUT "OK"。哪个测试值能暴露错误?程序会怎样?
显示答案
**1。**预期结果是接受,但 1 > 1 为 FALSE,所以程序不会输出 “OK”。第一个比较应该用 >=。
接下来学什么?
下一课练习在运行代码之前说明预期结果,这个习惯让测试表真正有意义。之后你会找出没有被任何测试执行到的分支。安全 Python 推理沙盒可以让你用表格测试这样的检查,综合练习则把所有内容放在一起测试。
如果你的测试表总是漏掉会暴露错误的值,一对一线上计算机科学补习的老师可以陪你逐行检查每个测试。