用途:指导如何编写以行为为中心的测试,遵循 Testing Trophy 模型,优先使用真实依赖,避免测试 mock 行为和污染生产代码等反模式。核心理念是测试用户可观察的行为,行为不变时测试应能在重构后继续通过。
测试类型优先级:集成测试(主要,多个单元配合真实依赖)、E2E 测试(次要,跨栈完整工作流)、单元测试(罕见,仅纯函数)。默认写集成测试,只有纯工具函数才降级为单元测试。决策规则:完整用户工作流用 E2E;无副作用的纯函数用单元测试;其余一律用真实依赖的集成测试。
写测试前流程:先查看项目既有测试与约定、理解应该做什么和可能出错之处、选择测试类型、区分真实与 mock 依赖、先写失败测试(TDD)、再写最小实现使其通过、最后核对覆盖正常、错误与边界情况。
Mock 准则:默认不 mock,只对以下情况 mock:外部 HTTP/API 调用、时间相关操作(定时器、日期)、随机性(随机数、UUID)、文件系统 I/O、第三方服务(支付、分析、邮件)、网络边界。不要 mock 内部模块、数据库查询(改用测试数据库)、业务逻辑、数据转换、自己的代码调用自己的代码。不确定时先跑真实实现观察需要再最小化 mock。
断言策略:断言可观察输出而非内部状态。UI 断言可见文本、可访问性角色、用户可见状态;API 断言响应体、状态码、响应头;CLI 断言 stdout/stderr、退出码;库断言返回值与有文档的副作用。避免 CSS 类、内部状态、私有方法、调用次数等实现细节。
异步等待:避免任意超时和 sleep,改用基于条件的等待(如 wait_for(lambda: result == expected)),资料中提及可参考 Skill(ce:condition-based-waiting) 获取条件轮询的详细指导。
测试数据:使用源码常量与 fixture,而非硬编码文案,便于产品文案变更时集中修改。
应避免的反模式:测试 mock 行为(断言 mock 被调用而非真实结果);在生产代码中加入仅供测试的方法(应放入测试工具);不理解依赖就 mock(会屏蔽测试真正需要的副作用);不完整的 mock(需镜像真实 API 的全部字段);把测试当事后补充(用 TDD 先写测试);任意超时或 sleep。
质量检查清单:覆盖正常路径、错误条件、边界情况;使用真实依赖且 mock 最小;异步等待基于条件;测试能在重构后存活;未在生产代码加测试专用方法;未断言 mock 存在或调用次数;测试名描述行为而非实现。不应测试:内部状态、私有方法、函数调用次数、实现细节、mock 是否存在、框架内部。
语言与框架细节:资料给出 JavaScript/React(React Testing Library、Jest/Vitest、Playwright)、Python(pytest fixtures、polyfactory、respx、testcontainers、FastAPI)、Go(表驱动测试、testify/go-cmp、testcontainers-go、接口 fake)的参考文件,具体内容暂未提供。
限制:未提供安装命令、平台、收费或版本信息。必备命令与具体代码示例暂未提供。