Skip to content

Latest commit

 

History

History
43 lines (34 loc) · 7.96 KB

File metadata and controls

43 lines (34 loc) · 7.96 KB
name Testing
description Governs Vitest projects, test locations, environments, and coverage thresholds.
keywords
testing
vitest
coverage
renderer
main

Testing

范围

  • 覆盖:test/ 下的单元测试和集成风格测试、Vitest project 配置、测试环境和覆盖率门禁。
  • 不覆盖:手动 Electron QA 或发布打包验证。

规则

  • MUST 将测试放在生产源码之外,并在 test/ 下镜像相关 src/ 区域。domain-first 源码迁移时,测试也应跟随 src/main/ipc/<domain>/<area>.tssrc/main/services/<domain>/<area>/**src/main/domain/<domain>/<area>/**src/preload/api/<domain>/<area>.tssrc/renderer/src/api/<domain>/<area>.tssrc/renderer/src/stores/<domain>/** 的目录形状迁移。证据:AGENTS.mdtest/main/ipc/session/chat.spec.tstest/main/services/proposal/browser/proposal-status-service.spec.tstest/preload/api/session/chat.spec.tstest/renderer/src/stores/session/session.spec.tsvitest.config.mts
  • MUST 使用 .spec.test 扩展名命名测试文件,并匹配 vitest.config.mts 中的 Vitest include patterns。
  • MUST 使用 pnpm test 运行完整测试套件;该命令映射到 vitest run。证据:package.json
  • MUST 将 renderer 测试保留在 renderer Vitest project 中,使用 happy-dom、启用 globals、加载 test/renderer/src/setup.ts,并包含 test/renderer/src/**/*.{test,spec}.{ts,vue} 下的测试。证据:vitest.config.mts
  • MUST 将 main/preload/shared/MCP 测试保留在 main Vitest project 中,使用 Node 环境、30s test 和 hook timeout、加载 test/main/setup.ts,并包含 test/maintest/preloadtest/mcp-serverstest/shared 下的测试。证据:vitest.config.mts
  • MUST 为 Workflow Engine 保持 domain → service/runner → IPC/MCP → lifecycle 的分层测试:test/main/domain/automation/workflow/** 只测试 v2 parser、capability preflight 和纯 state machine;test/main/services/automation/workflow/** 测试唯一 Engine、serialized Run、fresh Agent/exec Action、RPC bridge;test/main/infra/storage/workflow-*.spec.ts 测试 Workspace path、atomic snapshot、transcript/log 和 legacy inert;不得用集成测试掩盖 domain contract 缺少单元覆盖。证据:src/main/domain/automation/workflow/**src/main/services/automation/workflow/**src/main/infra/storage/workflow-*.ts、对应 test 目录。
  • MUST 为 Workflow Run IPC 和 bundled MCP 分别测试 owner boundary 与 transport boundary:test/main/ipc/automation/workflow-run*.spec.ts 覆盖 Workspace/parent/run authorization、wake payload、debounce 和 shutdown 后拒绝;test/main/infra/mcp/bundled-mcp-host.spec.ts、registry/activation tests 覆盖 server-neutral codec、fyllo-spawn 回归、HTTP-only 与 fresh allowlist;test/main/services/automation/workflow/workflow-rpc-bridge.spec.tstest/mcp-servers/fyllo-workflow/** 覆盖 trusted caller、schema strictness、rejected result 和 request cancellation。
  • MUST 为 Renderer Workflow Run 保持与 spawned Session 分离的回归测试:test/renderer/src/stores/automation/workflow-run.spec.ts 覆盖 owner-keyed list/detail、interest ref-count、wake 无 interest 不 pull、generation 丢弃迟到响应和 approve/reject;test/renderer/src/features/workflow-run-inspector/** 覆盖纯 projection、ActivityEntry/detail UI、fresh transcript identity;test/renderer/src/components/chat-background-activity-bar.spec.ts 覆盖 WorkflowRunActivityEntry 与 SpawnedSessionActivityEntry 平级且 spawned count 不被改变。Workflow definition CRUD 继续由 test/renderer/src/stores/automation/workflow.spec.ts 与 workflow page tests 覆盖,不能把两种状态合并到一个 store fixture。
  • SHOULD 使用 git mv 迁移测试文件,保留重构前后的文件历史;只有拆分或合并测试职责时才新增文件或删除旧文件。
  • MUST 在单元测试中通过测试 setup 或聚焦测试 helper mock 依赖 Electron 的主进程能力,而不是启动真实应用。证据:test/main/AGENTS.mdtest/main/setup.ts
  • MUST 将多窗口主进程行为测试放在对应 main 镜像目录:窗口生命周期和 WorkspaceWindowManager 放在 test/main/bootstrap/,窗口 IPC 放在 test/main/ipc/,窗口状态存储放在 test/main/infra/storage/。证据:test/main/bootstrap/workspace-window-manager.spec.tstest/main/ipc/workspace/window.spec.tstest/main/infra/storage/window-state-store.spec.ts
  • SHOULD 在 renderer store/component 测试中显式覆盖 launcher context、workspace context、bound-currentcreated / focused-existing 打开结果,避免组件绕过 window API 直接修改 currentWorkspace。证据:test/renderer/src/stores/workspace/workspace.spec.tstest/renderer/src/components/app-header.spec.tstest/renderer/src/components/welcome-view.spec.ts
  • MUST 为 Workspace cutover 保留分层测试:migration fixtures 覆盖 collision、partial target、数据转换与 legacy source 保留;bootstrap 测试覆盖 required gate 的无副作用失败路径;storage/window/renderer 测试覆盖相同 record ID 跨 Workspace 隔离和迟到响应隔离。证据:test/main/migrations/scripts/project-to-workspace.spec.tstest/main/bootstrap/index.spec.tstest/main/infra/storage/workspace-storage-inventory.spec.tstest/renderer/src/stores/workspace/workspace.spec.ts
  • MUST 为 Workspace lifecycle 保留分层测试:domain 覆盖成员/path 纯规则,services 覆盖 create/edit/reference/relocation/cleanup 状态机,IPC 覆盖 window/runtime cleanup 顺序,renderer 覆盖 launcher 两类 identity、两阶段确认、deleted manager 与 navigation gate 一致性。证据:test/main/domain/workspace/model.spec.tstest/main/services/workspace/workspace/workspace-lifecycle-service.spec.tstest/main/services/workspace/folder/folder-registry-service.spec.tstest/main/ipc/workspace/workspace.spec.tstest/renderer/src/components/workspace-launcher-lifecycle.spec.ts
  • MUST 将 app startup/shutdown 顺序测试放在 test/main/bootstrap/:覆盖 first-visible barrier 前无重型工作、同窗 handoff、protected migration、phase 串并行、单一绝对 deadline、force pending/失败、重复 quit 与 Windows session-end。Workflow Engine 必须在 bundled MCP readiness 后再 reconcile,在 quiesce/settle 阶段拒绝新 trigger、取消 handles、尽力落盘并在 ACP process pool/auxiliary process terminate 前完成 bounded dispose/force;parent deletion 的 cancellation ordering 放在对应 session service 测试。资源 owner 的 PID/process-group 和 graceful/force 行为放在对应 infra/service 镜像目录;lifecycle-boundaries.spec.ts 必须扫描并禁止 service/infra 通过 import side effect 注册全局顺序。Renderer 的 critical/background、无 Welcome flash、static startup 和 reduced-motion 放在 test/renderer/src/。证据:test/main/bootstrap/runtime.spec.tstest/main/bootstrap/shutdown.spec.tstest/main/bootstrap/lifecycle.spec.tstest/main/bootstrap/lifecycle-boundaries.spec.tstest/main/services/session/chat/chat-service.spec.tstest/main/infra/process/acp-process-pool.spec.tstest/main/infra/mcp/bundled-mcp-host.spec.tstest/renderer/src/app-startup.spec.tstest/renderer/src/startup-page.spec.ts
  • SHOULD 测试 renderer 组件状态和交互,而不是 @nuxt/ui 内部实现。现有 renderer 测试使用 test/renderer/src/setup.ts 为 UI 组件提供 stub。证据:test/renderer/src/AGENTS.md
  • MUST 保持覆盖率强制阈值非零。vitest.config.mts 要求 statements 50、branches 40、functions 50、lines 50;pnpm test:coverage 运行 vitest run --coverage

验证

pnpm test
pnpm test:coverage

失效信号

  • vitest.config.mtspackage.json 测试脚本、test/main/AGENTS.mdtest/renderer/src/AGENTS.md 或测试目录布局发生变化时,重新检查本文档。