用途
本技能用于指导前端测试的编写,核心原则是:先编写验证验收标准的测试,再在能提供价值的地方补充实现层面的测试。引用 Kent C. Dodds 的观点:“测试越接近软件的使用方式,能给你的信心就越多。”
该原则指导测试决策,但并非全部:
- 验收标准测试验证系统是否满足用户/干系人的需求,应在重构时保持稳定。
- 实现测试验证各部分的健壮性——边界情况、错误处理、复杂逻辑,重构时可能需要修改。
两者都有价值。需要避免的反模式是:测试只镜像实现,而不验证有意义的行为。
主要能力
- 从验收标准出发编写测试,防止循环验证(测试只是确认“代码做了代码所做的事”)。
- 将验收标准映射为测试用例,覆盖正常路径、边界情况和错误情况。
- 在验收测试通过后,补充实现层面的单元测试,覆盖边界值、算法正确性、错误处理路径、复杂分支逻辑和性能敏感代码。
- 根据场景选择测试类型:纯逻辑用 Vitest 单元测试;组件行为用 Vitest + Testing Library;用户流程和真实浏览器用 Playwright E2E;语义结构验证用 ARIA 快照;视觉外观用视觉回归测试;无障碍合规用 Playwright + axe-core。
- 使用语义化定位器,优先级为:getByRole(首选,查询无障碍树)、getByLabelText(表单字段最佳)、getByPlaceholderText(无标签时,不理想)、getByText(非交互元素)、getByAltText(图片)、getByTestId(最后手段)。
- 使用 ARIA 快照将多个断言合并为一个,验证语义结构。
- 单元测试的 DOM 环境优先使用 happy-dom 而非 jsdom,因为它更快,且其 API 限制可作为有用信号——如果 happy-dom 不支持你要测试的内容,可考虑是否应改为 E2E 测试。
使用方式
工作流分为五步:
- 从验收标准开始。在编写任何测试前,从用户视角识别代码应该做什么。可从工单描述、用户故事、Figma 标注、功能需求或产品负责人澄清中获取标准,记录为清单,作为第一批测试。在阅读实现之前编写验收测试。
- 将标准映射到测试用例。对每条标准识别正常路径、边界情况和错误情况。
- 添加实现测试(单元测试)。在验收测试通过后,为边界情况、算法正确性、错误处理路径、复杂分支逻辑和性能敏感代码添加单元测试。
- 选择测试类型(见上文测试类型选择)。
- 在代码之前或同时编写测试。理想是测试先行(TDD);可接受的是实现每条标准后立即编写测试;避免在实现“完成”后编写所有测试。
文档提供了单元测试(Vitest)、组件测试(Vitest + Testing Library)和 E2E 测试(Playwright)的代码结构示例,以及使用 ARIA 快照的 E2E 测试示例。当需要验证所有项目时,可使用 Promise.all 进行并行断言。
适用场景
- 编写单元测试(Vitest)。
- 编写端到端测试(Playwright)。
- 视觉回归测试。
- 无障碍审计。
- 结构验证。
限制与注意事项
需要避免的反模式包括:
- 只测试实现细节:仅验证内部方法存在或调用,而不验证可观察行为。
- 循环验证:从实现计算期望值,而非从需求获取。
- 过度 mock:mock 一切导致只是在测试 mock 之间的交互。应只 mock 外部边界(API、数据库、时间、文件系统),保留真实业务逻辑、组件和格式化器。
- 脆弱选择器:依赖实现的选择器(如 .btn-primary.submit-form 或 #root > div > form > button:nth-child(3)),应使用语义化定位器。
测试失败通常意味着 bug。验收测试失败时,先检查被测代码(可能是真实 bug),再确认测试是否仍匹配当前需求,只有在确认新行为正确后才更新测试。实现测试失败时,若在重构,测试可能需要合理更新;若未重构,检查代码(可能是 bug),并考虑测试是否与实现耦合过紧。不要条件反射地更新测试使其通过,要调查失败原因。
提交测试前的检查清单:每条验收标准至少有一个测试;覆盖标准中的边界情况;为复杂逻辑、错误处理、边界条件添加实现测试;测试命名具有描述性;使用语义化定位器;没有只验证“代码运行”而不验证有意义行为的测试;适当调查失败的测试;为交互组件包含无障碍检查;考虑使用 ARIA 快照进行结构验证。
参考文件:references/locator-strategies.md(完整定位器层级与示例)、references/aria-snapshots.md(结构验证、合并断言)、references/accessibility-testing.md(axe-core 集成、WCAG 定位)、references/visual-regression.md(截图测试、基线管理)。