最近团队的氛围,像极了一场流动的盛宴。AI代码生成工具,就是那个无限量供应的自助餐台,琳琅满目,应有尽有。前端页面、后端API、数据处理脚本……只要你开口,它就给你上菜,速度快到让人产生一种不真实的眩晕感。

Jira上的任务卡,以前是靠开发们一行行代码、一杯杯咖啡给“磨”过去的。现在,它们像坐上了滑梯,从“To Do”飞速滑向“In Progress”,再“嗖”地一下冲进“Testing”泳道。泳道里瞬间挤满了卡片,像下锅的饺子,沸腾着,翻滚着。

起初,这是我们梦寐以求的场景。开发效率的瓶颈被打破,每个人都沉浸在“一天干完一周活”的狂喜中。我们以为自己拿到了通往“敏捷天堂”的单程票。

但很快,我们就发现,票上写的目的地其实是“测试地狱”。

我们遇到了一个极其尴尬的窘境:生产代码的速度超越了验证代码的速度。 这就像你开着一辆法拉利,却行驶在下班高峰期的北京三环上,引擎在咆哮,但你只能以每小时五公里的速度挪动。而堵在你前面的,是我们自己的测试流程。

测试团队的兄弟们,肉眼可见地憔悴下去。他们精心维护的自动化脚本,在一夜之间变得像一堆废铁。AI生成的代码,虽然大体上能跑,但DOM结构、元素ID、API返回的数据结构,都带着一种“薛定谔的随机性”。脚本每跑一次,就报一堆定位不到元素的错误,仿佛在玩一场大型的“找你妹”游戏。

有人开玩笑说,这叫“能跑就行2.0”,AI深得其中精髓。但我们都笑不出来。因为我们知道,这背后是正在迅速堆积的质量债,其规模和速度,远超我们过去处理过的任何“祖传屎山”。

AI带来的不是效率问题,而是流量问题。当代码生成的洪峰涌向下游的测试河道时,我们才发现,那条小溪根本承受不住如此汹涌的波涛。

我们开始尝试自救。

第一反应,自然是“大力出奇迹”。既然自动化跟不上,那就堆人力。于是,测试团队开始疯狂地“点点点”。但这个解法很快就破产了。AI一天能生成十几个页面,每个页面又有Web、H5、小程序多个端。靠人力回归测试,无异于想用一个水桶舀干整个太平洋。

更可怕的是,这种重复性的人肉测试,正在以惊人的速度消耗着测试同学的热情和价值感。他们感觉自己不像工程师,更像富士康流水线上的工人,每天都在做着毫无创造性的、枯燥的验证工作。

第二个思路,是“魔法对抗魔法”。我们想,能不能也用AI来对抗AI?让AI去生成测试用例,甚至编写自动化测试脚本。这个方向听起来很美,我们也进行了一些尝试。但很快就发现,这又是一个陷阱。

让AI写测试代码,它同样会犯错。你需要去调试AI写的测试代码,这本身就需要极强的工程能力。结果就是,我们不仅要测试AI写的业务代码,还要测试AI写的测试代码。这套娃一样的复杂度,让问题变得更加棘手。

试图用一个我们尚不完全信任的黑箱(AI测试)去验证另一个我们同样不完全信任的黑箱(AI开发),得到的不是质量保证,而是“玄学”。

那段时间,整个团队都弥漫着一种挫败感。我们手握着前所未有的“神器”,却感觉自己比以前更累了。开发在疯狂“喂料”,测试在疯狂“消化不良”,中间的流程充满了阻塞和抱怨。

我陷入了沉思。我们是不是从一开始就想错了?

我们一直以来的思维定势是:开发和测试是两个独立的、串行的环节。开发负责“创造”,测试负责“检验”。我们所有的努力,都是在想办法“加速”那个检验的环节。

一个让人沉默的真相:我们试图解决的是测试的“速度”问题,但真正的症结,在于测试的“位置”问题。

当创造的成本趋近于零时,后置的、以“挑错”为核心的检验模式,注定会崩溃。因为它永远追不上创造的速度。

这就像消防队救火。你不能等火烧起来了,再去研究怎么灭火。你必须在建筑设计之初,就把消防通道、喷淋系统、防火材料全部规划进去。

一个意想不到的思维转折,就在这个消防队的比喻中诞生了。

如果,测试不再是软件开发流程的“终点站”,而是“始发站”呢?

我开始尝试一种新的工作方式。在AI开始生成任何代码之前,我不再只是简单地把产品经理的需求文档(PRD)扔给它。我开始编写一种全新的“文档”,我内部称之为“AI代码生成预检清单”(Pre-flight Checklist for AI)。

这份文档,本质上就是一份“前置测试用例”。但它和传统的测试用例又完全不同。它不关心具体的实现细节,而是专注于定义“约束”和“期望”。

比如,针对一个用户注册页面,我的“预检清单”会是这样的:

  • 验收标准(Happy Path):用户输入合规的手机号、密码、验证码,点击注册,应跳转到首页,并提示“注册成功”。数据库中应新增一条用户信息,密码必须是加盐哈希存储的。
  • 边界条件(Edge Cases)
    • 密码长度测试:小于6位、等于6位、大于20位、等于20位的情况。
    • 手机号格式测试:非11位、包含非数字字符、已注册的手机号。
    • 验证码测试:过期、错误、不输入。
  • 异常路径(Negative Paths)
    • 在注册过程中断网,重新联网后,页面应如何响应?
    • 服务器返回500错误时,前端应给用户明确的提示,而不是白屏或转圈。
    • 防止重复提交:用户快速连续点击注册按钮,后端应只处理一次请求。
  • 非功能性需求(Non-functional)
    • 页面加载速度(LCP)必须在1.5秒以内。
    • 所有按钮的点击响应区域,必须符合移动端可用性标准(最小44x44像素)。
    • 设计稿中的字体、颜色、间距必须严格遵守,像素级还原。

我把这份详尽的、充满了各种“陷阱”和“刁难”的清单,作为Prompt的一部分,喂给AI。

结果是惊人的。

AI生成的代码,质量有了质的飞跃。它不再是一个只会走阳光大道的“傻白甜”,而像一个经历过社会毒打的“老油条”。那些我预设的坑,它大部分都提前规避了。

我们不能再扮演AI的“批改老师”,而要成为它的“考纲设计师”。在它动笔之前,就划定好所有的得分点和送命题。

这个过程,让我想起了小时候打《超级马里奥》。我们现在做的,不再是等马里奥掉进坑里后去捞他,而是在他出发前,就递给他一份完整的“通关攻略”,上面标明了哪里有隐藏的蘑菇,哪里有会喷火的食人花。

这个发现,让我看到了解决测试困境的曙光。测试团队的价值,不再是跟在开发屁股后面“赛博考古”,去发现bug。他们的核心价值,将前移到整个流程的最前端。

那些工程能力稍弱,但业务理解深入、心思缜密的测试同学,他们将成为最优秀的“考纲设计师”。他们对用户行为的洞察,对业务逻辑死角的敏感,将成为最宝贵的财富。他们不需要去写复杂的代码,他们只需要把自己的“测试智慧”,转化成AI能理解的“预检清单”。

在AI时代,测试的核心竞争力,正从“发现问题”的能力,悄然转变为“预见问题”的能力。

我们正在构建一套新的协作流程,我称之为“测试驱动AI”(Test-Driven AI,TDAI)。

  1. 定义(Define):测试工程师与产品经理一起,将需求转化为包含详尽验收标准、边界条件和异常路径的“预检清单”。
  2. 生成(Generate):开发工程师将这份清单作为核心Prompt,引导AI生成代码。
  3. 评审(Review):开发和测试一起,对AI生成的代码进行Code Review,但评审的焦点不再是语法细节,而是看代码是否完整覆盖了“预检清单”中的所有要点。
  4. 探索(Explore):在代码基本符合清单后,测试工程师再进行探索性测试,专注于寻找那些AI和人都没预料到的、“反逻辑”的“黑天鹅”事件。

这个流程,还没有完全跑顺。我们还在摸索如何写出最高效的“预检清单”,还在调试人与AI之间最佳的协作模式。但方向,似乎对了。

团队的氛围也变了。测试同学不再焦虑,他们找到了新的价值锚点,从被动的“接盘侠”,变成了主动的“领航员”。开发同学也松了一口气,他们从无尽的“修bug”循环中解脱出来,可以更专注于架构设计和技术选型。

AI没有让测试消亡,它只是强迫测试完成了一次进化。从流程的“阑尾”,变成了躯体的“大脑”。

我站在白板前,看着上面画的这个新流程图,它还很粗糙,甚至有些可笑。我知道,这远非最终的答案。

当代码可以被“描述”出来,而不是“写”出来时,软件工程的整个版图都在重绘。测试,这个曾经站在版图边缘的角落,如今似乎被推到了中心。

它不再仅仅是一种技术活动,更像是一种沟通的艺术,一种对未来进行精确描述和约束的哲学。

那么,当“测试”的定义被无限扩大,它与“需求分析”、“产品设计”甚至“架构设计”的边界,又将在哪里消融?当每个人都开始为AI设计“考纲”时,我们又该如何协同,才能谱写出一首和谐的乐章,而不是一曲嘈杂的噪音?

代码的潮水仍在上涨,我们似乎刚刚学会了如何不被淹死。但离学会在浪尖上优雅地冲浪,还有很长的路要走。

Logo

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

更多推荐