1. 先聊聊这个让人又爱又恨的问题
做测试的朋友,尤其是写过几年自动化测试的,应该都有这种感觉:2023年初第一次把测试需求丢给ChatGPT时,那叫一个惊艳,几条用例写得有模有样,边界值、异常流、断言一应俱全。但到了2024年底、2025年,当你把同样的问题再问一遍,甚至把更具体的业务逻辑喂给Claude、DeepSeek时,得到的回答却总让人觉得“差点意思”。
不是模型变笨了,而是测试用例这件事,本质上比表面看起来要复杂得多。我在实际项目里试过用这三家主流模型去生成接口测试、UI测试和单元测试,结论很扎心:AI写测试用例越来越不靠谱,不是模型的错,是我们把“生成测试用例”这件事想得太简单了。这个问题,ChatGPT解决不了,Claude解决不了,DeepSeek也解决不了,因为它们面对的压根不是一个“语言生成”问题,而是“业务理解”和“缺陷预测”问题。
这篇文章想聊清楚三件事:AI生成测试用例到底卡在哪个环节,为什么模型越来越大、效果却越来越不稳定的根本原因是什么,以及作为从业者,我们应该怎么调整姿势,让AI从“测试用例生成器”变成“测试设计辅助者”。
2. 先拆开看看:AI写测试用例的完整链路
2.1 你以为它是“理解需求”,其实它是“排列组合”
我们大多数人使用AI生成测试用例的路径是:写一段提示词,描述功能需求,点击发送,然后复制粘贴到测试用例管理系统里,再自己手动改一改。这条路径看起来顺理成章,但凡是认真做过几个项目的人都会发现,AI产出的用例往往存在三个致命问题。
第一个问题是断言质量极差。AI很擅长生成“用户名输入正确时登录成功”这种用例,但断言部分经常是“断言页面跳转成功”或者“断言接口返回正确”这种废话式断言。真正要验证的是什么?Token格式对不对、Set-Cookie的过期时间对不对、错误码是否符合约定,这些关键断言它一概不会主动生成。
第二个问题是业务语义理解停留在字面层。比如说一个“订单取消”的功能,AI会根据已有接口文档生成“取消成功”“重复取消”“取消不存在的订单”等用例,这看起来很专业。但它想不到的是:如果这个订单已经发货了还能不能取消?如果取消时正在执行优惠券退还,同时用户把优惠券用了怎么办?如果取消操作没有幂等性,连续点两次取消会不会产生两条退款流水?这些才是业务测试里真正容易出Bug的地方,而AI的生成逻辑里天然缺少这套业务规则推导能力。
第三个问题是覆盖逻辑属于“词频驱动”而不是“风险驱动”。AI生成测试用例的时候,本质是在训练数据中检索相似的需求描述,然后按概率拼接出最像“正确测试用例”的文本。它不知道你的业务哪里最容易出错,不知道这段代码历史上改过多少次,不知道哪个模块的改动会影响这个接口。所以它生成的用例往往看起来面面俱到,实际放到代码里一跑,漏掉的全是真正会报错的地方。
2.2 为什么模型越强,“幻觉”反而越明显
我从2023年开始持续观察ChatGPT、Claude、DeepSeek三代模型的输出质量变化,一个非常直观的感受是:新一代模型的能力边界在变宽,但“幻觉”的表现形式也在从低级错误升级为高级错误。2023年的模型会在参数格式上写错,你一眼就能发现;2024年之后的模型,代码风格、命名规范、断言函数全部是对的,但你细看逻辑,会发现它在某些业务细节上编得理所当然。
举个例子,我让某知名模型为一个用户余额变更接口写单测,它给出的用例覆盖了“余额增加”“余额减少”“余额不足”“参数校验失败”等场景,断言也写得像模像样。但仔细检查后发现,它对余额不足的判断条件是balance < amount,而实际上业务代码用的判断条件是balance - amount < 0,两者在浮点数精度处理上会有细微差异。这个差异只有真正跑一遍代码才能发现,但AI生成答案的过程根本不涉及代码执行,所以它会坚定地输出在训练数据里出现频率最高的写法。
这就引出一个核心判断:大语言模型的“靠谱程度”不取决于它见过多少测试用例,而是取决于它是否具备对业务逻辑、历史变更、代码结构的感知能力。而这一点,恰恰是今天所有基于文本生成的模型都无法突破的瓶颈。
3. 为什么ChatGPT、Claude、DeepSeek都解决不了?——三个结构性瓶颈
3.1 训练目标与测试目标的根本错位
先看一个很本质的问题:大语言模型训练的时候,目标函数是什么?是“预测下一个词”。也就是给定前文,最大化后续文本的概率。这个目标决定了模型的底层能力是“语言连贯性”和“知识复现”,而不是“缺陷发现”或“逻辑验证”。
测试用例的价值是什么?是发现系统中的未知问题。写用例的过程本质上是在做三件事:理解当前代码/需求的边界条件、预测哪些输入组合会导致系统不符合预期、把预测结果固化成可执行的验证脚本。这三件事分别对应“语义理解”“风险判断”“逻辑执行”,而大模型只擅长第一件事的一部分,后两件事基本是它的盲区。
我经常用一个类比来解释这个问题:让AI写测试用例,就像让一个读了很多菜谱的人帮你预测哪道菜会做失败。他可以把菜谱背得滚瓜烂熟,但他不知道你家的火候大小,不知道你是用铁锅还是不粘锅,不知道你买的这批食材新不新鲜。他能给你一份看起来很完整的做菜清单,但无法告诉你在操作到哪一步时大概率会把菜烧糊。
3.2 缺少“可执行验证”闭环,生成内容质量不可控
如果你足够细心,你会发现一个规律:让AI写一个独立的函数,质量通常还不错;让它为一个已有系统写集成测试或端到端测试,粗错率就会急剧上升。原因很简单——单函数是自包含的,约束少,AI只需要根据函数签名推断输入输出关系即可;但集成测试要面对的是数据库状态、缓存一致性、消息队列时序、微服务间调用关系,这些全部超出了文本生成模型的能力边界。
更麻烦的是,这些错不是模型通过“更长的上下文”就能解决的。我在实践里试过给Claude喂完整接口文档、数据库表结构、业务规则,得到的测试用例确实更贴边了,但一旦进入实际运行,还是绕不开两个问题:一是它生成的mock数据与实际环境的真实数据结构经常对不上;二是它对异步流程的时序控制理解得很差,测试里经常出现“等到网络请求完成”这种主观臆断的等待逻辑,跑起来不是超时就是误报。
这也解释了为什么很多团队一开始热情高涨地“让AI把所有历史测试用例重写一遍”,最后都灰溜溜地把生成结果当参考文档而不是直接使用。没有人能保证LLM生成用例的“可执行性”,在缺少验证闭环的情况下,这些用例本质上和一本写满假设的说明书没什么区别。
3.3 历史代码的语义鸿沟,是模型永远跨不过去的坎
第三个瓶颈,是测试用例所依赖的“领域知识壁垒”。优秀的测试人员在写用例之前,脑子里有一个巨大的背景知识库:他知道这个模块的需求方是谁,知道这段代码上一个版本出现过什么故障,知道数据库里哪个字段曾经被错误地塞进了NULL值,知道生产环境里有哪些边界情况是文档里从来没写过的。这些知识,AI一样都没有——既没有在生产环境里跑过,也没有读过代码提交历史,更不知道线上告警里哪个接口的失败率近期有波动。
有同学可能会说,那我把这些背景信息写进提示词不就行了吗?理论上可以,但实际情况是:这些知识分布在文档、代码、群聊记录、评审会议纪要里,且每天都在更新。你要把这些全部整理出来喂给模型,成本已经超过雇一个人写测试用例了。更何况,测试人员最值钱的地方恰恰是那些“说不出来但心里有数”的经验——异常场景的嗅觉、对边界条件的敏感度,这些很难被文字化,更别提被模型学习。
这也是为什么DeepSeek、ChatGPT、Claude这些模型无论怎么升级,在“写测试用例”这件事上始终原地踏步。模型能力的提升体现在“对已知知识的重组”上,而测试用例需要的“对未知缺陷的预测”,永远超出已知知识的范围。
4. 说点实际的:我踩过的坑和真实教训
4.1 三个典型翻车场景,每一个都让我记忆犹新
先说一个接口测试的案例。我让某主流模型的4.0版本为支付回调接口生成一套边界用例。它给出的用例覆盖了金额为0、金额为负数、MD5签名错误、重复回调、参数缺失等场景——从清单上看相当完整。结果实际跑起来,它的所有用例都只验证了“接口是否返回200”,至于响应体里错误码的具体含义、回调后数据库里的订单状态是否变更,完全没有断言。等于说它生成的用例只验证了“接口没挂”,没验证“业务逻辑对”。这类问题是AI生成测试用例最典型的特征:用例数量很饱满,断言深度极其单薄。
再说一个踩过多次的坑——mock数据的真实性问题。AI生成单元测试时,会顺手帮你把外部依赖mock掉。我的实际项目里有一次它mock了一个第三方物流接口,返回的数据结构跟真实API完全对不上,单测跑起来全绿,一上集成环境立刻红成一片。这种问题的可怕之处在于它会给你一种“测试全过”的虚假安全感,如果你依赖AI的用例做回归,很容易把真实缺陷漏过去。
最后是UI测试领域,AI的理解力更弱。我试过让它为一个商品列表页写UI自动化用例,它的操作逻辑是“先点击列表第一项,然后等待详情页加载,再断言标题正确”。听着没问题,但它不知道列表是动态加载的,第一项在页面滚动后可能已经被替换;也不知道有的商品带促销标签会额外弹窗。这些在真实页面里都会导致测试失败,而AI完全没法预测运行时环境的动态变化。
4.2 我把AI当“测试同事”之后,局面才好转
踩了足够多的坑之后,我的结论是:目前阶段不要把AI当成“自动化测试用例生成器”,而是把它当成一个“可以对话的测试设计同事”。具体做法如下。
第一,只让AI生成“场景清单”,不让它生成“最终用例”。做法是把功能描述、接口定义、数据约束告诉模型,让它以表格形式列出“你认为值得测的所有场景”,然后由人来筛选、合并、去重。AI的价值在于帮你打开思路,减少遗漏,而不是替你做出最终判断。实测下来,这一步能帮我把测试覆盖的盲区缩小不少,而且质量可控。
第二,让AI做“断言助手”而不是“用例作者”。我最近常用的一种提示词模板是:“以下是某个接口的完整文档和一段实现代码,请你只关注响应数据,列出所有应该断言的业务规则,包括边界条件、状态流转、异常码定义。”这样AI就只需专注于规则提取,不用考虑页面操作、等待逻辑等它不擅长的事,断言质量有明显提升。
第三,把“代码变更信息”纳入提示词输入。既然模型缺少历史代码理解能力,那我就把Git变更日志、相关函数代码、涉及的数据表结构整理成上下文喂进去。经过这一层预处理,AI生成的用例针对性会强得多——至少它知道这次改动影响的是哪个模块,包含哪些风险点。但这部分信息整理确实费时,适合用在核心业务模块上,不适合全覆盖。
5. 实操参考:一种勉强能用的“人机协同”测试设计流程
先给出一份我在真实项目里验证过相对可行的流程,它不一定高级,但很实用:
第一步,人工梳理需求,明确核心业务逻辑和已知风险点,把这份“风险清单”作为输入给AI。这一步是前提,绝不能省。我见过不少团队为什么“AI生成测试用例不好用”,很大原因就是直接甩给AI一句“帮我写测试用例”,然后抱怨模型不行。没有业务上下文和风险导向的输入,任何模型都会退化成泛泛而谈。
第二步,让AI基于“风险清单”生成测试场景列表,人工审核补充。审核的关注重点是三个方向:是否符合真实用户的操作习惯、是否覆盖了数据状态流转(而不是单个接口调用)、是否有遗漏的组合型场景(比如积分兑换+优惠券+余额支付同时触发)。
第三步,把审核后的场景转成可执行的测试用例。这一步我会用AI辅助生成代码骨架,但断言和数据处理逻辑必须人工写或用第二步的“断言助手”模式生成后人工复核。不要相信模型自动生成的mock数据,所有外部依赖的返回结构都要和真实接口核对一遍。
第四步,运行和反馈闭环。测试用例跑完后,把失败用例、测试报告、覆盖率数据作为“上下文”再提问AI:“基于这次运行结果,你觉得还有哪些用例值得补?”这个环节是把AI从“一次性生成工具”转成“迭代辅助工具”的关键。只有加入运行时反馈,AI的建议才会逐渐贴近真实系统。
这套流程并没能让AI直接写出高质量的测试用例,但整体效率比纯人工提高了大约40%左右,而且质量下限有保障,漏测风险低得多。
6. 如果非要用AI写测试用例,这几条防翻车建议请收好
6.1 提示词里必须写清楚“不要做什么”
用过AI写代码的同学大多会有这种体验:生成结果里经常附带一些多余的“自以为是”的逻辑。测试场景也一样,如果提示词里不约束,AI会把“用户登录成功,并跳转到首页,首页显示用户名”这种过程性动作全都写进用例里,导致用例臃肿且不稳定。
我的经验是,提示词里至少要包含三类否定约束:不需要测试什么(比如与本次需求无关的模块)、不允许臆造什么(比如不存在的按钮、不存在的异常码)、必须遵守什么(比如断言必须基于接口返回值而不是界面文案)。把约束写清楚以后,生成的用例干净很多,修改成本也直线下降。
6.2 对AI生成的数据等价类,“多留一份心眼”
测试用例设计的核心方法之一是等价类划分。AI在这件事上经常出问题的地方在于:它对“有效等价类”的划分太标准,但对“无效等价类”的想象力又太丰富。简单说,它会很规范地给出“正确输入、错误输入、非法输入”三大类,但在“错误输入”里,它列出的往往是“格式错误”“超长字符串”“空值”这种教科书式的场景,而真正的业务高风险场景,比如“提交时被并发修改”、“状态机流转到终态后继续操作”,它几乎不会主动想到。
所以我在用AI生成用例时,有一个固定的处理动作:把AI输出的等价类划分结果,强制重新对照原始需求文档和线上异常日志过一遍。和真实历史故障对齐后的用例,才是真正能保命的用例。
6.3 警惕“覆盖率幻觉”——AI报告的测试覆盖吃不准
有些工具号称能让AI一键生成测试用例并把覆盖率提到某百分比,这里我提醒一句:覆盖率表示的是“代码行被执行过”,不代表“逻辑被验证过”。AI生成的用例经常出现这种情况:断言条件宽松,每个分支都跑到,但所有分支的验证点都是同一个值,覆盖率报表很好看,真实缺陷一个没拦住。
我在项目里见过团队因为AI生成的用例覆盖率高达90%就直接把用例合入主干做回归,结果上线后漏了一个严重事务异常。覆盖率这个数字,建议人工维护合理性判断,不要盲信工具输出。
7. 我的个人判断与建议
用了一年多时间在真实项目里反复测试ChatGPT、Claude、DeepSeek生成测试用例的能力,我的总体判断是:AI适合做测试设计的“发散端”,不适合做“收敛端”。发散端指的是帮你产生大量可选的场景、提供不同角度的思考、快速生成草稿版本;收敛端指的是把测试目标拆解成精确可执行的断言、判断哪些场景在真实系统里值得投入、对执行结果做可靠性分析。
纯粹指望AI自动生成可以直接落地的测试用例,在今天的技术能力下,是不现实的。而且模型越强,这种“看起来靠谱但实际不靠谱”的风险反而越大,因为浅层错误会减少,深层错误越来越隐蔽,对人力的要求反而更高了。
我现在的团队在使用AI生成测试用例时,会有一个不成文的约定:AI产出的用例必须经过至少一轮代码评审,评审人必须能看到真实接口定义和业务需求文档。这个约定看起来很笨,但它确实避免了好几次线上问题。个人体会是——AI写测试用例不靠谱这件事,短期内不会有根本性改变,但“如何让AI参与得更聪明”这件事,是每个测试从业者当下就能开始琢磨的。
如果你所在的项目也在用AI生成测试用例,建议还是从自己最熟悉的模块入手试水,把AI当“建议生成器”,把人工当“质量闸门”。这个组合,是目前性价比最高的玩法。