Stacks测试体系完全指南:Bun单测、HTTP测试与Playwright E2E全覆盖
【免费下载链接】stacksModern, performant, optimized for DX & AX. Develop powerful apps, clouds & framework-agnostic libraries—faster.项目地址: https://gitcode.com/gh_mirrors/stack/stacks
Stacks 的测试体系围绕 Bun 原生测试运行器构建,一层是毫秒级反馈的Bun 单测,一层是覆盖 API 端点的HTTP 测试,顶层是驱动真实浏览器的Playwright E2E 测试,三层协同实现从函数到用户界面的全覆盖。本文用最短的路径带你跑通这套测试体系:一条命令启动、一个目录约定、一套断言风格,新手也能快速上手,无需额外安装重型测试框架。
🚀 30秒快速开始:一条命令跑通所有测试
Stacks 把测试能力内置在buddy命令集中,无需手动配置 Jest 或 Vitest。在根目录执行:
buddy test # 运行全部测试 buddy test:ui # 只运行浏览器 E2E 测试 buddy test:coverage # 运行并生成覆盖率报告这些脚本定义在 package.json 中,对应test、test:ui、test:coverage三个入口。项目级的全局初始化写在 tests/setup.ts:它会在每个测试文件执行前注入测试环境变量、调用setupTestEnvironment()搭建隔离环境,并补齐 Bun 非 DOM 运行时缺失的requestAnimationFrame垫片——这些细节框架已经替你处理好了。
🏛️ 测试金字塔:3 层结构各司其职
Stacks 的测试体系按“金字塔”分层组织,目录约定清晰:
| 层级 | 目录 | 关注点 | 典型速度 |
|---|---|---|---|
| 单元测试 | tests/Unit/ | 单个函数、类、模块 | 毫秒级 |
| 功能/HTTP 测试 | tests/Feature/ | API 端点、完整业务流 | 百毫秒级 |
| 浏览器 E2E | tests/Browser/ | 真实用户操作流程 | 秒级 |
测试文件统一命名为[Name]Test.ts,公共 fixture 放在tests/fixtures/。想深入阅读,官方测试文档分别位于docs/testing/getting-started.md(总览)、docs/testing/unit-tests.md(单测)、docs/testing/http-tests.md(HTTP)和docs/testing/browser-tests.md(浏览器测试)。
🔍 第一层:Bun 单测——最快反馈
单测直接使用bun:test的describe / it / expect语法,写法与 Jest、Vitest 几乎一致,但跑在 Bun 原生运行器上,速度更快。核心能力包括:
- 丰富断言:
toBe、toEqual、toThrow、toMatchObject,以及异步断言resolves/rejects; - 生命周期钩子:
beforeAll、beforeEach等,用于隔离状态; - Mocking:
mock()替换函数、spyOn()监控调用、mock.module()整模块替换,甚至可用setSystemTime()冻结时间测试过期逻辑。
单测的黄金法则:一个测试只验证一个行为、测试边界条件、外部依赖一律 Mock 而不真实调用。
🌐 第二层:HTTP 测试——像调接口一样写测试
功能测试面向 API 端点,@stacksjs/testing提供流畅的http客户端与actingAs(user)身份代理:
- 用
http.get/post/put/delete发出请求,断言状态码(200/201/422/404)与 JSON 结构; - 用
actingAs(admin)一行代码模拟不同角色,验证 401 未认证、403 无权限等安全边界; - 用
useTransaction()让每个测试在独立事务中运行,结束后自动回滚数据库,测试间互不污染。
这意味着你可以放心地断言“注册接口返回 201 且数据库多了一条用户”,而不必担心留下脏数据。
🎭 第三层:Playwright E2E——真实用户视角
浏览器测试用 Playwright 集成驱动无头浏览器,模拟真实用户的点击、输入、导航与响应式布局验证:
page.goto()、page.fill()、page.click()还原“加入购物车 → 结账 → 支付成功”这类完整流程;page.waitForSelector()、page.waitForFunction()用条件等待替代硬编码延时,避免 flaky(不稳定)测试;- 建议为关键元素加
data-testid属性并采用 Page Object 模式组织选择器,让 E2E 用例更稳定。
E2E 只覆盖核心用户旅程即可,细粒度逻辑交给单测——这正是测试金字塔存在的意义。
🗄️ 数据库测试:事务回滚 + 工厂模式
Stacks 内置了一组数据库测试工具,解决“测试数据从哪来、怎么清理”两大痛点:
- 工厂(Factories):
UserFactory.create()一行生成符合规则的真实测试数据,支持state('admin')状态变体和createMany()批量创建; - 事务回滚:
useTransaction()或手动beginTransaction/rollbackTransaction,保证每条用例从干净状态开始; - 数据库断言:
assertDatabaseHas、assertDatabaseMissing、assertDatabaseCount,直接校验数据库最终状态。
测试库在.env.test中配置,推荐sqlite://:memory:内存库换取极致速度;迁移脚本则集中存放在 database/migrations/ 目录。
🧩 Mocking:外部依赖一键替换
真实支付、邮件、队列会拖慢测试并引入不确定性。Stacks 的 Mocking 策略是“在边界上拦截”:mock.module()替换整个模块(如 Stripe 客户端)、mockServer模拟外部 HTTP 服务、队列用fake()+getFakeQueue()验证“订单创建后确实派发了确认邮件任务”,全程零副作用。
📊 覆盖率与最佳实践
- 通过
buddy test:coverage生成覆盖率报告,阈值可在bunfig.toml中配置,本项目测试根目录配置见 bunfig.toml; - 测试行为而非实现:断言“用户能下单”,而不是断言内部调用了哪个私有方法;
- 保持独立:用例之间不共享状态,可任意顺序、任意单跑;
- 外部服务全部 Mock:不真实扣款、不发真实邮件。
小结
Stacks 的测试体系 =Bun 原生速度 + Jest 式语法 + 数据库事务工具 + Playwright E2E。新手只需记住三件事:单测放tests/Unit/、API 测试用http客户端加useTransaction()、用户流程用 Playwright 驱动浏览器;然后一条buddy test命令即可验证你的应用从函数到界面的每一层质量。
【免费下载链接】stacksModern, performant, optimized for DX & AX. Develop powerful apps, clouds & framework-agnostic libraries—faster.项目地址: https://gitcode.com/gh_mirrors/stack/stacks
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考