修一个边界 bug,并写出隐藏测试
最小修复、测试设计、覆盖盲区,一次看代码能力。
测试提示词
下面函数用于把用户输入的标签数组去重、去空、转小写,并保留首次出现顺序。
```js
function normalizeTags(tags) {
const result = [];
for (let i = 0; i < tags.length; i++) {
const tag = tags[i].trim().toLowerCase();
if (tag && !result.includes(tag)) result.push(tag);
}
return result;
}
```
需求:
- tags 可能包含 null、undefined、非字符串
- 空字符串和纯空格要丢掉
- 去重后保留首次出现顺序
任务:
1. 指出这段代码在哪些输入下会出错
2. 给出最小修复
3. 写 5 个测试用例
4. 说明一个测试覆盖不到的情况观察点
- 是否发现
null/undefined/数字会调用.trim()报错。 - 是否处理非字符串但可转换的值,还是直接过滤。
- 修复是否保持原顺序。
- 测试是否覆盖空数组、全空、重复、大小写、混合类型。
参考方向
主要问题是 tags[i].trim() 对 null/undefined/数字不安全。最小修复可以先判断类型:
const raw = tags[i];
if (typeof raw !== 'string') continue; // 或 String(raw) 取决于产品定义
const tag = raw.trim().toLowerCase();
测试至少覆盖:空数组、[' A ', 'a', '']、[null, undefined]、['b','B','b']、[1, '1']。
最后要说明产品对数字标签的定义,否则“最小修复”本身有歧义。
常见表现
- 只修空字符串,不处理 null。
- 用 Set 去重但改变顺序。
- 测试只写正常输入。
- 不说明非字符串的产品规则。
最后验证:2026年10月26日