如何测试系统自动生成的slug是否具备唯一性?
Slug生成逻辑的测试方案推荐
你当前仅验证数据库无重复slug的测试方案是不充分的,仅能覆盖最基础的两次重复提交场景,遗漏了大量线上可能触发异常的边界情况,完整的测试方案可以参考以下内容:
现有测试的不足
你给出的示例测试仅能验证两次相同标题提交不会生成重复slug,无法覆盖以下风险场景:
- 多次重复提交相同标题时,后缀追加逻辑是否会出错
- 标题本身携带数字、特殊字符时,slug生成逻辑是否会出现冲突
- 高并发下同时提交相同标题,会不会因为竞态条件生成重复slug
- 业务存在软删除、归档规则时,已被删除数据占用的slug会不会和新生成的slug冲突
推荐的完整测试方案
1. 基础功能测试
保留你现有的测试逻辑,额外补充两个验证点:
$title = 'Ships in the Night'; $a = Model::factory()->create(['title' => $title]); $b = $this->post('/endpoint', ['title' => $title]); // 原有验证 $this->assertCount(1, Model::where('slug', $a->slug)->get()); $this->assertCount(1, Model::where('slug', $b->slug)->get()); // 新增验证 $this->assertNotEquals($a->slug, $b->slug); // 按你约定的后缀规则调整正则即可 $this->assertMatchesRegularExpression('/^ships-in-the-night(-\d+)?$/', $b->slug);
验证两个slug确实不同,且第二个slug的格式符合你的设计规范。
2. 多轮重复提交测试
连续提交5~10次完全相同的标题,遍历所有生成的slug,验证:
- 所有slug完全唯一,没有重复值
- 后缀递增逻辑符合预期,不会出现跳号、重复后缀的问题
3. 边界标题测试
针对特殊格式的标题做专项测试:
- 测试末尾自带数字的标题,比如标题为「Ships in the Night 3」,先提交一次生成基础slug,再重复提交多次,验证新生成的后缀不会和标题自带的数字冲突,不会出现
ships-in-the-night-3-2这类不符合预期的格式 - 测试携带中文、emoji、特殊符号、全角字符的标题,多次重复提交,验证slug转义逻辑和后缀追加逻辑都正常运行
4. 并发场景测试
使用并发请求工具(比如压力测试工具、协程批量请求)同时发起10个以上相同标题的创建请求,请求结束后统计所有生成的slug,验证没有重复值,确保slug生成逻辑具备原子性,不会因为竞态条件出现重复。
5. 业务规则适配测试
如果你的业务存在数据软删除、归档的规则,补充测试:
- 已软删除的记录占用的slug,新提交同标题内容时会正确避开,不会直接复用已被占用的slug
- 归档数据的slug和新生成的slug不会出现冲突
常见问题解答
仅验证数据库无重复slug是否足够?
不够。除了唯一性之外,你还需要保证slug的生成格式符合预期、并发场景下不会出现重复、特殊输入不会触发逻辑异常,否则很容易出现线上偶发的slug重复、格式异常等问题。
内容的提问来源于stack exchange,提问作者joso
相关产品推荐
相关产品推荐

