上线与维护
测试
01MVP 代码模板的测试覆盖范围、运行命令和扩展建议
这套模板的测试目标是守住模板客户最容易改坏的地方:配置、路由、权限边界、支付入口、上传安全、共享包和公开页面。
三种测试怎么选? App 轻量测试和 Package 测试属于单元测试(不启动浏览器,跑得快,适合验证逻辑和结构);Playwright 属于 E2E 测试(端到端测试,启动真实浏览器,适合验证用户能感知的页面行为)。日常开发优先跑单元测试,发布前再跑 E2E。
项目包含三种测试:
- App 轻量测试(Node.js 原生 test runner):不需浏览器,快速验证配置、路由、文案和 API 边界。
- Package 测试(Vitest):验证共享包里的纯函数、provider、service 等可复用逻辑。
- Playwright 测试(真实浏览器):确认用户可见页面能正常打开、跳转和渲染。
运行命令
App 轻量测试 -- 快速验证配置和路由
pnpm --filter 01mvp-web testPackage 测试 -- 验证共享包逻辑
pnpm test:packagesSmoke 测试 -- 确认公开页面能打开
pnpm smoke生产构建 -- 确认代码能正常编译
pnpm build改动了 package 层代码时,建议跑更完整的校验命令,它会先做类型检查再跑 package 测试:
pnpm verify:packages当前覆盖范围
| 层级 | 命令 | 已覆盖内容 |
|---|---|---|
| App 轻量测试 | pnpm --filter 01mvp-web test | 模板配置、关键文案、账单入口、支付路由、上传校验、聊天 API 前置校验、Prisma 脚本约束 |
| Package 测试 | pnpm test:packages | 认证、权限、支付、积分、存储、缓存、配置、i18n、AI、ASR、内容审核、腾讯云、短信、邮件、日志、UI 基础组件 |
| Playwright smoke | pnpm smoke | 首页、登录、定价、文档、关于、联系、隐私政策、受保护页面跳登录、移动端核心公开页 |
| E2E 流程 | pnpm --filter 01mvp-web e2e | 更接近真实浏览器的导航、公开路由和登录保护检查 |
这几个层级是互补的:Node.js 测试跑得快,适合守住模板结构;Vitest 适合共享包;Playwright 适合确认页面真的能在浏览器打开。
App 轻量测试示例
import assert from "node:assert/strict";
import test from "node:test";
test("payment routes are mounted", async () => {
const source = await readFile(
new URL("../src/server/app.ts", import.meta.url), "utf8");
assert.match(source, /paymentsRouter/);
});这类测试放在 apps/01mvp-web/tests/*.test.mjs。需要真实浏览器的测试改用 Playwright。
Playwright 测试示例
import { test, expect } from "@playwright/test";
test("dashboard 未登录跳转登录页", async ({ page }) => {
await page.goto("/dashboard", { waitUntil: "domcontentloaded" });
await expect(page).toHaveURL(/\/auth\/login/);
});调试模式:pnpm exec playwright test --debug(在 apps/01mvp-web 目录下执行)。
什么时候补测试
不确定要不要写测试?简单原则:涉及钱、权限、登录的改动,必须有测试。其他改动建议有测试。
下面这些改动建议同步补测试:
- 新增 API route、Hono route、Server Action 或鉴权中间件
- 修改支付、积分、权限、上传、登录注册、数据库 schema
- 调整
packages/*中会被多个 app 复用的逻辑 - 修改公开文档路由、定价页、登录页、设置页、后台页
- 修复线上 bug(先写能复现问题的测试,再改实现)
测试放哪里
| 你要测什么 | 放在哪里 |
|---|---|
| 不需要浏览器的 app 结构、配置、路由边界 | apps/01mvp-web/tests/*.test.mjs |
| 共享 package 的纯函数、provider、service | 对应 packages/<name>/src/__tests__、test 或 tests |
| 用户可见页面、跳转、移动端渲染 | apps/01mvp-web/tests/*.spec.ts |
| 文档导航是否能打开 | 优先放入 tests/smoke.spec.ts |
| 需要真实外部服务的流程 | 放到预发环境脚本或单独 E2E,避免污染默认本地测试 |
默认原则:越靠近底层逻辑,测试越小;越靠近用户流程,测试越像真实浏览器操作。