AI智能体赋能Cypress:构建下一代自动化测试新范式
1. 项目概述:当Cypress遇见AI智能体
最近在搞前端自动化测试的团队,估计都听过Cypress的大名。它凭借其现代化的架构、友好的API和强大的调试能力,几乎成了E2E测试的代名词。但用过的人都知道,即便工具再好,编写和维护测试用例依然是个体力活加脑力活。你得懂业务逻辑,懂页面交互,还得时刻盯着DOM结构的变化,一个选择器失效可能就让整个测试套件“瘫痪”。更别提那些复杂的异步操作和动态数据加载了,写起来费时,调起来更费劲。
就在大家觉得自动化测试的“天花板”已经触手可及时,AI智能体(AI Agent)技术开始渗透进来。这可不是简单的“用AI生成几行代码”,而是一种全新的协作范式。简单来说,AI智能体可以理解你的测试意图,观察应用状态,并自主决策执行测试步骤。想象一下,你只需要告诉AI“测试用户从登录到成功下单的完整流程”,它就能自己分析页面、定位元素、模拟操作、验证结果,甚至在遇到异常时尝试不同的路径。这听起来像科幻,但基于当前的大模型能力,我们已经可以构建出能解决实际问题的初级智能体了。
“AI智能体赋能Cypress”这个项目,正是探索将AI的认知与决策能力,与Cypress精准的执行与控制能力相结合。它不是为了取代测试工程师,而是成为一个不知疲倦、学习能力超强的“超级协作者”。对于团队而言,这意味着测试用例的创建速度可以指数级提升,测试覆盖的深度和广度也能突破人力瓶颈。对于个人开发者,它则能极大降低编写自动化测试的门槛和心智负担。接下来,我们就深入拆解,如何一步步构建这样一个未来感十足的测试新范式。
2. 核心架构设计:智能体与执行器的协同
要实现AI智能体驱动Cypress,不能是生硬地把提示词(Prompt)丢给大模型然后拼接代码。我们需要一个清晰、稳固的架构,让“大脑”(AI智能体)和“手脚”(Cypress)高效协同。这个架构的核心是 责任分离 与 状态同步 。
2.1 分层架构解析
一个典型的AI-Cypress智能体系统可以分为三层:
认知与决策层(AI Agent Layer) 这是系统的大脑,通常由一个或多个大语言模型驱动。它的核心职责是:
- 理解自然语言指令 :将用户描述的测试场景(如“测试忘记密码流程”)转化为结构化的测试目标。
- 制定测试计划 :将宏观目标分解为一系列具体的、可执行的原子操作步骤,例如:“1. 访问登录页;2. 点击‘忘记密码’链接;3. 在输入框中填入注册邮箱...”。
- 观察与决策 :接收来自执行层的反馈(如页面截图、DOM快照、网络请求日志),理解当前应用状态,并决定下一步操作。例如,看到“验证码输入框”出现,则决策为“识别图片验证码并输入”。
- 异常处理与路径探索 :当预期元素未找到或操作失败时,能分析原因(是页面未加载完?还是元素选择器变了?),并尝试替代方案或报告有意义的错误。
协调与控制层(Orchestration Layer) 这一层是粘合剂,负责管理AI智能体与Cypress运行环境之间的通信、生命周期和上下文。关键技术点包括:
- 上下文管理 :维护一个持续的会话上下文,包含测试目标、已执行步骤、当前页面状态、收集到的证据等,确保AI在做决策时拥有足够的“记忆”。
- 工具调用 :将Cypress的能力(如
cy.visit(),cy.get(),cy.click())封装成AI可以理解和调用的“工具函数”。这通常遵循类似OpenAI Function Calling的规范。 - 提示工程 :设计高效的System Prompt和Few-shot示例,引导AI以稳定、可靠的格式输出决策。例如,强制AI以特定的JSON格式输出下一个命令和期望结果。
执行与反馈层(Cypress Runner Layer) 这是系统的手脚,由Cypress测试运行器担当。它负责:
- 忠实执行命令 :接收来自协调层的具体Cypress命令并执行。
- 收集环境证据 :在执行命令前后,主动捕获页面状态,包括截屏、DOM结构、控制台日志、网络请求等。这些是AI“观察”世界的眼睛。
- 状态反馈 :将命令执行的结果(成功、失败、返回数据)以及收集到的证据,结构化地返回给协调层。
注意 :这里的一个关键设计抉择是 控制粒度 。是让AI直接输出Cypress命令字符串,还是输出高级指令再由协调层翻译?初期验证建议采用后者,即AI输出如
{“action”: “click”, “target”: “那个蓝色的登录按钮”, “purpose”: “进入登录表单”}的抽象指令,由协调层映射到具体的cy.get(‘[data-cy=submit]’).click()。这降低了AI的出错率,提高了系统的可控性。
2.2 技术栈选型考量
基于以上架构,我们可以组合出以下技术栈:
- AI核心 :OpenAI GPT-4/4o、Anthropic Claude 3、或开源的DeepSeek、Qwen等。闭源API在理解能力和指令跟随上通常更稳定,开源模型则利于私有化部署和成本控制。对于测试场景,模型对网页HTML结构的理解能力是关键评估点。
- 协调层框架 :LangChain、LlamaIndex或自主开发的轻量级Agent框架。LangChain提供了丰富的Agent和Tool抽象,开箱即用,但可能稍显臃肿。自主开发则更灵活,能紧密贴合Cypress的上下文。
- 执行层 :Cypress毫无疑问是主角。需要重点关注其 可编程性 ,利用
Cypress.on()监听事件,利用cy.task()与Node.js后端通信,这些都是连接AI的关键节点。 - 视觉辅助 :对于需要“看见”页面才能做的决策,可以集成视觉AI模型。例如,使用开源的YOLO或CLIP模型对截图进行元素检测与识别,作为DOM选择器失效的备用方案。或者,直接利用GPT-4V等多模态模型分析截图。
我个人的实践体会是,初期不要追求大而全的“通用智能体”。从一个垂直场景切入,比如“ 基于产品需求文档自动生成冒烟测试用例 ”或“ 自动修复因CSS类名变更而失败的测试 ”,更容易做出效果、验证价值。架构上也要保持模块化,便于替换AI模型或测试执行器。
3. 关键实现步骤:从零搭建智能测试体
理论说再多,不如一行代码。我们以一个具体的场景来贯穿实现过程: 让AI智能体自动测试一个简易登录页面的成功登录流程 。用户只需说:“测试使用标准用户(用户名: testuser , 密码: Test1234! )成功登录。”
3.1 环境搭建与初始化
首先,创建一个新的Node.js项目并安装核心依赖。
mkdir ai-cypress-agent && cd ai-cypress-agent
npm init -y
npm install cypress langchain @langchain/openai dotenv
这里我们选择LangChain作为协调层框架,它封装了与OpenAI等模型的交互以及Agent的构建逻辑。接着,初始化Cypress。
npx cypress open
在打开的Cypress界面中选择“E2E Testing”,完成初始配置。这会在项目根目录创建 cypress 文件夹和配置文件。
创建环境变量文件 .env ,存放你的OpenAI API密钥。
OPENAI_API_KEY=sk-your-api-key-here
3.2 封装Cypress为AI可调用的工具
这是连接两个世界的桥梁。我们需要在Cypress的 plugins/index.js (或 cypress/plugins/index.js )或 cypress/support/e2e.js 中,创建一个能与外部Node.js脚本通信的机制。更清晰的做法是,在项目根目录创建一个 agent-orchestrator.js 作为协调器主脚本。
在 agent-orchestrator.js 中,我们利用LangChain的 DynamicStructuredTool 来定义工具。
import { DynamicStructuredTool } from "@langchain/core/tools";
import { z } from "zod";
import { exec } from 'child_process';
import { promisify } from 'util';
const execAsync = promisify(exec);
// 工具1:导航到某个URL
const navigateTool = new DynamicStructuredTool({
name: "navigate_to_url",
description: "Navigate the browser to a specific URL.",
schema: z.object({
url: z.string().describe("The full URL to navigate to, e.g., https://example.com/login"),
}),
func: async ({ url }) => {
// 这里需要与Cypress运行时通信。一个简单方案是写入一个临时指令文件,由Cypress读取并执行。
// 更工程化的方案是使用Socket.io或Cypress的`cy.task`进行进程间通信(IPC)。
const command = `echo '{"action":"visit","url":"${url}"}' > cypress/commands/next_command.json`;
await execAsync(command);
return `Navigation instruction issued for: ${url}. Waiting for execution report...`;
},
});
// 工具2:在页面上查找并点击元素
const clickElementTool = new DynamicStructuredTool({
name: "click_element",
description: "Find an element on the page based on its description and click it.",
schema: z.object({
elementDescription: z.string().describe("A clear description of the element to click, e.g., 'the login button', 'the forgot password link'."),
}),
func: async ({ elementDescription }) => {
const command = `echo '{"action":"click","description":"${elementDescription}"}' > cypress/commands/next_command.json`;
await execAsync(command);
return `Click instruction issued for element described as: "${elementDescription}".`;
},
});
// 工具3:在输入框中填写文本
const fillInputTool = new DynamicStructuredTool({
name: "fill_input",
description: "Find an input field and type text into it.",
schema: z.object({
inputDescription: z.string().describe("Description of the input field, e.g., 'username input box', 'password field'."),
text: z.string().describe("The text to type into the field."),
}),
func: async ({ inputDescription, text }) => {
const command = `echo '{"action":"type","description":"${inputDescription}","text":"${text}"}' > cypress/commands/next_command.json`;
await execAsync(command);
return `Type instruction issued for '${inputDescription}' with text: '${text}'.`;
},
});
// 工具4:获取页面状态(简化版:获取页面标题和关键元素信息)
const getPageStateTool = new DynamicStructuredTool({
name: "get_page_state",
description: "Get the current state of the page, including title, URL, and visibility of key elements. Use this to observe the result of your actions.",
schema: z.object({}),
func: async () => {
// 读取Cypress执行后回写的状态报告
try {
const stateReport = require('./cypress/reports/current_state.json');
return `Page State Report:\nTitle: ${stateReport.title}\nURL: ${stateReport.url}\nVisible Key Elements: ${JSON.stringify(stateReport.visibleElements)}`;
} catch (e) {
return "No state report available yet. You may need to navigate to a page first.";
}
},
});
export const availableTools = [navigateTool, clickElementTool, fillInputTool, getPageStateTool];
实操心得 :上述示例使用了文件系统进行指令传递,这仅适用于原型验证。在生产环境中,强烈建议使用更可靠的IPC机制,如通过
cy.task()在Cypress和Node.js主进程间建立双向通信。这样可以实现实时的指令下发与状态回传,效率更高,也更稳定。
3.3 构建AI智能体并制定测试策略
接下来,在 agent-orchestrator.js 中,我们创建智能体,并为其设计一个高效的测试策略提示词。
import { ChatOpenAI } from "@langchain/openai";
import { pull } from "langchain/hub";
import { createReactAgent } from "langchain/agents";
import { availableTools } from "./tools.js"; // 假设工具定义在tools.js中
import dotenv from 'dotenv';
dotenv.config();
async function runAgent() {
// 1. 初始化大模型
const llm = new ChatOpenAI({
modelName: "gpt-4o", // 或 "gpt-4-turbo-preview",理解能力更强
temperature: 0.1, // 低温度,确保输出稳定、可重复
openAIApiKey: process.env.OPENAI_API_KEY,
});
// 2. 从LangChain Hub拉取一个预设的Agent提示词,或自定义
// const prompt = await pull("langchain-ai/react-agent-prompt");
const prompt = `
你是一个资深前端测试自动化专家,负责通过控制浏览器来测试Web应用。
你的目标是理解用户的测试指令,并一步步地、可靠地执行它。
你拥有以下工具:
{tools}
请严格按照以下规则行动:
1. **始终先观察**:在执行任何操作(尤其是点击、输入后)之前或之后,使用 get_page_state 工具确认当前页面状态。不要连续执行两个操作而不检查状态。
2. **描述要精准**:使用 click_element 和 fill_input 时,对元素的描述要尽可能具体、唯一。例如,优先使用“带有‘登录’文字的按钮”,而不是模糊的“那个按钮”。
3. **循序渐进**:将复杂任务分解为小步骤。例如,“登录”任务应分解为:导航到登录页 -> 输入用户名 -> 输入密码 -> 点击登录按钮。
4. **验证结果**:在任务的关键节点(如点击登录后),通过观察页面状态(URL变化、出现新元素等)来验证操作是否成功。
5. **如果卡住**:如果一个操作失败(从状态报告中看不到预期变化),尝试重新描述元素,或回到上一步。如果多次失败,停止并报告问题。
当前任务:{input}
请开始你的测试。每次只执行一个操作,然后等待观察结果。你的思考过程应放在“Thought:”部分,动作放在“Action:”部分。
`;
// 3. 创建Agent执行器
const agentExecutor = await createReactAgent({
llm,
tools: availableTools,
prompt,
});
// 4. 运行Agent,输入测试指令
const result = await agentExecutor.invoke({
input: "测试使用标准用户(用户名: testuser, 密码: Test1234!)成功登录我们的演示应用。登录页面的URL是 http://localhost:3000/login。",
});
console.log("Agent执行结果:", result.output);
}
runAgent().catch(console.error);
3.4 改造Cypress作为指令执行器
Cypress需要被改造成一个“命令执行服务器”。我们创建一个特殊的测试文件,例如 cypress/e2e/ai_runner.cy.js 。
// cypress/e2e/ai_runner.cy.js
describe('AI Agent Test Runner', () => {
it('executes commands from AI agent', () => {
// 设置一个基础URL,或从指令中读取
const baseUrl = 'http://localhost:3000';
let currentState = {};
// 定义一个函数,用于将AI的抽象指令转换为Cypress命令
const executeCommand = (command) => {
switch(command.action) {
case 'visit':
cy.visit(command.url);
// 访问后收集状态
cy.url().then(url => currentState.url = url);
cy.title().then(title => currentState.title = title);
// 可以收集更多信息,如页面关键文本
cy.get('body').then($body => {
currentState.visibleElements = $body.find('button, input, a').toArray().map(el => ({
tag: el.tagName,
text: el.innerText?.substring(0,50),
id: el.id,
classes: el.className
}));
});
break;
case 'click':
// 这里是一个简化版!实际中,需要根据command.description智能定位元素。
// 例如,可以调用一个辅助函数来解析描述并生成选择器。
cy.contains('button, a', command.description).first().click();
cy.wait(1000); // 简单等待页面反应
// 点击后更新状态
cy.title().then(title => currentState.title = title);
break;
case 'type':
// 同样需要智能定位输入框
cy.get(`input[placeholder*="${command.description}"], label:contains("${command.description}") + input`).first().type(command.text);
break;
default:
cy.log(`Unknown action: ${command.action}`);
}
// 命令执行后,将当前状态写入报告文件,供AI的get_page_state工具读取
cy.task('writeStateReport', currentState, { log: false });
};
// 主循环:持续读取指令文件并执行
cy.readFile('cypress/commands/next_command.json', { timeout: 30000 }).then((str) => {
const command = JSON.parse(str);
executeCommand(command);
// 执行完后,可以删除或清空指令文件,等待下一条指令
cy.task('clearCommandFile', null, { log: false });
});
});
});
同时,需要在 cypress.config.js 中配置 cy.task 来实现Node.js端的文件操作。
// cypress.config.js
const { defineConfig } = require("cypress");
const fs = require('fs').promises;
const path = require('path');
module.exports = defineConfig({
e2e: {
setupNodeEvents(on, config) {
on('task', {
writeStateReport(state) {
const reportPath = path.join(__dirname, 'reports', 'current_state.json');
return fs.writeFile(reportPath, JSON.stringify(state, null, 2)).then(() => null);
},
clearCommandFile() {
const cmdPath = path.join(__dirname, 'commands', 'next_command.json');
return fs.writeFile(cmdPath, '{}').then(() => null);
}
});
},
},
});
至此,一个最基础的AI-Cypress智能体闭环就搭建完成了。运行流程是:启动AI协调器 -> AI生成导航指令写入文件 -> 启动Cypress运行 ai_runner.cy.js -> Cypress读取指令并执行 -> Cypress将状态写入报告 -> AI读取报告并生成下一步指令。
4. 核心挑战与优化策略实录
将构想落地为稳定可用的系统,中间会遇到无数坑。下面是我在实践过程中遇到的核心挑战及对应的优化策略。
4.1 元素定位的“罗生门”:从描述到选择器
问题 :AI工具 click_element 和 fill_input 接收的是自然语言描述(如“登录按钮”),但Cypress需要的是精确的选择器(如 cy.get(‘[data-cy=“submit”]’) )。如何实现精准转换?
初期方案(易错) :让AI直接输出选择器。但大模型对DOM结构理解不稳定,输出的选择器(如 #root > div > form > button:nth-child(3) )极其脆弱,页面微调就会失效。
优化策略 :采用 混合定位策略 。
- 语义化属性优先 :在开发阶段,强制要求为关键交互元素添加测试专用属性,如
data-cy或data-testid。这是最可靠的方式。AI协调层可以维护一个“描述-选择器”的映射表(可动态学习更新),优先使用映射表中的选择器。 - 多模态融合 :当语义化属性缺失时,结合多种信息生成候选选择器:
- 文本内容 :使用
cy.contains()。AI的描述中常包含元素文本。 - 角色和标签名 :按钮(
button)、链接(a)、输入框(input)。 - 视觉位置(进阶) :集成轻量级目标检测模型,对截图进行分析,获取元素的边界框坐标,再通过Cypress的
cy.get(‘body’).click(x, y)进行近似点击。这可以作为最后的手段。
- 文本内容 :使用
- 投票与回退机制 :AI可以生成2-3个可能的选择器,Cypress依次尝试,直到其中一个成功。全部失败后,将当前页面HTML片段和失败信息反馈给AI,让其分析原因并生成新的策略。
实操心得 :不要指望AI一次性给出完美选择器。设计一个“尝试-反馈-调整”的循环至关重要。在Cypress执行层,将
cy.get包装在一个带有友好错误处理和重试逻辑的函数中,失败时能捕获错误截图和DOM上下文,并将其作为宝贵反馈送回给AI分析。
4.2 状态感知与异步等待的博弈
问题 :Web应用充满异步操作(API调用、动画、懒加载)。AI发出“点击提交按钮”指令后,如何知道页面何时进入“可进行下一步”的稳定状态?传统的 cy.wait(5000) 既低效又不稳定。
优化策略 :建立 主动状态感知与条件等待 机制。
- 定义“稳定状态”信号 :与开发团队约定,在关键状态转换后,页面应留下明确的“标记”。例如,登录成功后,URL应跳转到
/dashboard,或页面应出现一个带有data-state="logged-in"属性的元素。AI的get_page_state工具应重点收集这些信号。 - 丰富状态报告 :除了标题和URL,状态报告应包含:
- 关键元素的存在性 :检查几个代表页面加载完成的元素是否存在。
- 网络请求状态 :利用Cypress的
cy.intercept()监听特定API请求是否完成。 - 应用特定状态 :通过
window对象或全局变量获取前端应用状态(如Redux store)。
- 让AI学会等待 :在System Prompt中明确教导AI:“在触发可能导致页面重大变化的操作(如提交表单、导航)后, 必须 立即调用
get_page_state工具,并检查状态报告中的关键信号是否出现。只有确认信号出现后,才能进行下一步。”
4.3 测试用例的生成、维护与演化
问题 :AI生成了测试步骤,但这些步骤是“黑盒”。如何将其转化为可维护、可读的Cypress测试代码?如何应对需求变更?
优化策略 :实施**“录制-生成-优化”** 工作流。
- 录制阶段 :AI智能体执行测试,同时 录制 两样东西:一是高层的 操作意图序列 (JSON格式),二是最终成功的 具体Cypress命令序列 。
- 生成阶段 :将录制下来的成功命令序列,通过模板自动生成结构化的Cypress测试文件(
.cy.js)。这个文件是纯代码,可纳入版本控制。 - 优化阶段 :工程师审查生成的测试代码,进行重构:提取公共操作到自定义命令、使用更健壮的选择器、添加清晰的断言和注释。这个优化后的版本成为新的“黄金标准”。
- 演化与修复 :当页面变更导致测试失败时,可以再次启动AI智能体,让其基于旧的“操作意图序列”和新的页面状态,尝试探索新的路径来完成任务。成功后,录制新的命令序列,并可与旧序列进行差异比对,辅助工程师快速更新测试代码。
这个策略将AI定位为“ 测试探索者 ”和“ 初稿生成器 ”,而工程师则是“ 架构师 ”和“ 代码优化者 ”,两者优势互补。
5. 典型问题排查与效能提升技巧
在实际运行中,你会遇到各种光怪陆离的问题。下面是一个快速排查指南和几个提升效能的独家技巧。
5.1 常见问题速查表
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| AI一直重复同一个操作或“卡住”。 | 1. 状态报告没有更新或内容不变。 2. AI未能从状态中识别出变化信号。 3. 提示词中缺乏明确的“停止”或“下一步”条件。 |
1. 检查Cypress的 writeStateReport 任务是否成功执行,报告文件是否被更新。 2. 增强状态报告内容,加入更独特的标识,如主要区域的文本哈希。 3. 在Prompt中明确告诉AI:“如果你连续两次看到相同的状态报告,意味着操作可能未生效,请尝试替代方案或终止任务并报告。” |
| AI生成的选择器总是找不到元素。 | 1. 页面结构动态加载,元素尚未出现。 2. AI对元素的描述过于模糊。 3. 使用了框架特有的选择器(如Vue的 scoped 样式)。 |
1. 在Cypress执行层为 cy.get 添加重试和超时逻辑: cy.get(selector, { timeout: 10000 }) 。 2. 要求AI在描述中结合文本、邻近元素、角色等多重信息。 3. 优先推动使用 data-* 测试属性,这是最根本的解决方案。 |
| 测试执行速度非常慢。 | 1. 每次操作后都调用 get_page_state ,涉及文件IO或网络请求。 2. AI模型响应慢。 3. Cypress命令间等待时间过长。 |
1. 将状态通信从文件改为内存或更快的IPC(如WebSocket)。 2. 考虑使用更快的模型(如GPT-3.5 Turbo)进行常规步骤推理,仅在复杂决策时调用GPT-4。 3. 用 cy.intercept() 等待特定网络请求代替固定的 cy.wait() 。 |
| AI无法处理验证码、滑块等非标准控件。 | 这些是经典的自动化测试难题,AI同样无法直接解决。 | 1. 环境隔离 :在测试环境中禁用此类验证。 2. 后门机制 :提供测试专用的绕过接口(如一个特殊的测试验证码)。 3. 混合处理 :识别到此类控件时,AI暂停并通知人工处理,或调用专门的三方服务(风险高)。 |
5.2 效能提升实战技巧
-
缓存与记忆化 :AI在分析页面状态(尤其是大段HTML)时消耗大量token。可以设计一个缓存机制,对页面结构进行哈希。如果两次状态请求间页面哈希未变,则直接返回缓存的分析结果,避免重复调用大模型,节省成本与时间。
-
分层测试策略 :不要所有测试都用重量级的AI智能体。
- 单元/组件测试 :用传统的Jest/Vitest。
- 集成测试 :用Cypress编写精准、稳定的测试套件。
- 探索性测试/用例生成 :用AI智能体。将AI用于它最擅长的“探索”和“创造”,而非重复执行。
-
建立元素描述知识库 :在项目Wiki或数据库中,维护一个“用户常用语-标准元素描述”的映射表。例如,用户常说“保存按钮”,但项目中标准描述是“主要操作按钮”。在AI的System Prompt中引入这个知识库,能极大提高指令解析的准确性。
-
设置清晰的终止条件 :在Prompt中明确告诉AI任务的终点是什么。例如:“当你看到页面URL包含
/dashboard且出现了‘欢迎回来,[用户名]’的文本时,意味着登录成功,请输出最终的成功报告并停止。” 这能防止AI在任务完成后继续无意义操作。
6. 未来展望与团队落地建议
虽然AI智能体赋能Cypress仍处于早期阶段,但它已经展示了改变测试工作流的潜力。它不仅仅是“自动生成代码”,更是向“ 基于意图的测试 ”和“ 自适应测试 ”迈进了一步。
对于想要在团队中引入这项技术的同行,我的建议是:
- 从小处着手 :选择一个具体的、痛点明显的场景开始POC,比如“自动修复失败的测试选择器”或“为新功能模块快速生成基础测试流”。用实际效果赢得团队信任。
- 明确人机边界 :现阶段,AI是强大的副驾驶,不是自动驾驶。工程师需要负责设计测试策略、审查AI生成的用例、处理复杂异常和确保测试套件的整体质量与架构。
- 投资基础设施 :将AI智能体与测试平台集成,提供友好的界面来触发AI测试、查看执行录像、审核生成的代码。良好的工具链能降低使用门槛。
- 关注成本与ROI :大模型API调用有成本。需要监控使用量,评估其节省的人工时间是否覆盖成本。对于内部系统,可以考虑微调开源模型来降低长期成本。
这个领域变化飞快,新的模型、新的Agent框架层出不穷。保持关注,持续实验,最重要的是,始终以解决实际测试问题、提升研发效能为核心目标,而不是为了用AI而用AI。毕竟,再智能的Agent,也是为我们工程师服务的工具。
更多推荐


所有评论(0)