题目
设计字符串处理函数的单元测试用例
信息
- 类型:问答
- 难度:⭐⭐
考点
单元测试设计,边界条件处理,测试用例覆盖
快速回答
为字符串处理函数设计单元测试需关注:
- 核心功能验证:正常输入场景
- 边界条件:空字符串、特殊字符、长度极限
- 异常处理:非法输入时的行为
- 覆盖率:确保所有分支被覆盖
被测函数示例
// 功能:将字符串按逗号分割成数组,过滤空值并去除首尾空格
public List<String> parseString(String input) {
if (input == null) return Collections.emptyList();
return Arrays.stream(input.split(","))
.map(String::trim)
.filter(s -> !s.isEmpty())
.collect(Collectors.toList());
}测试用例设计原则
- 正常路径:验证基础功能实现
- 边界值:空输入、极长字符串、特殊字符
- 异常情况:null输入、非法字符处理
- 分支覆盖:确保所有条件分支被测试
完整测试用例(JUnit示例)
@Test
void normalInput() {
List<String> result = parser.parseString(" apple, banana, cherry ");
assertIterableEquals(List.of("apple", "banana", "cherry"), result);
}
@Test
void containsEmptyItems() {
List<String> result = parser.parseString("apple,,banana, ");
assertIterableEquals(List.of("apple", "banana"), result);
}
@Test
void nullInput() {
List<String> result = parser.parseString(null);
assertTrue(result.isEmpty());
}
@Test
void emptyString() {
List<String> result = parser.parseString("");
assertTrue(result.isEmpty());
}
@Test
void specialCharacters() {
List<String> result = parser.parseString("a@b, c#d, $%^");
assertIterableEquals(List.of("a@b", "c#d", "$%^"), result);
}最佳实践
- 使用Given-When-Then结构组织测试用例
- 测试名称应明确描述场景(如
parseString_WhenInputHasLeadingSpaces_ShouldTrim) - 结合参数化测试减少重复代码
- 覆盖率目标:通常要求分支覆盖率达80%以上
常见错误
- 忽略空字符串和空白字符场景
- 未处理null输入导致NPE
- 未验证集合顺序(如顺序敏感场景)
- 缺少特殊字符(如逗号在内容中)的测试
扩展知识
- 测试框架特性:JUnit5参数化测试、Mockito异常模拟
- 边界值分析:0/1/N原则(0个元素、1个元素、多元素)
- 测试金字塔:单元测试应占测试总量的70%
- 测试驱动开发(TDD):先写测试再实现功能