Skip to main content

AI 驱动的测试(2025+ 新方向)

2025+ 测试领域最大的变化是 AI 双向渗透

  1. AI 帮人写测试 / 修测试(AI 提效)
  2. 测试 AI 应用(AI 产品上线前要 QA)

两者都是前端/全栈面试新热点。

一、避坑指南

  1. AI 生成 ≠ 免 review

    • AI 写的测试必须人工过一遍,定位器断言可能全错
    • AI 容易「通过即胜利」,但断言不到位(如 expect(true).toBe(true)
  2. AI 测试工具 ≠ 万能:

    • 探索测试(AI agent 跑用例)还是脆弱,仅适合冒烟,不替代核心 E2E
    • 视觉回归 AI(Meticulous)抗小变化,但抗不了大改版
  3. 测试 AI 应用(LLM) 别陷入「用 LLM 测 LLM」循环:

    • 评估 prompt 质量需要人评 + 指标
    • 不要完全依赖 LLM-as-judge

二、AI 帮我们写测试

2.1 AI 生成测试代码

工具能力适合
GitHub Copilot自动补全单测函数体工具函数 / hooks
Cursor / Trae根据组件代码生成测试文件组件测试
Claude Code / Copilot Workspace一次性生成完整 describe 块集成测试
CodiumAI / Qodo专门做 AI 测试生成多场景覆盖
Diffblue CoverJava 专用(自动生成单测)后端服务

实战示例(Cursor / Trae):

// 你给 AI 一段组件
export function add(a: number, b: number) {
return a + b;
}

// AI 自动生成(质量通常不差)
describe("add", () => {
it("正数相加", () => {
expect(add(2, 3)).toBe(5);
});
it("负数相加", () => {
expect(add(-1, -2)).toBe(-3);
});
it("0", () => {
expect(add(0, 0)).toBe(0);
});
it("浮点", () => {
expect(add(0.1, 0.2)).toBeCloseTo(0.3); // ✅ 浮点处理细节,AI 也知道
});
});

建议:把项目规范写进 AGENTS.md(见 AI 编码工具协同规范),让 AI 生成的测试符合你的风格(用 screen.getByRole 而不是 querySelector)。

2.2 AI 自动修复 flaky tests

Flaky test = 时过时不过的测试,是 CI 最大杀手。

传统方案

  • 重试(retries: 2
  • 加大等待
  • 找不到根因

AI 方案

工具能力
Playwright Agent自愈定位器(UI 改了自动重试)
Stagehand(Browserbase)AI 驱动浏览器,UI 改了大半也能跑
testRigor自然语言写测试,AI 解析
Mabl自愈 + 自动重跑失败用例

Playwright Agent 示意

// 传统:UI 一改测试就挂
await page.locator(".btn-submit-v2").click(); // 改名了!

// Agent:AI 找相似语义的元素
await page.getByRole("button", { name: /提交|确认|保存/ }).click();

2026 现状:AI 自愈还不成熟,仅适合「元素改名」级别的小变化,组件结构大改还是挂。

2.3 AI 视觉回归

传统视觉回归(Playwright toHaveScreenshot)用像素对比,字体抗锯齿、subpixel 渲染都会导致误报。

AI 视觉回归方案

工具能力价格
Meticulous.ai模拟真实用户视角,抗微小变化付费
ChromaticStorybook 视觉回归,云端 AI 校对部分免费
Percy类似 Chromatic,集成 CI付费
自训练模型收集历史截图训练「设计规范模型」成本高

vs 像素对比

维度像素对比AI 视觉回归
抗字体渲染❌ 经常误报✅ 智能忽略
抗抗锯齿
抗布局微调
大改版✅ 直接挂⚠️ 需重新训练
速度慢(云端 AI 推理)

建议新项目用 Playwright toHaveScreenshot 起步,日均误报 > 5% 再考虑 AI 视觉回归。

三、测试 AI 应用(2025+ 面试高频

AI 产品上线前要 QA,怎么测 LLM 的输出? 是新方向。

3.1 LLM 输出评估的挑战

// 传统断言
expect(translate("Hello")).toBe("你好");

// LLM 输出(每次可能不同)
const output = await llm.invoke("把 Hello 翻译成中文");
// output = "你好" / "您好" / "哈啰" —— 都对,但断言写啥?

核心难点

  • 输出是非确定性的(每次不同)
  • 正确答案可能多个
  • 没法用 toBe 断言

3.2 评估方法

① 人工评估(最准)

抽样让真人打分。评估 prompt 质量的金标准

② 指标评估

// RAGAS 评估 RAG 系统
import { evaluate } from "ragas";

const result = await evaluate({
dataset: {
questions: ["Next.js 是什么?", "React 和 Vue 哪个好?"],
ground_truths: ["Next.js 是 React 全栈框架", "看场景..."],
},
metrics: [
"answer_relevancy", // 答案相关性
"faithfulness", // 忠实度(不瞎编)
"context_precision", // 上下文精确度
"context_recall", // 上下文召回率
],
});
指标含义适用
answer_relevancy答案和问题匹配度通用
faithfulness答案是否忠于检索内容(不编)RAG
context_precision检索的上下文是否精准RAG
context_recall是否检索到必要信息RAG
hallucination编造率(越低越好)通用
toxicity毒性(越低越好)对话

③ LLM-as-judge(用 LLM 评估 LLM

import OpenAI from "openai";

async function judgeAnswer(question: string, answer: string): Promise<number> {
const prompt = `
评估下面回答的质量(0-10 分):

问题:${question}
回答:${answer}

评分标准:
- 相关性
- 准确性
- 完整性

只输出一个数字:
`;

const res = await openai.chat.completions.create({
model: "gpt-4",
messages: [{ role: "user", content: prompt }],
temperature: 0, // 评估要稳
});

return Number(res.choices[0].message.content);
}

风险:LLM-as-judge 有偏差(偏好自己模型的输出),不能 100% 替代人评

④ 单元化 + 黄金样本

// 准备一组「标准问答」
const goldenQA = [
{ q: "Next.js 是什么?", expectedKeywords: ["React", "全栈", "框架"] },
{ q: "如何重置 React 状态?", expectedKeywords: ["key", "remount"] },
];

test.each(goldenQA)("答案包含关键概念", async ({ q, expectedKeywords }) => {
const answer = await llm.invoke(q);
for (const kw of expectedKeywords) {
expect(answer).toContain(kw); // 弱断言:包含关键词
}
});

优点:CI 可跑、可回归;缺点:关键词不全等于「答得对」。

3.3 Agent 测试

Agent = LLM + 工具调用(function calling)。测试 Agent 更难。

测试维度

维度怎么测
任务完成率给任务,跑 N 次,看成功率
工具调用正确性断言调了哪些工具、参数对不对
规划能力多步任务,看路径是否合理
回退能力工具失败时能否换方案
成本一次任务消耗的 token 数
// 伪代码
test("Agent 能订外卖", async () => {
const result = await agent.run("帮我订一份麦当劳");
expect(result.success).toBe(true);
expect(result.toolCalls).toContain("search_restaurant");
expect(result.toolCalls).toContain("place_order");
expect(result.tokenCount).toBeLessThan(5000);
});

3.4 Prompt 回归测试

改 prompt 是高风险操作,改完要跑回归

// 1. 准备 prompt 变体
const promptVariants = {
v1: "你是助手,请回答:{q}",
v2: "你是一名资深工程师,请专业回答:{q}",
v3: "请用 100 字以内回答:{q}",
};

// 2. 跑同一组问题
const questions = ["Next.js 是什么?", "..."];

for (const [name, tmpl] of Object.entries(promptVariants)) {
test(`prompt ${name}`, async () => {
for (const q of questions) {
const answer = await llm.invoke(tmpl.replace("{q}", q));
expect(answer).toBeDefined();
// 可加:长度、关键词、LLM-as-judge
}
});
}

四、推荐工具(2025+ 主流)

方向工具用途
AI 生成单测Copilot / Cursor / CodiumAI / Qodo提速
AI 修 flakyPlaywright Agent / Stagehand / Mabl减维护成本
AI 视觉回归Meticulous / Chromatic / Percy抗 UI 微小变化
LLM 评估RAGAS / DeepEval / LangSmithRAG 质量
LLM 监控LangSmith / Helicone / Phoenix(Arize)生产环境追踪
Agent 测试LangSmith Agent Eval / LangChain EvaluationsAgent 任务成功率
Prompt 管理PromptLayer / Vellum / LangSmith Hub版本管理 + A/B

2026 主流组合

  • RAG 业务:LangChain + RAGAS + LangSmith
  • Agent 业务:LangChain + DeepEval + Phoenix
  • 生产监控:Helicone(成本 + 延迟 + 错误率)

五、CI 集成 AI 测试

# .github/workflows/llm-test.yml
name: LLM Eval
on: [pull_request]

jobs:
llm-eval:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- run: pnpm install

# 1. 跑 RAGAS 评估(要 LLM API key)
- name: 跑 LLM 评估
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: pnpm eval:ragas

# 2. 检查指标是否退化
- name: 检查指标
run: |
SCORE=$(cat eval-results.json | jq '.faithfulness')
if (( $(echo "$SCORE < 0.8" | bc -l) )); then
echo "RAG faithfulness 退化到 $SCORE,要求 ≥ 0.8"
exit 1
fi

注意:CI 跑 LLM 评估会消耗 token建议只在 PR 改 prompt 时跑,日常 PR 跳过。

六、面试高频

Q1:怎么测 LLM 的输出?

A:四种方法组合:

  • 人工评估(最准,金标准)
  • 指标评估(RAGAS 的 faithfulness / answer_relevancy)
  • LLM-as-judge(用 GPT-4 给结果打分)
  • 黄金样本(断言包含关键词)

没有银弹,要多种方式组合。

Q2:AI 写的测试可信吗?

A:需要 review。AI 擅长:模板、断言套娃。不擅长:业务理解、关键边界。建议:AI 写 → 人审 → 加到主分支。

Q3:传统视觉回归和 AI 视觉回归怎么选?

A:传统(Playwright toHaveScreenshot):快、便宜、误报多。AI(Meticulous / Chromatic):慢、贵、误报少策略:日均误报 < 5% 用传统;> 5% 升级到 AI。

Q4:怎么测 AI Agent?

A:四维评估:① 任务完成率(跑 N 次看成功率);② 工具调用正确性;③ 规划能力(多步任务路径);④ 成本(token 消耗)。

Q5:改 prompt 怎么回归测试?

A:① 准备「黄金问答集」;② 跑所有 prompt 变体;③ 用指标(RAGAS / LLM-as-judge)对比;④ CI 阻断「指标退化」。

七、相关文档