测试用例(test case)是一个输入、你预期的输出,以及把两者与某条要求联系起来的理由。有了理由,一个数字才成为证据。题目可能要求你选择测试数据、说出数据类型,或解释为什么选某个值。
这一课属于解题说明单元。它运用了验证、核实与测试中的正常、边界和无效数据概念,也与说明变量的用途相连。
怎样为测试用例找理由?
分三步。
- 慢慢读要求。 在界限和决定界限的词下面画线:“从 0 到 20”包含两端,“超过 100”不包含 100。
- 按类型选值。 选一个正常值、每个界限上的值、每个界限外紧挨的值,必要时再加一个类型错误的值。
- 写出输入、预期结果和理由。 理由要指出被检验的是要求的哪一部分。
可以用这个句式:“这个测试检验 ___,因为要求说 ___,所以程序应该 ___。”
例题
要求:测验分数必须是 0 到 20(含)的整数。有效分数被接受,其他的被拒绝。
| 测试数据 | 类型 | 预期 | 理由 |
|---|---|---|---|
| 10 | 正常 | 接受 | 范围内的典型值。 |
| 0 | 边界 | 接受 | “从 0”包含下限,所以 0 必须通过。 |
| 20 | 边界 | 接受 | “到 20(含)”包含上限。 |
| −1 | 边界,无效 | 拒绝 | 比下限小 1,检验下限的判断是否太宽松。 |
| 21 | 边界,无效 | 拒绝 | 比上限大 1,检验上限的判断是否太宽松。 |
| “abc” | 类型无效 | 拒绝 | 要求说整数,所以文字不能被接受。 |
用错误的规则检验逻辑。 假设代码在 Score > 0 AND Score < 20 时接受。那么 0 和 20 会被拒绝,与表格矛盾。边界行 0 和 20 暴露了错误;只用正常值 10 会通过,错误就被掩盖。
要提防的错误
不好的计划是这样的:
测试数据: 5、10、15。理由: 检查它能不能用。
三个值都是正常值,所以发现不了错误的比较。“检查它能不能用”也没有提到要求。
改正:保留一个正常值,加上 0、20、−1 和 21,并给每个值一个引用规则的理由,例如“20 检验上限是否包含在内”。
自我检测
1. 要求:密码长度必须是 8 到 12 个字符。给出四个测试长度,并为每个写出理由。
显示答案
- 8 个字符: 边界,接受,因为规则包含下限 8。
- 7 个字符: 边界,拒绝,因为刚好低于下限。
- 12 个字符: 边界,接受,因为规则包含上限 12。
- 13 个字符: 边界,拒绝,因为刚好高于上限。
还可以加上第五个正常长度,例如 10。
2. 要求:订单总额超过 RM100 时给折扣。为什么测试 RM100 有用?预期结果是什么?
显示答案
“超过 RM100”表示严格大于 100,所以 RM100 本身没有折扣。测试 RM100 可以看出程序是否错用了 >= 而不是 >。第二个测试 RM101 应该得到折扣。
3. 某个测试计划对于规则“年龄从 12 到 18”只用了 4、9 和 14。缺了什么?
显示答案
缺少边界数据(12 和 18),也缺少刚好在规则之外的值(11 和 19)。只有 14 在范围内,4 和 9 都离范围很远,所以这个计划完全没有测试界限。应加上 12、18、11 和 19,并写出理由。
接下来学什么
测试失败之后,你需要说明如何修正错误。这是描述修正,而不只是写出代码这一课的技能。安全的 Python 推理沙盒可以让你对自己的规则运行小型测试。
如果你的测试值合理,但理由总是含糊,我们的老师可以在线上一对一计算机科学补习中和你一起整理。