# 测试策略 > 原则:**无测试即不存在**。TDD 强制(红 → 绿 → 重构),未通过的测试不可跳过。 ## 测试金字塔 | 层 | 工具 | 范围 | 位置 | | --- | --- | --- | --- | | 单元测试 | vitest / cargo test | 纯逻辑:Zustand 状态流转、i18n 工具、Rust 服务函数、模型合法性 | `src/test/*.test.ts(x)`、Rust `#[cfg(test)]` | | 属性测试 | proptest | 模型合法性(时间戳、百分比、端口范围)、HostConfig 无明文不变量 | `models/monitor.rs`、`models/mod.rs`、`core/host_service.rs` | | 集成测试 | React Testing Library | invoke/event 契约验证、store ↔ 组件交互 | `homepage.integration.test.tsx` | | E2E | Playwright | SSH 生命周期、终端交互、文件传输、监控更新、分组/搜索/折叠 | `e2e/app.spec.ts` | ## 运行命令 ```bash pnpm test # 前端单测+集成(vitest --run) pnpm test:watch # 监听模式 pnpm test:e2e # Playwright E2E(mock 后端事件驱动) cd src-tauri && cargo test # Rust 全量测试(含 proptest) ``` ## 前端测试 - **stores.test.ts**:session(状态事件应用、closeSession 清理)、monitor / sftp(任务状态流转、invoke 返回前事件缓存补投、latest-wins、clearSession 清理缓存) - **i18n.test.ts**:translate 命名参数替换、formatAppError(未知 code 回退、detail 拼接)、toAppError 规范化 - **log-level.test.ts**:readLogLevel 读取回退(损坏存储回退 info)、setLogLevel 调用 invoke - **logs.test.ts**:日志 store(load 成功/失败/非数组防御、export 调用与错误) - **log-viewer.test.tsx**:设置日志查看器(渲染/空态/错误态、刷新、2 秒轮询与卸载停止、导出对话框取消不 invoke) - **terminal-theme.test.ts**:readTerminalTheme 读取回退、主题设置持久化 - **release-notes.test.ts / release-workflow.test.ts**:release-notes.mjs 发布说明提取与工作流契约 - **components.test.tsx**:组件渲染与交互(无业务逻辑断言) - **xterm-view.test.tsx**:xterm 实例生命周期、resize 联动、主题应用 - **homepage.integration.test.tsx**:open_session 全流程 —— store 状态 + 事件 + 视图联动 - **smoke.test.ts / application-name.test.ts**:应用基础信息冒烟 - **mocks/**:`tauri.ts`(invoke 桩)、`event.ts`(listen 桩)、`dialog.ts`;jsdom 环境 - E2E 通过 `window.__TAURI_TEST__.emit(...)` 从浏览器注入后端事件(session:status、monitor:snapshot、sftp:task_status),覆盖成功闭环、失败重试、分组增删改折叠、监视条折叠等路径 ## Rust 测试 | 模块 | 覆盖 | | --- | --- | | host_service | save/delete 真实 composition 成功路径、auth type 切换清理、失败与补偿、无明文 proptest | | ssh_transport | eager 连接等待 / 失败交付 / 按需重试、关闭后丢弃迟到结果、跨 Session 并发、opaque capability、Exec seam | | terminal_service | 连接阶段映射、超时、错误 → SessionStatus 映射、命令队列 | | session_manager | 会话注册/关闭/清理,SFTP 连接解绑与迟到注册拒绝 | | monitor_service | 任务生命周期、重复启动防护、transition 迁移合法性(Failed 终态拒绝 Done、未知任务抑制事件) | | monitor_worker | 采集脚本解析(/proc 增量 CPU、/proc/net/dev 网络速率、缺失字段为未知、脚本 guest 不变量)、错误回调、shutdown 退出 | | sftp_service | 任务入队/进度/取消/失败、transition 更新 registry 并移除终态令牌、cleanup 语义、worker 全链路(memory_sftp 内存 adapter) | | models | proptest 属性测试(毫秒时间戳、百分比、端口范围) | | storage(host_store / secure_store) | CRUD 与凭据引用键管理 | | errors(app_error) | 稳定英文错误码、IPC payload 序列化、不泄漏第三方错误类型 | | commands(logging) | 日志等级解析(合法值接受、非法值拒绝)、core/logging 日志落盘/读取/导出/截断 | ## 约定 - 每条新功能必须含:成功路径 + 失败路径 + 重试/边界 - Rust 测试重点:session 生命周期、服务隔离、async、`Result` 传播 - 前端测试重点:Zustand 状态迁移与事件处理;组件内不测业务逻辑 - 集成/E2E 聚焦 invoke/event 契约验证与完整闭环