要设计边界测试,先找出规则里的每一个边缘,列出每个边缘刚好低于、恰好在上面和刚好高于它的值,写下规则规定应该发生什么,然后才运行代码。这张表就是测试。代码是拿来和它对照的东西。
边界测试能抓到选择结构和循环中最常见的小错误。它也让你用证据,而不是凭感觉,判断修改是否成功。
为什么错误集中在边缘?
规则的大部分范围没有含糊之处。30 分不及格,90 分是 A,几乎不论代码怎么写都一样。“大于”与”大于或等于”之间的差别,只在那个确切的值上才显现。
所以用舒服的值做测试,代码错了也可能通过。bug 就藏在你没去看的那一个地方。
怎样设计测试
- 用简单的话写出规则,包括有效范围。
- 标出每个边缘,也就是结果改变的地方。
- 列出值:每个边缘刚好低于、恰好在上面和刚好高于它的值,再加一个普通的值。
- 先根据规则填好预期一栏,然后才运行任何东西。
- 运行代码,填上实际一栏。
- 修改代码,然后重新运行整张表,而不是只跑出错的那一行。
例题
规则:分数是 0 到 100。
80 分或以上得”A”。50 到 79 分得”Pass”。低于 50 分得”Fail”。
一位学生写的代码:
def grade(mark):
if mark > 80:
return "A"
elif mark > 50:
return "Pass"
else:
return "Fail"
边缘是 50 和 80。测试表:
| 分数 | 预期 | 实际 | 结果 |
|---|---|---|---|
| 0 | Fail | Fail | 正确 |
| 49 | Fail | Fail | 正确 |
| 50 | Pass | Fail | 错误 |
| 79 | Pass | Pass | 正确 |
| 80 | A | Pass | 错误 |
| 100 | A | A | 正确 |
两行出错,都刚好在边缘上。
两处的原因相同:> 应该是 >=。两处都改好之后,重新运行全部六行。现在应该全部吻合。
要留意的错误
有学生看到 50 分的结果不对,就改了那一行,只重新运行那一行。它通过了,学生就停下来。80 分那里的错误还在。
这个错误的第二种版本是只测试 30、65 和 90。这三个值在有问题的代码下全部通过,于是学生就下结论说代码没问题。
修正方法:从边缘选值,并在每次修改之后重新运行整张表。
自我检测
1. 规则写着”年龄未满 13 岁可购买儿童票”。哪些值能测试这个边缘?
显示答案
12(儿童)和 13(不是儿童),再加上 14 作为刚好高于边缘的值。边缘在 13。
2. 规则写着”分数至少 50 就及格”。写出两个最有用的测试值及预期结果。
显示答案
49 得 Fail,50 得 Pass。这两个值位于边缘的两侧。
3. 对上面有问题的等级代码,测试 30、65 和 90 能发现 bug 吗?
显示答案
不能。30 得 Fail,65 得 Pass,90 得 A,全部正确。只有 50 和 80 才能暴露错误。
接下来
设计正常、边界和无效的测试数据与找出未测试的分支这两课讲得更深入。想练习第一步,请看做出最小的可重现学习示例。你可以在安全的 Python 推理沙盒里运行自己编的小练习。
当测试通过了,你却仍然说不出原因,一对一 Computer Science 补习能让你有一位老师,陪你一起推理这条规则。Computer Science 学习指南显示了测试在这门科目中的位置。