日期:2025-12-17
适用技术栈:Vue 3 + TypeScript + Vitest + Vue Test Utils
1. 为什么要做:这不是"为了写测试而写测试"
很多团队在引入自动化测试时会遇到一个现实问题:
- 业务复杂、改动频繁,测试总是"补不齐";
- 写测试成本高,投入回报不清晰;
- 跨部门协作(产品/业务/研发/测试/运维)信息不对齐,返工不断。
我更愿意把"AI 驱动测试"看成一套工程化协作机制:
- 业务价值:把"线上风险"前移到"提交代码之前",减少回归漏测导致的生产事故。
- 技术价值:以可测试性驱动代码结构更清晰(高内聚低耦合),更容易重构与优化。
- 协作价值:测试用例是可执行的需求说明,降低"口头沟通 → 误解 → 返工"的成本。
2. 目标与边界:我们到底要解决什么问题
2.1 目标(可量化)
- 回归成本:将关键模块回归从"人肉点点点"转为"可重复执行"。
- 质量门禁:让改动至少经过
unit/component级别的守护,减少合并后返工。 - 研发体验:让 AI 成为测试的"加速器",但最终质量由团队把控(可审、可维护、可扩展)。
建议的量化指标(按团队实际数据落地):
关键路径用例覆盖率(P0 业务)回归耗时(人时)缺陷逃逸率(上线后才发现的缺陷占比)跨部门澄清次数(需求/验收前后的沟通轮次)
2.2 边界(不做什么)
- 不追求"一开始就 90% 覆盖率",而是先覆盖最值钱的 P0 路径。
- 不把 AI 当作"最终裁判",AI 输出必须可读、可维护、可评审。
3. 方案总览:AI 在链路里扮演什么角色
AI 的定位不是"帮你写完所有测试",而是:
- 提供高质量初稿:减少从 0 到 1 的时间;
- 帮你做全路径枚举:把边界条件、异常场景补齐;
- 提供可复用模板:让团队形成一致的测试结构与 Mock 策略。
4. 技术架构:从"写测试"到"持续可运行"
4.1 架构图

4.2 关键原则(决定后续是否好维护)
- 测试贴近真实业务语义:断言"业务结果",而不是断言"实现细节"。
- 依赖可替换:API、UI 消息、路由、Store 都要有稳定的 Mock 入口。
- 分层清晰:API 测试验证请求组装;Composable 测试验证流程与状态;组件测试验证交互与渲染。
5. 目录与分层:让测试像产品一样可维护
推荐结构(与业务模块同级,便于定位与评审):
javascript
src/
api/
<domain>/<module>/
index.ts
types.ts
__tests__/
index.test.ts
views/
<domain>/<module>/
composables/
useXxx.ts
__tests__/
useXxx.test.ts
components/
Xxx.vue
__tests__/
Xxx.test.ts
核心点只有一个:测试跟着业务模块走,不要"全项目扔在 tests/ 里"。
6. 跨部门协作:测试用例如何降低沟通成本
跨部门协作的痛点往往不是"大家不努力",而是:
- 需求/验收口径散落在 IM、会议纪要、口头同步里;
- 开发理解的"正确"与业务/测试理解的"正确"不一致;
- 到上线前才集中爆雷。
把测试用例当成"可执行的验收标准",能显著降低沟通成本:
| 环节 | 常见问题 | 用测试的方式固化 |
|---|---|---|
| 需求澄清 | 口径易变,记录难追溯 | 把关键口径写成可读断言(Given/When/Then) |
| 开发自测 | 自测路径不全 | 用例清单驱动自测覆盖 |
| 测试验收 | 关键路径遗漏 | P0 用例作为验收门槛 |
| 上线回归 | 人工回归成本高 | CI 自动跑核心用例 |
7. 流程图:从需求到上线的"测试护城河"怎么建
sequenceDiagram
participant PM as 产品/业务
participant DEV as 开发
participant AI as AI 协作
participant QA as 测试
participant CI as CI
PM->>DEV: 提交需求/变更点(关键路径+异常口径)
DEV->>AI: 给上下文(接口、页面、状态机、边界)
AI-->>DEV: 输出测试初稿(API/Composable/组件)
DEV->>DEV: 调整可测性(抽依赖、拆分职责)
DEV->>QA: 评审用例(补缺、对齐口径)
DEV->>CI: 提交并触发测试
CI-->>DEV: 通过/失败报告
QA->>PM: 验收结论(以用例为依据)
8. 关键实现:AI 生成测试前,你得先让代码"可测试"
AI 写测试写得快,但如果你的代码:
- 逻辑散在组件里;
- 依赖直接
import、不可替换; - 状态与副作用耦合;
那测试会变得脆、难 Mock、改一点就全炸。
所以真正的"技术价值"在于:测试会倒逼你把架构做得更清晰。
落地建议(工程实践):
- 把"动作"沉到 composable:组件负责渲染与事件派发。
- 把"请求组装"沉到 API 层:便于单测请求参数。
- 把"副作用"集中管理:消息提示、下载文件、跳转路由。
9. 测试范式:3 类测试覆盖 80% 风险
9.1 API 层:验证"请求是否组装正确"
关注点:URL、method、payload、responseType(尤其是 Blob)。
ts
import { describe, expect, it, vi } from 'vitest'
vi.mock('~/axios.service', () => ({
default: {
post: vi.fn(),
get: vi.fn(),
},
}))
describe('api - export', () => {
it('应正确请求导出接口(Blob)', async () => {
const instance = (await import('~/axios.service')).default as any
instance.post.mockResolvedValueOnce(new Blob(['ok']))
const { exportEdiVgm } = await import('~/api/export/container-manage')
await exportEdiVgm({
type: 'IFTVGM',
vgmDtoList: [{ vesselCode: 'V', voyage: '001', currentPort: 'P', blNo: 'B', cntrNo: 'C' }],
})
expect(instance.post).toHaveBeenCalled()
})
})
9.2 Composable 层:验证"流程与状态"
关注点:空选中提示、成功/失败提示、刷新列表、是否触发下载。
9.3 组件层:验证"交互与渲染"
关注点:按钮禁用态、点击触发事件、loading 状态、弹窗开关等。
10. AI Prompt 模板:把上下文一次给对
AI 产出质量主要取决于输入的上下文。
diff
请为以下模块生成测试(Vitest + Vue Test Utils):
【被测文件】
- src/views/<domain>/<module>/composables/useXxx.ts
【业务说明】
- 该模块包含:发送/导出/下载
【接口约束】
- 发送接口:POST /system/edi/sendEdiVgm
- 导出接口:POST /system/edi/exportEdiVgm(Blob)
【必须覆盖】
- 空选中提示
- 成功提示 + 刷新列表
- 导出触发下载(文件名规则)
- API 失败提示
【Mock 约束】
- axios.service、ElementPlus 消息、路由、日期都需要可控
11. 常见坑与解决方案(更"工程"一点)
Blob导出容易被拦截器当 JSON:确保请求层显式responseType: 'blob'。- 断言不稳定:日期/随机数要可控(固定时间、固定随机种子)。
- Mock 过重:优先 Mock "边界层"(API、消息、路由),不要把内部实现全 Mock 掉。
- 用例太脆:尽量断言"输出/行为",减少对内部变量结构的断言。
12. 总结:为什么它能带来"长期价值"
AI 驱动测试的"短期收益"是更快写出测试;真正的"长期收益"是:
- 代码结构更清晰,更容易重构与优化;
- 核心链路可重复验证,上线更稳;
- 用例沉淀为可执行验收标准,跨部门沟通更低成本。
如果你在一个业务复杂、迭代快、且对稳定性有要求的前端项目里,这套方案值得从一个 P0 模块开始落地。
参考资料: