DEVELOPMENT
测试文档
本项目使用 Node.js 内置的测试框架进行单元测试和集成测试。当前共 479 项,最近完整结果见 测试报告。
实际 SSH 集成测试需要本机 ssh、ssh-keygen、rsync 和 sshd(默认 /usr/sbin/sshd,可用 SSH_AGENT_TEST_SSHD 指定)。测试创建临时密钥与仅监听 loopback 的临时服务器,不连接个人配置中的服务器。真实 sshd 测试要求账户可以使用公钥登录该本机测试服务。
新增的主要集成测试:
exec-deployment.test.js/exec-deployment-live.test.js:命令过滤与参数预检、输出预算与落盘失败、ssh2/OpenSSH 的多行脚本、失败即停、同 shell 批量步骤、远端文件环境注入与符号链接边界,以及模拟 sudo 包装。真实 MCP stdio 全工具测试也覆盖新参数。Python 覆盖 58 行 JSON/SQL 脚本、异常与退出码、cwd/env/远端文件注入,以及超时前无缓冲输出;解释器过滤和 shell 专用参数冲突在连接前校验。mcp-regressions.test.js:两种后端真实 MCP HTTP 请求的并发编辑、默认连接终端复用、符号链接路径边界、上传/下载和转发停止记录归属。activity-log.test.js/activity-live.test.js:并发记录隔离、凭据脱敏、历史保留与重启、磁盘错误,以及两种 SSH 后端经真实 MCP HTTP 调用的 SSE 输出、文件差异、后台任务/终端自动跟踪和鉴权。web-ui-live.test.js:两种后端的真实 HTTP 工作流,包含连接/诊断/重连、完整文本读取、哈希校验、空文件编辑、备份恢复、上传、持久会话、任务和转发;配合 HTTP 与 CLI 回归验证鉴权、跨站防护和 UI 路由。mcp-live-tools.test.js:分别通过 ssh2/OpenSSH,从真实 MCP stdio 客户端调用全部 33 个工具;含超时、中文、二进制目录传输、rsync/SFTP、持久终端、任务、转发、连接诊断、配置热加载和日志清理。后台任务 HOME 被限定到临时目录。full-features-live.test.js:证书认证、ProxyCommand/Match、块级差分、父进程退出后的终端恢复。auth-live-audit.test.js:两种后端的加密私钥认证与错误主机公钥拒绝。audit-regressions.test.js:通道进程回收、终端重开与反向转发断线清理。tmux-live.test.js:需要本机 tmux,在隔离 server 中实测 ssh2/OpenSSH 的中文输出、pane 复用、手动停止及 autoClose 窗口清理。search-matcher.test.js:病态正则超时与后续恢复。
先 npm run build,再用 node --test test/具体文件.test.js 单独运行这些测试。
测试结构
test/
├── ssh-config-parser.test.js # SSH 配置解析器测试
├── command-line-parser.test.js # 命令行参数解析器测试
├── ssh-connection-manager.test.js # SSH 连接管理器测试
├── integration.test.js # 集成测试
└── fixtures/ # 测试数据(自动生成)
运行测试
运行所有测试
npm test
监听模式(开发时使用)
npm run test:watch
监听模式会在文件变化时自动重新运行测试。
运行单个测试文件
node --test test/ssh-config-parser.test.js
测试覆盖范围
1. SSH Config Parser 测试
测试 src/utils/ssh-config-parser.ts 的功能:
- ✅ 基本 Host 别名解析
- ✅ 多别名 Host 行(
Host a b c) - ✅ 通配符匹配(
Host *.example.com) - ✅
Host *默认值 fallback - ✅
Include指令支持 - ✅ 路径展开(
~和相对路径) - ✅ First-match-wins 语义
- ✅ 错误处理(文件不存在等)
2. Command Line Parser 测试
测试 src/cli/command-line-parser.ts 的功能:
- ✅ JSON 配置文件解析(对象和数组格式)
- ✅
--ssh参数解析(JSON 和旧格式) - ✅ 单连接模式(命令行参数和位置参数)
- ✅ SSH config 集成
- ✅ 参数优先级(命令行 > SSH config)
- ✅ 命令白名单和黑名单
- ✅ 其他选项(
--pty,--pre-connect,--proxy,--socksProxy) - ✅ 错误处理
3. SSH Connection Manager 测试
测试 src/services/ssh-connection-manager.ts 的功能:
- ✅ 配置管理(初始化、获取配置)
- ✅ 命令验证(白名单、黑名单、正则表达式)
- ✅ 连接状态管理
- ✅ 多服务器支持
4. 集成测试
端到端测试完整流程:
- ✅ 从命令行参数到连接管理器的完整流程
- ✅ 从 SSH config 到连接管理器的完整流程
- ✅ 多服务器配置场景
- ✅ 错误处理(无效配置、缺少字段等)
编写新测试
测试文件命名
测试文件应该以 .test.js 结尾,并放在 test/ 目录下。
测试示例
import { describe, it, before, after } from 'node:test';
import assert from 'node:assert';
describe('功能模块名称', () => {
before(() => {
// 测试前的准备工作
});
after(() => {
// 测试后的清理工作
});
describe('子功能', () => {
it('应该做某事', () => {
// 测试代码
assert.strictEqual(1 + 1, 2);
});
it('应该处理错误情况', () => {
assert.throws(() => {
throw new Error('测试错误');
}, /测试错误/);
});
});
});
测试最佳实践
- 独立性:每个测试应该独立运行,不依赖其他测试的状态
- 清理:使用
after钩子清理测试创建的临时文件和资源 - 描述性:测试名称应该清楚地描述测试的内容
- 覆盖边界情况:测试正常情况、边界情况和错误情况
- 使用 fixtures:将测试数据放在
test/fixtures/目录下
CI/CD 集成
测试可以轻松集成到 CI/CD 流程中:
# GitHub Actions 示例
- name: Run tests
run: npm test
调试测试
使用 Node.js 调试器
node --inspect-brk --test test/ssh-config-parser.test.js
然后在 Chrome 中打开 chrome://inspect 进行调试。
查看详细输出
node --test --test-reporter=tap test/**/*.test.js
常见问题
Q: 测试失败但没有详细错误信息?
A: 使用 --test-reporter=spec 查看详细输出:
node --test --test-reporter=spec test/**/*.test.js
Q: 如何跳过某个测试?
A: 使用 it.skip():
it.skip('暂时跳过的测试', () => {
// 测试代码
});
Q: 如何只运行某个测试?
A: 使用 it.only():
it.only('只运行这个测试', () => {
// 测试代码
});
贡献指南
提交 PR 时,请确保:
- 所有测试通过:
npm test - 新功能有对应的测试
- 测试覆盖了正常情况和边界情况
- 代码编译通过:
npm run build
shared-service.test.js:真实 stdio 客户端并发接入、端口避让、共同活动记录、进程存活、配置隔离、崩溃恢复、不重放失败操作与鉴权停止。setup-codex.test.js:一键注册、原配置保留、幂等与同名无关配置保护。disconnect.test.js:ssh2/OpenSSH 的 MCP 与网页断开、跨服务器隔离、终端/转发清理、后台任务保留、暂停自动重连和并发启动保护。activity-monitor-offline.test.js:重建监视器后,离线历史任务等待显式连接再查询。browser/workbench-races.js:独立运行的真实浏览器回归,覆盖切换目标时清空未发送命令,以及延迟文件读取/恢复保留草稿;执行方式见browser/README.md。forward-lifecycle.test.js:转发创建期间关闭/断线、迟到端口分配回收、反向转发超时,以及并发创建的数量限制和名额释放。
结构化结果与固定动作策略
execution-policy.test.js:策略配置失败关闭、所有执行旁路连接前拒绝、步骤事件分片及内存上界。execution-result-live.test.js:两种后端真实 SSH 的结构化退出、步骤、并发、超时、日志故障和固定动作字面量执行。阿里云独立 MCP 验证结果见
docs/TEST_REPORT.md最新记录。execution-edge-cases.test.js:无退出状态的通道关闭、流错误日志保留,以及异步准备/排队期间的策略重载竞态。operations-workflow.test.js:多主机目标拒绝、后台脚本与状态恢复、35 MiB 跨端点传输、超时/摘要损坏/越界/受限策略回归。operations-improvements.test.js:脱敏配置失败关闭、跨块/跨页秘密、完整 exec 日志与终端日志、原生收尾诊断、inode/硬链接观察、空文件截断、默认原子替换、多机失败隔离/顺序/并发预算;两种真实 SSH 后端均覆盖。agent-files.test.js另注入原地截短失败,检查备份与部分写入提示。