验证(validation)是程序在使用数据之前,自动检查数据是否合理并被允许。考试里通常给你一句日常语言写的需求,要你说出是哪种检查,或把它写出来。关键技能是把需求中的字眼对应到正确的检查类型。
这是验证、核实与测试单元的第一课。
哪种检查对应哪种需求?
读需求,找出关键词,它会告诉你该用哪种检查。
| 需求的措辞 | 检查 | 测试什么 |
|---|---|---|
| “必须在 13 到 17 之间” | 范围检查 | 数值在下限和上限之内 |
| “至少 8 个字符” | 长度检查 | 字符个数 |
| “必须是整数” | 类型检查 | 数据属于正确的数据类型 |
| “不能留空” | 存在检查 | 已经输入了内容 |
| “两个字母加三个数字” | 格式检查 | 字符符合固定模式 |
**校验位(check digit)**是另一种验证方法,用于条形码等号码。它在数据传输与检查中讲解。
例题
一个虚构的学校社团要求填写成员年龄。需求是:“年龄必须是 13 到 17 的整数(含 13 和 17)。”
第 1 步,找关键词。“整数”关乎数据类型,“13 到 17”关乎界限。
**第 2 步,说出检查名称。**类型检查(整数)和范围检查。
**第 3 步,写出范围检查。**一直询问,直到数值被接受:
REPEAT
INPUT Age
IF Age < 13 OR Age > 17 THEN
OUTPUT "Age must be 13 to 17"
ENDIF
UNTIL Age >= 13 AND Age <= 17
第 4 步,用输入 20、12、15 追踪(trace)。
| 输入 | Age < 13 OR Age > 17 | 提示信息 | UNTIL 为真? |
|---|---|---|---|
| 20 | TRUE(20 > 17) | 显示 | 否 |
| 12 | TRUE(12 < 13) | 显示 | 否 |
| 15 | FALSE | 无 | 是 |
循环在 15 时结束,所以程序只会带着被接受的值继续运行。
长度检查的写法相同。下面的密码至少需要 8 个字符:
REPEAT
INPUT Password
IF LENGTH(Password) < 8 THEN
OUTPUT "At least 8 characters needed"
ENDIF
UNTIL LENGTH(Password) >= 8
要小心的错误
错误答案:“范围检查确保密码够长。”
学生记得”检查”这个词,却没记住它测试的是哪一种属性。
密码长度是长度检查,因为它数字符个数。范围检查是把数值和界限比较。说出检查名称之前,先念出被测试的是什么:数值大小、字符个数、数据类型、有没有输入,还是模式。
自我检测
1. 表格写着:“考试分数必须在 0 到 100 之间。“请说出检查名称。
Show answer
范围检查,下限 0,上限 100。
2. 表格写着:“电子邮件栏不能留空。“请说出检查名称,并说明它能否证明邮件是真的。
Show answer
存在检查。它不能证明邮件是真的,只能证明有人输入了内容。
3. 学生代码必须正好是”CS”加三个数字,例如 CS417。这是哪种检查?CS999 能通过吗?
Show answer
格式检查。CS999 能通过,因为符合模式,即使没有学生拥有这个代码。验证检查的是模式,不是真实性。
接下来学什么?
下一课说明为什么核实(verification)和验证是不同的工作。之后你会为这样的检查设计测试数据。你可以在受限伪代码追踪训练器中逐步运行上面的循环,然后做综合练习。
如果选对检查名称一直是个问题,这正是我们在一对一线上计算机科学补习中会帮你处理的。