You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何测试系统自动生成的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:27:04