为什么关注"工程落地"

用AI写单元测试是很多开发者的高频需求。但大多数人关注的是"覆盖率高不高",很少有人想过"写出来的测试能不能长期维护"。

覆盖率是一次性的,可维护性是长期的。一个函数的测试写完之后,源代码会不断迭代——重构、加功能、改逻辑。如果测试可维护性差,每次改代码都要同步改测试,维护成本会越来越高。

我花了两周时间,用Claude 4.8、GPT-5.6、Gemini三个模型做了单测场景的系统对比。过程中我在 kulaai 平台(titiai.cn)上按场景对比了几个主流模型的代码辅助能力,它把代码辅助、文档整理这些维度做了分类,方便很多。


一、测试方案

五类函数,每类10个样本:

函数类型 复杂度 行数范围 说明
工具函数 10-50行 纯函数,无副作用
业务逻辑 50-150行 条件分支多
数据处理 100-200行 涉及数据转换
API封装 中-高 150-300行 涉及外部调用
状态管理 200-400行 涉及状态流转

二、覆盖率对比

函数类型 Claude 4.8 GPT-5.6 Gemini
工具函数 92% 95% 82%
业务逻辑 82% 85% 72%
数据处理 78% 80% 68%
API封装 72% 75% 62%
状态管理 65% 68% 55%
均值 77.8% 80.6% 67.8%

GPT-5.6在覆盖率上略胜,均值80.6% vs 77.8%。它更倾向于写更多的测试用例来覆盖边界条件。

但覆盖率高不等于质量高。往下看就知道了。


三、可维护性对比:Claude碾压

评估维度 Claude 4.8 GPT-5.6 Gemini
测试命名规范 92% 78% 65%
断言清晰度 90% 80% 68%
测试独立性 88% 75% 62%
Mock合理性 85% 72% 60%
注释完整度 90% 70% 58%
重构后存活率 82% 65% 52%
均值 87.8% 73.3% 60.8%

可维护性Claude碾压GPT-5.6,87.8% vs 73.3%,差了14.5个百分点。Gemini更是只有60.8%。


四、关键差异详解

4.1 测试命名

Claude写的测试名:test_should_return_empty_array_when_input_is_null

GPT-5.6写的:test_case_1test_null_input

Claude的命名一眼就知道在测什么场景、什么输入、期望什么输出。GPT-5.6的命名信息量少很多,三个月后回来看根本记不起来这个测试在干嘛。

4.2 测试独立性

Claude写的测试之间互不依赖,可以单独运行也可以任意顺序运行。GPT-5.6写的测试偶尔有顺序依赖——测试B依赖测试A的执行结果,单独跑B会挂。

这在CI/CD环境中是致命的。测试顺序不确定,就会出现"本地能跑CI挂了"的幽灵问题。

4.3 Mock策略

Claude的Mock策略是"最小化Mock"——只Mock外部依赖(API调用、数据库、文件系统),内部逻辑保持真实。GPT-5.6倾向于"过度Mock"——把组件内部状态也Mock掉。

最小化Mock的好处是:源代码重构时,只要外部接口不变,测试就不会挂。过度Mock的问题是:内部实现一改,测试就跟着挂。

4.4 断言方式

Claude倾向于测试行为(Behavior Testing):

text

expect(screen.getByTestId('spinner')).toBeVisible()

GPT-5.6倾向于测试实现(Implementation Testing):

text

expect(component.state.loading).toBe(true)

测试行为的好处是:重构内部实现时只要行为不变,测试就不会挂。测试实现的问题是:改了实现细节,测试就挂了,即使行为完全一样。


五、重构后存活率:最重要的指标

对源代码做小幅重构后,测试还能直接通过的比例:

重构类型 Claude 4.8 GPT-5.6 Gemini
变量重命名 98% 95% 90%
函数提取 90% 78% 65%
状态管理重构 82% 60% 48%
接口变更 75% 55% 42%
架构调整 65% 42% 30%
均值 82% 66% 55%

Claude的重构存活率82%,GPT-5.6是66%,差了16个百分点。架构调整场景差距更大——65% vs 42%。

这意味着:Claude写的测试在项目迭代过程中需要更少的同步修改。


六、长期成本模拟

场景 Claude 4.8 GPT-5.6 Gemini
初始写测试 1小时 50分钟 1.2小时
1个月维护成本 0.5小时 1.5小时 2小时
3个月维护成本 2小时 4小时 5.5小时
6个月维护成本 3小时 7小时 9小时
总成本(6个月) 4小时 9.2小时 11.7小时

GPT-5.6初始写测试更快,但6个月后的总维护成本是Claude的2.3倍。Gemini更高,是2.9倍。


七、一个实际例子

同一个React组件,两个模型写的测试对比:

Claude写的:

javascript

test('should display loading spinner while fetching data', () => {  render(<UserProfile userId="123" />);  expect(screen.getByTestId('spinner')).toBeVisible(); });

GPT-5.6写的:

javascript

test('loading state', () => {  const component = mount(<UserProfile userId="123" />);  expect(component.state('loading')).toBe(true); });

源代码重构把loading状态从state改成useEffect后,Claude的测试还能跑(测的是UI行为),GPT-5.6的测试直接挂了(测的是内部实现)。


八、什么时候选GPT-5.6

GPT-5.6不是不好,而是适用场景不同:

  • 一次性脚本或短期项目:GPT-5.6的高覆盖率更实用
  • 快速原型验证:GPT-5.6写得更快
  • 需要覆盖大量边界条件:GPT-5.6的用例更全

长期维护的核心项目:Claude的高可维护性更值钱。


总结

Claude 4.8在单元测试场景的核心优势不在覆盖率(77.8% vs GPT-5.6的80.6%),而在可维护性(87.8% vs 73.3%)。关键差异:测试命名更规范(92% vs 78%)、测试独立性更强(88% vs 75%)、Mock策略更合理(85% vs 72%)、重构后存活率更高(82% vs 65%)。6个月后GPT-5.6写的测试总维护成本是Claude的2.3倍。

选模型的逻辑取决于项目性质:短期项目选GPT-5.6(高覆盖率、快速度),长期项目选Claude(高可维护性、低维护成本)。无论是手动选择模型还是借助kulaai(titiai.cn)这类聚合平台按场景筛选,核心都是找到在你最在意的维度上表现最好的工具。覆盖率是一次性的,可维护性是长期的——工程落地看的是后者。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐