字符串边界单元测试需覆盖空值、极短/极长输入、特殊字符、unicode代理对及函数声明的行为边界,如截断长度、替换次数限制等。

为字符串处理函数写边界单元测试,核心是覆盖空值、极短/极长输入、特殊字符、编码边界(如 Unicode 代理对)、以及函数明确声明的行为边界(比如截断长度、替换次数限制等)。
覆盖空值与极简输入
很多字符串函数在 null、undefined、空字符串 ""、空白字符串 " " 下行为不同。测试时需明确函数约定:是抛错?静默返回?还是做默认处理?
- 显式传入
null和undefined,验证是否按文档抛出TypeError或返回合理默认值 - 用
""测试是否意外报错(例如str.charAt(0)返回""而非undefined) - 对仅含空格的字符串(如
"\t\n \r")测试 trim 类操作是否真正清空
检验长度边界与截断逻辑
若函数涉及长度限制(如 truncate(str, maxLength)),边界点必须覆盖:0、1、等于原长、比原长短 1、比原长长 1、负数。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
-
truncate("hi", 0)→ 应返回""或按策略加省略号(如"…") -
truncate("a", 1)→ 应保持原样,不截断也不加省略号 -
truncate("abc", -5)→ 明确约定是否抛错,测试该错误路径 - 用超长字符串(如 10000+ 字符)测性能退化或栈溢出风险(尤其递归实现)
处理 Unicode 与多字节字符
JavaScript 中 length 统计的是 UTF-16 码元数,不是真实字符数。含 emoji 或中文的字符串容易在切片、截取、正则匹配时出错。
- 测试字符串
"??"(ZWNJ 连接的 emoji):其.length === 4,但实际是 1 个用户感知字符 - 用
Array.from(str).length或Intl.Segmenter做正确计数的函数,需验证边界如slice(0, 1)是否取出完整 emoji - 包含代理对(surrogate pair)的字符串如
"\uD83D\uDE00"(?),测试charAt(0)是否返回""(损坏码元)而非完整字符
验证正则与替换类函数的边界行为
使用 replace()、replaceAll()、match() 的函数,要特别注意全局标志、空匹配、重叠匹配等陷阱。
-
"aaa".replace(/a/g, "b")→ 应得"bbb";但"aaaa".replace(/aa/g, "x")→ 得"xx",测试是否漏掉重叠部分(如未用g或 lookahead) -
"hello".replace(/^/, "X")测试空匹配是否被正确处理(应得"Xhello") - 传入无效正则(如
new RegExp("["))时,确认函数是否提前校验并报错,而不是让replace运行时报错
边界测试不是越多越好,而是紧扣函数契约——输入什么、保证输出什么、失败时如何反馈。用 Jest 或 Vitest 时,善用 test.each 驱动多组边界数据,让用例清晰可维护。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










