Testing
Simmetric Chat 使用 Jest 30 配合 @swc/jest 转换(unit + integration)以及 Playwright(E2E),由 Turborepo 编排。根 jest.config.cjs 聚合 5 个项目(shared、server、frontend、collector、widget)。
Simmetric Chat 使用 Jest 30 配合 @swc/jest 转换(unit + integration)以及 Playwright(E2E),由 Turborepo 编排。根 jest.config.cjs 聚合 5 个项目(shared、server、frontend、collector、widget)。
层级
| 层级 | Runner | DB | Scope |
|---|---|---|---|
| Unit | Jest 30 + @swc/jest | mock Prisma(无 DB) | service、utility、validation |
| Integration | Jest 30 + supertest 7 | 真实 PostgreSQL worker | route、middleware、DB 流程 |
| E2E | Playwright | 完整 app | UI user-facing(13 spec) |
Unit test
通过 jest.mock mock Prisma(无真实 DB)。测试:service(RAG、backup、encryption、DLP、agent budget)、utility(RBAC、license、chunker)、Zod schema、webhook dispatch。Server unit:对重量级依赖(uuid、jsdom、pdfjs-dist、pg-boss...)使用 moduleNameMapper mock,并将 @simmetric-chat/shared 映射到 shared/dist(编辑后 rebuild shared - turbo ^build gotcha;frontend/widget 映射 source)。
pnpm test # 通过 turbo 运行全部 5 个 package(Postgres-free)
pnpm test:all # 通过 jest.config.cjs 运行同样 suite(纯 Jest)
pnpm --filter server test
pnpm --filter shared test约定:__tests__/ 中的 *.test.ts 文件紧邻 source(frontend 为 jsdom 环境中的 *.test.tsx)。Snapshot 仅用于确定性的 output(不用于 LLM)。用 jest.mock('../prisma') 隔离 DB;server unit 文件以 import "./helpers/setupEnv" 开头。
Integration test
在 localhost:5434 的真实 PostgreSQL worker DB(用于 .env.test)。模板 simmetricchat_test_template 按 test-file 克隆(path 的 SHA-256)以实现隔离。测试 Express route(supertest 7)、middleware(auth、RBAC、license、rate limit)、完整 DB 流程(workspace、chat、文档、backup restore)。collector 有一个专门的 integration suite,运行在 pgvector_test 端口 5433(jest.config.integration.cjs)。
Setup:
- 测试 env 变量(测试 DB、测试
JWT_SECRET、共享 secret - 记录在packages/server/.env.test)。 - 迁移应用于模板(
jest.globalSetup.js:migrate deploy + seed);每个 test 文件克隆一个全新的 DB;teardown 删除模板。 - 顺序运行(suite 可能读取缓存的
DATABASE_URL- 已知债务)。
pnpm --filter server test:integration # 包含 --forceExit
pnpm --filter collector test:integrationE2E(Playwright)
e2e/ 中有 13 个 spec。覆盖 user-facing 流程:auth/admin、chat streaming、chat edit/regenerate、document upload → RAG、unified upload destinations、widget embed、MCP install(marketplace lifecycle)、MCP pin/use、admin settings nav、synthesis run、RBAC UI(project sidebar)、theme switch。
pnpm test:e2e
# 带 UI:pnpm exec playwright test --ui前置条件:app up(pnpm dev 或 compose)、DB migrated、@simmetric-chat/shared + frontend build、browser 已安装(pnpm exec playwright install)。Playwright 自行启动 3 个 web server(后端 tsx、前端 vite preview、widget - 全部 reuseExistingServer);globalSetup 是幂等的(setup wizard → admin/admin123、widget E2E + E2E_WIDGET_ID、reset mustChangePassword)。配置在 playwright.config.ts(30s timeout、retries 2)。enterprise-gated spec 在没有 LICENSE_KEY 时自动跳过。
Coverage
Jest config 中未配置 coverage 阈值,coverage 也不是 CI gate;最近的质量 gate 是 test-count guard(community suite 上限 3900 个声明)。本地报告:
pnpm test:all -- --coverage
pnpm --filter server test -- --coverage写作重点放在关键 service:agent orchestrator、hybridSearch、backup、encryption、license、RBAC。
关键流程测试(checklist)
- 混合 RAG:vector + FTS + RRF fusion + fallback archive(D-07)+ guard embedding mismatch(D-01)+ metadata filtering(pre-filter + SQL predicate + server-side backstop)。
- Agent ReAct:loop detection、circuit breaker unknown-tool(BOT-03)、budget wallclock/token/context、per-user concurrency、fallback provider。
- Widget:匿名会话 + 过期、rate limit 双层(burst per-widget + daily per-widget+IP)、lead capture、IDOR prevention(whitelist
WidgetWorkspace)、透明 SSE proxy。 - Backup:dump → archive → checksum → upload retry → restore atomicity(psql single-transaction)+ retention。
- MCP:transport fallback(D-09)、install/uninstall、pin resolution(union strict)、health check(pg-boss cron、3 级 staleness)。
- License:graceful degradation Enterprise→Community、gating 402、数值限制。
调试 test
pnpm --filter server test -- src/__tests__/auth.test.ts # 按文件(位置参数)
pnpm --filter server test -- -t "测试名" # 按名称
pnpm --filter server test:integration -- --runInBand # 为 DB 串行
DEBUG=1 pnpm test:e2e -- --headedCI
Turborepo 缓存 test;典型 pipeline:lint → typecheck → test → test:integration → build → test:e2e。integration 的 worker DB 需要 CI 中的 PostgreSQL service(pgvector/pgvector:pg16)。测试相关 job:test-unit(+ air-gap grep gate + FTS locale gate + test-count guard)、test-airgap(NETWORK_EGRESS_BLOCKED=1)、test-e2e、build(+ freshness check)。
交叉链接
- 约定:10 - Development
- 被测试的内部实现:05 - Feature Guide