上线与维护

测试

01MVP 代码模板的测试覆盖范围、运行命令和扩展建议

这套模板的测试目标是守住模板客户最容易改坏的地方:配置、路由、权限边界、支付入口、上传安全、共享包和公开页面。

三种测试怎么选? App 轻量测试和 Package 测试属于单元测试(不启动浏览器,跑得快,适合验证逻辑和结构);Playwright 属于 E2E 测试(端到端测试,启动真实浏览器,适合验证用户能感知的页面行为)。日常开发优先跑单元测试,发布前再跑 E2E。

项目包含三种测试:

  • App 轻量测试(Node.js 原生 test runner):不需浏览器,快速验证配置、路由、文案和 API 边界。
  • Package 测试(Vitest):验证共享包里的纯函数、provider、service 等可复用逻辑。
  • Playwright 测试(真实浏览器):确认用户可见页面能正常打开、跳转和渲染。

运行命令

App 轻量测试 -- 快速验证配置和路由

pnpm --filter 01mvp-web test

Package 测试 -- 验证共享包逻辑

pnpm test:packages

Smoke 测试 -- 确认公开页面能打开

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 smokepnpm 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__testtests
用户可见页面、跳转、移动端渲染apps/01mvp-web/tests/*.spec.ts
文档导航是否能打开优先放入 tests/smoke.spec.ts
需要真实外部服务的流程放到预发环境脚本或单独 E2E,避免污染默认本地测试

默认原则:越靠近底层逻辑,测试越小;越靠近用户流程,测试越像真实浏览器操作。