Files
LinkPort/docs/testing.md
T
曾志威 408f346ab1 feat: add WebDAV sync backups and unauthenticated targets
Replace active S3 sync with encrypted WebDAV synchronization and independent backups. Support explicit empty passwords and unauthenticated MongoDB, Redis, HTTP and HTTPS targets. Include migration, design and validation documentation.

Validation: build and go vet passed; Playwright 113 passed with 4 existing failures. Full Go run reproduced the existing cluster discovery test failure. Preserve unrelated SSH fingerprint changes outside this commit.
2026-09-22 14:00:42 +08:00

47 KiB
Raw Blame History

测试与版本矩阵

2026-09-22 WebDAV 同步备份替代 S3

  • 使用 Go 1.25.0 运行 go test ./... -count=1 -timeout=120s:本次变更涉及的 backup、syncjob、store、api、model、MongoDB/HTTP 协议包均通过;全量仅 internal/cluster 的 TestMySQLReplicationAndGroupDiscovery/mysql-group-replication 失败,报 cluster has no available primary or router,与本文件此前记录的既有间歇失败一致。本轮未修改该逻辑,不将全量 Go 标记通过。日志 artifacts/webdav-sync/go-test.log。
  • go vet ./...、npm.cmd --prefix web run build 通过,前端只有现有大 chunk 警告。Vite 完成后恢复 web/dist/.gitkeep,再构建 artifacts/webdav-sync/serviceport.exe,未覆盖正式程序。
  • 设置 SERVICEPORT_E2E_BINARY 指向新程序,使用隔离 SQLite 与 19491/19492 端口:全量 Playwright 113 通过、4 失败(6.4 分钟)。四项仍为 global-assets-proxy-project:98、kubeconfig-selection:23、target-outbound-selection:3、workspace:98,分别涉及资产草稿、目标字段显示及连接错误文本;与之前合并及空密码版本相同,不宣称全量浏览器通过。日志 artifacts/webdav-sync/full-web.log;最终退出状态见 results.json。
  • 新 WebDAV 两项、目标认证七项均在完整浏览器运行中通过;此前 WebDAV/menu-search/target-auth 专项组合 11 项通过(26.3 秒,focused.log)。覆盖响应式布局、保存和秘密清空、冲突确认、独立备份以及实际隔离 API 到本机 WebDAV 上传的链路。
  • Go HTTP fixture 覆盖目录和路径编码、Basic/匿名、强 ETag、条件创建/覆盖、拒绝重定向与错误正文泄漏、大小限制、两设备同步与冲突、租约、旧 S3 设置隔离。独立备份测试验证加密可解密、凭据可恢复、文件名唯一、共享文件不被访问且基线/冲突不变;API 测试覆盖跨地址/用户名不继承旧密码、显式清除及会话/CSRF/API Token 边界。
  • 协议测试是 Go fixture,端到端 WebDAV 服务是 Node fixture,未连接外部真实 WebDAV 服务,不能据此保证任意服务商的条件写入兼容。智能体只读复核未发现阻断问题;同步和备份共用最近执行状态的边界已写入 docs/webdav-sync.md。
  • 测试进程退出后隔离端口已释放;git diff --check 通过。没有部署、提交、修改真实数据库或目标数据。升级说明要求停服备份完整 data 后再运行新版;当前仍保留工作区原有 SSH 指纹改动。

2026-09-22 目标空密码与无认证连接

  • Go 1.25.0 go test ./... -count=1 -timeout=120s 和 go vet ./... 均通过,结果记录 artifacts/target-auth/go-result.json。新增模型/API 用例覆盖仅允许指定协议无认证、具名空密码、显式清除、草稿不落库及网关认证保留。
  • MongoDB 和 HTTP 使用本机上游 fixture,验证无认证请求、网关错误密码拒绝及 Authorization 不泄漏;Redis 无凭据时跳过 AUTH 由现有 fixture 覆盖,没有连接实际生产服务器。
  • 前端构建和新程序构建通过。使用隔离 SQLite/端口运行无认证版本全量 Playwright:112 通过、4 失败(6.4 分钟),日志 artifacts/target-auth/full-web.log。失败为 global-assets-proxy-project:98、kubeconfig-selection:23、target-outbound-selection:3、workspace:98,与此前合并验证相同,涉及资产草稿断言、目标字段显示和连接错误文本,不宣称全量通过。
  • 随后与 WebDAV 专项一起运行 target-auth.spec.ts 全部 7 项通过(组合共 11 项,artifacts/webdav-sync/focused.log),包括新建空密码、无认证表单/草稿、旧账号默认模式、显式清除、协议限制及手机布局。浏览器部分远程结果使用模拟,不代表真实目标兼容验证。
  • 未部署或修改实际目标数据,保留工作区已有 SSH 跳过指纹改动;本项无需数据库迁移。

2026-09-22 合并 origin/main 943ea75

  • 前端 npm.cmd --prefix web run build 通过(仅大 chunk 提示);Windows Go 1.25.0 新程序构建通过,恢复并保留 web/dist/.gitkeep。
  • go test ./... -count=1 -timeout=120s:除 internal/cluster 的 TestMySQLReplicationAndGroupDiscovery/mysql-group-replication 返回 cluster has no available primary or router 外全部包通过。该失败在合并前已有记录;本次未改集群发现代码。go vet ./... 通过。
  • Linux/amd64、Darwin/amd64 的 go test -c ./internal/desktop 通过;仅交叉编译,未在对应系统实际启动。
  • node scripts/verify-package.mjs artifacts/merge-verification-20260922/package、node scripts/verify-desktop.mjs artifacts/merge-verification-20260922/package/serviceport.exe 均通过,覆盖单 EXE、内嵌资源、隔离登录、库内主密钥、自动 TLS、重启与目录迁移。桌面脚本首次在清理阶段重复等待已退出进程,修复后完整重跑通过。
  • 启动脚本隔离回归使用 Windows PowerShell 运行 scripts/start-dev.test.ps1 通过。PowerShell 7 的 Add-Type 不支持测试 fixture 所需 ConsoleApplication;Windows PowerShell 首次又发现 fixture 未创建旧 desktop.lock,改为在隔离目录 OpenOrCreate 后通过。不修改真实数据库或服务。
  • Playwright 使用 SERVICEPORT_E2E_BINARY 指定本次新编译程序、隔离 SQLite 和 18681/18682 端口:104 通过、4 失败(6.1 分钟)。失败位于 global-assets-proxy-project、kubeconfig-selection、target-outbound-selection、workspace 各一项,涉及资产草稿断言、目标字段显示及连接错误文本;不将全量浏览器回归标记为通过。TCP 映射、请求诊断元数据、范围维护、保存/标签页和响应式专项均在本轮通过。
  • 日志、截图和测试程序位于忽略目录 artifacts/merge-verification-20260922;协议测试使用本机 fixture,并非真实 MongoDB/K8s 生产连接验证。没有部署、推送或真实数据迁移。

以下为历史分支验证记录,不替代本节合并结果。

2026-09-21 TCP 端口映射

  • Go 1.25.0 全量命令 go test ./... -count=1 -timeout=120s 已运行两次;除 internal/cluster 的 TestMySQLReplicationAndGroupDiscovery 外其他包通过。该未改动测试在 mysql-replication / mysql-group-replication 子用例间歇返回 cluster has no available primary or router,单独 -count=20 也出现五次失败。本轮没有修改集群发现逻辑,不将全量 Go 测试标记为通过。日志:artifacts/tcp-go-test.log、artifacts/tcp-go-test-final.log。
  • 本次相关 API、model、gateway、outbound、tcpproxy 包测试通过;最后补充断连必须非超时、认证计数不伪造以及出口包装半关闭测试后,model/gateway/outbound/tcpproxy 四包复跑通过。go vet ./... 通过。
  • 新测试覆盖 TCP 无账号创建/保存/测试/断开、默认 0.0.0.0、拒绝只读及 TLS 终止、普通协议约束保留、直连/SOCKS5/SSH/K8s 配置、真实 loopback 字节透传与半关闭、取消清理、来源白名单与连接数限制、运行中切换保留旧连接、停服断连及无账号定时健康检查。上游和 SSH/K8s 测试均为本地 fixture,并非生产目标验证。
  • npm.cmd --prefix web run build 通过(仅 chunk 大小警告),Vite 完成后生成 artifacts/serviceport-tcp-forwarding.exe;恢复 web/dist/.gitkeep。使用该新程序和隔离端口/SQLite,TCP、账号级连线、网关路径、断开重连、多对一六项回归通过(20.9s)。检查了 TCP 连线图截图。
  • 全量浏览器运行中,新增 TCP 用例受到其他测试遗留资源影响,长画布拖拽定位失败;为用例的目标和网关增加独立项目筛选后,与 gateway-management、target-accounts 连续复跑六项通过(17.1s),含本机二进制字节回显。产品源码未因此变化。完整 UI 结果记录见下方补充;不能用专项通过替代全量通过。
  • 完整 Playwright:97 通过、10 失败(10.0m,日志 artifacts/tcp-playwright.log)。除上述随后修正并复跑通过的 TCP 测试外,其余九项为此前相同失败集合:account-editor 一项、global-assets-proxy-project 两项、kubeconfig-selection 一项、target-outbound-selection 一项、workspace-features 三项、workspace 一项。修正测试隔离后未再次运行全量,只复跑上述相关组合;不将完整 suite 标记通过。
  • 未替换 bin/serviceport.exe,未操作正式数据,也未提交本次改动。新程序需单独部署后功能才生效。

2026-09-21 MongoDB 网关非 admin 认证库

  • Go 1.25.0:go test ./... -count=1 -timeout=120s、go vet ./... 通过。
  • TestGatewayAuthenticationDatabase 覆盖 admin、ttx-xwms-test、speculative SCRAM;拒绝错误密码、未知用户名、空认证库和会话中切换认证库。TestOfficialDriver 扩展为两种认证库与读写/只读的四组合,均通过。使用官方 Go 驱动和本地上游 fixture,未连接真实目标,未测试 Java 驱动。
  • npm.cmd --prefix web run build 通过(仅 chunk 大小警告);Vite 完成后构建 artifacts/serviceport-mongo-authsource.exe,恢复 dist/.gitkeep。
  • 设置 SERVICEPORT_E2E_BINARY 指向该新程序,隔离端口 18381/18382 和临时 SQLite;gateway-connection-path、account-targets、connection-diagnostics 六项 Playwright 通过(12.3s)。本次仅复跑相关浏览器用例,未重跑全量 UI;此前全量失败记录仍保留,不宣称全量 UI 通过。
  • 未替换运行中的 bin/serviceport.exe,未修改实际数据库或目标数据。

2026-09-21 网关账号到目标账号的路径测试

  • 最终目标多账号常驻展开版本:前端构建后生成 serviceport-multi-account.exe;gateway-connection-path、account-targets、many-to-one、disconnect 五项专项回归通过(18.3s)。account-targets 另行截图复跑一项通过(4.5s),已检查 desktop/mobile 截图;覆盖未选择源时账号可见、选择前后位置稳定、账号级连线及独立映射。

  • 前一个 serviceport-account-path.exe 的完整 Playwright 结果为 97 通过、9 失败(9.9m)。失败为 account-editor 一项、global-assets-proxy-project 两项、kubeconfig-selection 一项、target-outbound-selection 一项、workspace-features 三项、workspace 一项,与此前记录的失败集合一致。该全量运行不包含最后的目标账号常驻展开改动,不能代替最终版本的全量验证;最终版本仅运行上述专项回归。两份程序均未部署覆盖正在运行的服务。

  • TestGatewayConnectionUsesAccountMapping 与原有 TestConnectionErrorsExposeStageWithoutDiagnostic 通过,使用隔离 SQLite 和 recording handler;覆盖无默认目标的账号选路、目标凭据/地址/SOCKS5 出口、拒绝未知和禁用账号、测试不改映射。

  • go test ./... -count=1 -timeout=120s(Go 1.25.0)、go vet ./...、前端生产构建通过。构建仅有 chunk 大小警告。

  • account-targets、connection-diagnostics、gateway-connection-path 共六项 Playwright 通过。补充多账号显式选择后,gateway-connection-path 两项复跑通过,验证请求 query、实际目标账号、K8s 资源路径及不泄露凭据/原始错误;单账号拖拽不改其他映射。新增 fixture 最初漏填 TargetTLS=false 被正常拒绝,修正测试配置后通过;多账号选择测试改为点击 Element Plus select 容器后通过。

  • 使用新嵌入式 serviceport-account-path.exe、隔离端口/SQLite;完整日志位于 artifacts/mongo-live-check-20260921-160801/account-path-playwright.log。本轮没有真实 MongoDB 连接测试或正式数据变更,不将模拟响应当作真实连接成功。

2026-09-21 资产统一居中弹框

  • npm.cmd --prefix web run build 通过,仅有 chunk 大小警告;恢复 .gitkeep 后构建 serviceport-asset-dialog.exe。
  • Go 1.25.0 的 go test ./... -count=1 -timeout=120s 与 go vet ./... 均通过。
  • 新增 asset-editor-dialog.spec.ts 两项通过:文件/连接资产与目标弹框尺寸一致、居中、无抽屉、无空页签、底部按钮可见;覆盖 1440/390/320px;取消保留草稿、Escape 放弃、再次打开清空。截图禁用过渡动画后已检查。
  • 既有 asset-remarks.spec.ts 一项、usability-assets.spec.ts 两项通过,覆盖上传保存、编辑/清空备注、内联创建回填与父草稿保护。
  • 共享弹框复用后,responsive.spec.ts 原先假定全部 connection-editor 都有连接页签和“保存配置”按钮;更新为保留尺寸/滚动/固定操作区断言,仅对存在的页签验证键盘导航,并识别各表单保存按钮。单独重跑 responsive.spec.ts 两项通过,覆盖 320/390/768/1920px。一次组合回归命令被终端 60 秒时限截断并报 EPIPE,不作为通过记录。
  • 测试使用 SERVICEPORT_E2E_BINARY 指向新嵌入式程序、隔离 SQLite 和端口。全量执行日志为 artifacts/mongo-live-check-20260921-160801/asset-dialog-playwright.log。未修改真实资产作测试,未停止/覆盖用户运行服务。
  • 全量首跑结果为 94 通过、10 失败(9.6 分钟):包括上一轮已失败的 9 项,以及本次共享容器导致 responsive 用例旧假定失效的 1 项。后者更新断言后所在 responsive.spec.ts 两项已单独通过,其余 9 项未在本任务中修复。不将单独复跑结果合并成一次全量通过;git diff --check 通过。

2026-09-21 菜单与资源侧栏切换

  • npm.cmd --prefix web run build 通过(只有既有 chunk 大小警告),构建后恢复 .gitkeep 并生成 serviceport-sidebar.exe。
  • SERVICEPORT_E2E_BINARY 指向该新程序,使用独立 SQLite 和 18181/18182 端口。sidebar-panels.spec.ts 两项通过,覆盖桌面/手机、键盘及本地偏好;桌面菜单和资源截图已检查。
  • 更新既有 DBX 宽度期望,以及 workspace-features/global-assets 用例中的资源视图切换入口。未更改真实业务数据来运行 UI 测试。
  • 最新全量 Playwright:93 项通过、9 项失败(9.6 分钟)。侧栏新增两项、DBX 三项、菜单搜索及响应式用例通过。失败为 account-editor、global-assets-proxy-project 两项、kubeconfig-selection、target-outbound-selection、workspace-features 三项和 workspace 的旧诊断断言;涉及小屏表单高度、重复未保存确认、超时和旧显示期望,本轮未扩大范围修复。全量执行日志位于 artifacts/mongo-live-check-20260921-160801/sidebar-playwright.log。不能声明全量浏览器回归通过。
  • 嵌入新前端后的全量 Go 测试与 vet 再次通过,git diff --check 通过。新版程序已生成,但未停止或替换用户当前运行的 bin/serviceport.exe。

2026-09-21 MongoDB 兼容握手与真实连接

  • TestLegacyAndModernHandshake:初次 isMaster/helloOk 协商,连续两次刷新选择正确命令,使用本地 net.Pipe fixture。
  • TestUpstreamSCRAMNegotiationAndEmptyFinish:认证库机制探测、SHA-256 优先、SHA-1 默认、额外空结束交换及异常结束载荷拒绝,使用本地 SCRAM fixture。
  • TestMongoHelloUnsupported:只允许 CommandNotFound 回退,认证、权限和网络错误不能触发回退。
  • 最新 GOTOOLCHAIN=go1.25.0 go test ./... -count=1 -timeout=120s 和 go vet ./... 均通过。中间一次 cluster MySQL fixture 间歇失败,最新全量通过;不代表间歇性根因已修复。
  • npm.cmd --prefix web run build 已通过(有 chunk 大小警告),不再是此前的 esbuild EPERM 阻塞。构建后恢复 web/dist/.gitkeep,再构建嵌入新前端的隔离测试程序。
  • 实际使用已保存 Kubeconfig,经 K8s port-forward 对 wall-e-test/statefulset/mongo-shopee:27017 进行握手、SCRAM、buildInfo 查询。用户提供认证库/凭据后成功返回版本 4.1.13、standalone、TLS=false、zlib。保存配置并重新读取后再次成功。未执行业务数据写入。
  • Playwright 首轮使用 SERVICEPORT_E2E_BINARY 指向 artifacts/mongo-live-check-20260921-160801/serviceport.exe,独立临时 SQLite 和端口,91 项通过、9 项失败;其中部分工作区用例执行期间又加入了后续侧栏变更,因此以后续 serviceport-sidebar.exe 全量运行结果为准,不将首轮当作干净的对照基线。

2026-09-21 连接路径与分阶段诊断

  • 新增 TestMongoFailureStages:本地 net.Pipe fixture 区分 TCP、TLS、hello 拒绝/断连、SCRAM 认证拒绝/交换断连、buildInfo 权限拒绝/断连,不依赖真实服务器。
  • 新增 gateway 和 API 白名单阶段测试:保留结构化阶段及内部 cause,未知阶段安全回退,管理响应与错误字符串不泄露凭据和服务器任意诊断文本。
  • 新增 connection-diagnostics.spec.ts:阶段中文映射、网络/认证区别、K8s 资产名与资源路径、无敏感内容及未知阶段回退;浏览器用例使用模拟失败响应,不连接真实集群。
  • 加入诊断后的全量 Go 测试:除既有 MySQL group-replication fixture 再次间歇失败外,API、gateway、Mongo、model、store 等包均通过;该 fixture 单独重跑通过。go vet ./... 通过。此前资产合并阶段的一轮全量通过,不能据此宣称间歇性测试已修复。
  • Vue 类型检查、Node 中执行的阶段区别/安全回退/K8s 路径纯函数断言、git diff --check 通过。Playwright --list 成功发现 100 项用例、43 个文件,仅验证用例可发现,不代表执行通过。
  • 最后一次 npm.cmd --prefix web run build 仍在 Vite/esbuild 启动时报 spawn EPERM。没有新前端包、没有部署、没有浏览器 E2E 结果;不能把类型/纯函数检查当作浏览器验证已通过。

2026-09-21 资产合并与目标内联 Kubernetes(当前源码)

  • Go 1.25.0:最后一轮 go test ./... -count=1 -timeout=120s 和 go vet ./... 全部通过。期间既有 MySQL group-replication fixture 曾间歇失败;单独重跑和最终全量通过,未修改该集群实现。
  • 新增 API/model 回归覆盖:目标不填写 IP 即可保存/草稿测试 StatefulSet、不生成中间代理、内联 Kubeconfig 解析、TLS/直连仍要求地址。存储 fixture 验证资产更新及版本恢复后使用最新内容、清除旧主机指纹、禁止删除被引用资产且不把 Kubeconfig 正文复制到目标记录。
  • Vue 类型检查通过;Node 执行 TypeScript 转译后的纯函数断言通过,覆盖目标 payload、不泄漏资产内容、连接引用/直连切换及 K8s 单节点和保活校验。
  • npm.cmd --prefix web run build 的类型检查阶段通过,但 Vite/esbuild 启动被当前环境以 spawn EPERM 阻止。没有新前端包,未构建/部署含新界面的运行程序,未执行浏览器端到端验证。下方旧版本的成功浏览器记录不代表此合并功能已通过 E2E。
  • 前端用例按新资产类别、连接字段、StatefulSet 目标直接配置、旧引用兼容和文件更新导航调整。使用隔离 API/模拟响应,不宣称真实 Kubernetes、MongoDB、SSH/SOCKS5 连通性;未操作真实 data 或重启服务。

2026-09-21 新建目标选择代理验证

  • 新增 target-outbound-selection.spec.ts,先对上一轮构建的程序执行首个用例,确认默认「连接信息」页没有可见的代理选择器;修改后新增 3 项用例通过。
  • npm.cmd --prefix web run build 通过,包含 Vue 类型检查与 Vite 构建,仅有原有主包体积警告。待构建完成后使用 Go 1.25.0 生成 artifacts/target-outbound-selection/serviceport.exe,保留 web/dist/.gitkeep。
  • 使用上述新程序、独立数据及 19291/19292 端口执行 target-outbound-selection.spec.ts、kubeconfig-selection.spec.ts、kubernetes.spec.ts、project-scope.spec.ts、target-editor-test.spec.ts,21 项全部通过。覆盖首屏直连/SSH/SOCKS5/K8s 选择、服务类型和页签切换保留引用、Mongo 草稿测试参数、实际 API 保存与重新编辑回读、改回直连、跨项目选择、空列表、不可用引用及 390px 小屏。
  • Go 1.25.0:go test ./... -count=1 -timeout=120s 和 go vet ./... 全部通过,先完成后端检查再执行全量浏览器测试,避免目录清理竞争。
  • 全量 Playwright 使用新程序执行 npm.cmd --prefix web test -- --max-failures=3:82 通过、3 失败、8 未运行。失败仍是已记录的 account-editor.spec.ts 320×568 权限页多出 14px 滚动,以及 workspace-features.spec.ts 的 URL 参数和搜索/树导航两项超时。
  • 对上述未运行的 8 项补跑:workspace.spec.ts 7 项全部通过,覆盖 SSH/SOCKS5 目标配置、共享代理引用、凭据保留与删除保护等;workspace-features.spec.ts 的表格列设置用例在对隐藏 checkbox 执行 uncheck 时超时。再用本次修改前的 artifacts/kubeconfig-selection/serviceport.exe 单独复跑该列设置用例,同样失败,确认不是本次代理入口引入。两轮合计 89 项通过、4 项既有失败,未扩展修复这些无关功能。
  • Mongo 草稿连接结果、跨范围列表和不可用引用场景使用浏览器模拟;三类代理创建、Kubeconfig 资产保存、Mongo 目标保存与切回直连通过隔离 API。未连接真实 MongoDB、SSH/SOCKS5 代理或 Kubernetes 集群;Go 协议测试使用本地 fixture。未替换现用程序或操作真实数据。
  • git diff --check 通过,构建占位文件恢复原样;所有测试结束后确认隔离端口 19291/19292 不再监听。
  • 验证边界:本轮程序于 2026-09-21 13:21 构建,Go 检查于 13:25 完成。收尾发现 internal/store/audit_shards.go、commands.go、event_shards.go、store.go 在 13:34 出现其他修改;本任务未触碰或回退它们,上述构建及测试结果不覆盖这些后续修改。

2026-09-21 Kubeconfig 资产选择验证

  • 修改前,在新构建 EXE 上创建“数据库平台 · 正式”的 Kubeconfig,再以“默认项目 · 测试”新建代理,复现资产被范围过滤且无提示/展开入口;回归用例明确失败。
  • npm.cmd --prefix web run build 通过,包含 vue-tsc 与 Vite 生产构建;仅有原有主包体积警告。构建后保留 web/dist/.gitkeep,再使用 Go 1.25.0 构建 artifacts/kubeconfig-selection/serviceport.exe,未并发替换嵌入资产。
  • 使用该新 EXE、独立数据及 19191/19192 端口,kubeconfig-selection.spec.ts、kubernetes.spec.ts、usability-assets.spec.ts、project-scope.spec.ts 共 7 项通过。新增 2 项覆盖跨范围 Kubeconfig 显式选择、排除普通文件、隐藏范围后保留引用、保存代理与 Mongo 目标并回读、空态类型提示、刷新失败重试和 390px 小屏。
  • Kubernetes 命名空间/资源查询使用浏览器模拟响应;资产、代理和 Mongo 目标保存经过真实隔离 API。没有调用真实 Kubernetes API 或连接真实 MongoDB,不将 UI/引用验证表述为实时 port-forward 成功。
  • Go 1.25.0:go test ./... -count=1 -timeout=120s 和 go vet ./... 串行复跑全部通过,包括 internal/cluster。首次与 Playwright 并发运行时,Go 枚举目录遇到正在清理的 web/test-results,报 pattern ./...: open web\test-results: The system cannot find the file specified.;待浏览器结束后重跑消除该竞争。协议测试使用本地 fixture,未连接真实数据库或 SSH 服务。
  • 全量 Playwright 使用同一新 EXE,执行 npm.cmd test -- --max-failures=3:79 通过、3 失败、8 未运行,达到失败上限后停止。失败与 2026-09-20 已记录情况一致:account-editor.spec.ts 的 320×568 权限页多出 14px 滚动,以及 workspace-features.spec.ts 的 URL 参数、搜索/树导航两项超时;新增 2 项均通过,未修改上述无关功能。
  • 未改动用户真实数据、未替换现用程序;测试结束后确认隔离端口 19191/19192 不再监听,git diff --check 通过。

2026-09-21 库内密钥、历史整合与工作区回归

  • Go 1.25.0:go test ./... -count=1 -timeout=120s 和 go vet ./... 全部通过,包含新增库内密钥与离线整合测试。协议测试仍为隔离 fixture。
  • 密钥验证覆盖首次入库、无外置密钥文件、重启、只复制主 SQLite 后仍能解密原密码/私钥、缺失/损坏记录不重建、显式环境密钥不匹配拒绝,以及外置文件不自动导入或覆盖。
  • 离线工具 fixture 覆盖当前配置优先、独有资源合并、新增网关停止、旧管理员不覆盖、使用不同源密钥时正确重加密、完整备份、准备模式不改源库、应用模式替换主库、旧库与旧密钥保持。流程测试通过注入测试密钥执行,不依赖真实 DPAPI。真实密钥最初在代理环境解密失败,随后用户在原 Windows 会话执行整合成功,详见 历史数据说明。
  • 真实整合结果复核:consolidate-20260920T171719.754430900Z/report.json 为 applied:true;16 个备份文件及 10 个保留原文件哈希通过。ready/ 的主库复制件完整性、库内密钥和全部资源解密通过,8 个目标、4 个网关、1 个资产,2 个导入网关停止。实际安装主库在代理环境读取返回 EPERM,未直接核对其内容或启动真实服务。
  • 前端 vue-tsc/Vite 构建通过并保留 .gitkeep,存在已知 bundle 体积警告。账号编辑器 320×568 全页签以及 URL、搜索导航、列设置专项通过;测试未放宽滚动阈值,使用可见 checkbox 标签并保留状态断言。
  • node scripts/package.mjs --all 完成六目标构建,发布目录 artifacts/releases/2026-09-20T16-40-11-688Z-701d60e4/ 的六份 SHA256 均与清单一致。Windows x64 原生包与本地启动(无外置密钥、可选认证、TLS、重启与搬移)验收通过。Linux/macOS × amd64/arm64 的桌面测试二进制也编译通过,未实机执行;远程 CI 未执行。
  • 全量 Playwright 使用此次新程序 artifacts/db-key-verification/serviceport.exe,通过 SERVICEPORT_E2E_BINARY 指定,隔离数据库和端口 18485/24687。首轮 91 通过、4 失败:工作区 helper 仍匹配精简前的白名单说明文字,重试又遇到前次创建的重复 fixture。已同步文案断言并重建两套隔离测试库重跑;首轮目录为 artifacts/db-key-verification/full,最终目录为 artifacts/db-key-verification/full-final。
  • 最终完整运行设置 --retries=0,95 项全部通过(7.0 分钟),包含此前失败的四项工作区/小屏用例及主题切换。测试结束后停止本轮两套隔离服务;未部署到真实数据目录。

2026-09-20 三平台与明文主密钥验证

  • Go 1.25.0:go test ./... -count=1 -timeout=120s、go vet ./... 全部通过,包含 Windows 本地密钥、运行锁、缺失密钥保护,以及旧 DPAPI 文件不转换且保留的回归。协议测试使用本地 fixture,未连接真实上游服务器。
  • node scripts/build-web.mjs --force 完成前端类型检查及 Vite 生产构建,保留 web/dist/.gitkeep;仅有 bundle 体积警告。之后执行 node scripts/package.mjs --all,生成 Windows/Linux/macOS × amd64/arm64 六个平台的独立程序,文件校验和均与清单一致。
  • Windows x64 使用此次实际程序通过单文件发布验收(版本信息、内嵌网页、隔离启动和登录)及 verify-desktop.mjs(免登录、可选管理员设置、自动 TLS、未加密密钥持久化、认证重启和搬移数据)。其他五个目标为编译验证。另对 Linux/macOS × amd64/arm64 的 internal/desktop 测试代码执行 go test -c,全部编译成功,未在异系统执行。
  • Node 脚本语法、三个 Unix shell 入口的 Git Bash bash -n、CI YAML 解析及矩阵检查、git diff --check 通过。Windows 启动脚本 fixture 回归在 Get-CimInstance Win32_Process 遇到当前环境权限拒绝,未完成源码启动和备份验收;不计为通过。远程三系统 CI 已配置但未执行。
  • 产物:artifacts/releases/2026-09-20T13-38-02-849Z-dc352132/;浏览器验证使用复制出的新程序 artifacts/platform-verification/serviceport.exe,通过 SERVICEPORT_E2E_BINARY 指定,测试服务使用隔离数据及 8485/14687 端口。未部署到真实数据目录,未转换或删除实际 master-key.dpapi。
  • 全量 Playwright 95 项、不重试:90 通过、5 失败。最后的主题用例在 browser.newContext 阶段因浏览器关闭失败,用新浏览器单独复跑后通过;剩余 4 项为此前已在旧程序复现的账号权限页 320×568 多出 14px 滚动,以及 workspace-features.spec.ts 的 URL 参数、搜索/树导航、表格列设置三项超时。整套结果不计为通过。本轮环境保存、请求报错信息、SQLite、RabbitMQ 版本、Sentinel 认证用例均通过。报告目录为 artifacts/platform-verification/playwright 和 artifacts/platform-verification/theme。

2026-09-20 Windows 多路径启动验证

  • Go 1.25.0:go test ./internal/desktop ./cmd/serviceport -count=1 -timeout=120s 通过,覆盖当前目录新库、AppData 已有库、双库优先级、相对/绝对显式路径、不依赖 AppData 环境、手动主密钥模式不遍历、目录占位错误、已有库缺密钥,以及 data-path 命令无初始化副作用与参数校验。
  • powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts/start-dev.test.ps1 通过:临时含空格项目、异目录调用、调用者目录恢复、构建锁、BuildOnly/FullCheck/RebuildWeb、构建/路径解析失败隔离;源码/发布入口不强制数据路径且保留显式设置;完整备份实际选中目录,并拒绝递归备份和被其他实例占用的数据。该脚本使用只记录环境变量的可执行 fixture,不启动真实服务。
  • go vet ./...、npm.cmd --prefix web run build、git diff --check 通过。Vite 报告主包体积警告,未作为失败处理;构建后保留 web/dist/.gitkeep,待 Vite 完成后再构建嵌入前端的新 EXE。
  • node scripts/verify-desktop.mjs artifacts/path-validation/serviceport.exe 使用此次新构建程序及 Edge 无头浏览器,通过当前目录创建、首次账号设置、自动 TLS、DPAPI 密钥保持、认证重启,以及将测试库移至隔离 AppData 后复用旧账号且不另建本地库。原桌面脚本的管理员字段定位已更新为实际表单标签“登录账号/登录密码”。
  • 全量 go test ./... -count=1 -timeout=120s 未全绿:未改动的 internal/cluster 中 TestMySQLReplicationAndGroupDiscovery 出现“无可用主节点”,单包复跑还出现拓扑不符;其余包通过。协议覆盖全部为本地 fixture,未连接真实 MySQL/MongoDB/SSH 服务。
  • Playwright 使用新 EXE、独立数据和 19091/19092 端口,执行 npm.cmd test -- --max-failures=3:77 通过、3 失败、8 未运行,达到失败上限后停止。失败为 account-editor.spec.ts 的 320×568 权限页多出 14px 滚动,以及 workspace-features.spec.ts 的 URL 参数、搜索/树导航两项超时;未修改这些前端功能或把此轮报告为全套通过。
  • 未运行实际项目的启动入口、未替换现用 EXE、未读写真实项目数据或用户 AppData 数据;路径变更无需数据库表结构迁移。

本地生成文件与 Git 忽略规则

.gitignore 排除本地 data、bin、artifacts、tmp、依赖目录和环境凭据;前端构建输出保留 web/dist/.gitkeep。Playwright 可从项目根目录或 web 运行,两处的 test-results、playwright-report、blob-report、缓存和隔离临时目录均不进入版本控制。

SQLite 的 .sqlite、.sqlite3 及其 journal/WAL/SHM 文件忽略;根目录临时 .db 及其侧文件也忽略。数据目录中的审计、DPAPI 主密钥与 TLS 文件保持本地,另外排除根目录可选的 tls 目录。规则不全局忽略所有 .db、证书、归档或配置文件,避免隐藏协议 fixture 和源码资产;.env.example、依赖锁文件、测试代码和文档应继续可提交。

修改规则后使用 git check-ignore --no-index 验证正反例,并检查 git ls-files 确认生成目录未被跟踪(dist 仅保留占位文件)。忽略规则不会删除文件,也不会让已经跟踪的文件自动退出版本控制。

2026-09-18 未保存目标连接测试

  • 新接口覆盖全部 10 种协议的草稿分派、未完成的非选中账号、按账号 ID 保留或临时覆盖密码、配置与历史不变、网关引用不变、CSRF 与字段校验、错误脱敏、私钥和 Kubeconfig 资产解析。
  • SSH 使用隔离的本机协议 fixture,验证未确认/错误指纹时不进行认证、确认后连接成功、后续测试不会继承临时信任。其他协议的新增接口测试使用记录型 handler;浏览器测试模拟远端结果。未连接生产服务或进行真实数据库版本验收。
  • go test ./... -count=1 -timeout=120s 中 API、存储、模型及协议包通过;Windows 桌面 TestLocalKeyPersistenceAndLock 仍报 The system cannot find the file specified.。网关 TestShutdownClosesAfterGracePeriod 首次报 handler not started,随后单独重跑整个 internal/gateway 包通过,因此不宣称首次全量通过。
  • go vet ./...、Vue 类型检查与 Vite 构建通过。Vite 保留大包体积提示;前端构建完成后用 Go 1.25.0 生成新的嵌入式测试程序,恢复 web/dist/.gitkeep。
  • 默认 18081/18082 被另一轮测试占用,本轮设置 SERVICEPORT_E2E_PORT=19081、SERVICEPORT_E2E_AUTH_PORT=19082 并通过 SERVICEPORT_E2E_BINARY 指定新程序;使用独立临时数据和结果目录,未停止其他服务、未部署实际数据目录。
  • target-editor-test.spec.ts 的 13 项用例全部通过:修改后按指定账号测试且不保存、10 种协议新建草稿测试、390px 手机下 MongoDB URI 副本集草稿测试、SSH 临时指纹取消与确认。其他协议的远端连接结果由浏览器路由模拟,后端 SSH 认证由上面的本地 fixture 验证。
  • 整套浏览器运行先通过 35 项,随后并行工作新增的 rabbit-version.spec.ts 在创建测试目标时失败:fixture 账号缺少保存接口必需的名称,尚未进入连接测试。未修改该并行文件,余下用例另起隔离服务继续运行;不能把这一轮称为首次全套通过。
  • 余下 32 项先通过 31 项,最后的主题用例在创建浏览器上下文时遇到 Edge 退出;用新浏览器单独重跑通过。最终本轮范围内的 67 项浏览器用例分批通过,另有上述并行 RabbitMQ 用例失败记录。Windows 测试服务退出等待期间仅停止本轮指定路径的测试程序,未停止用户服务或另一轮测试程序。

改动原因和行为边界见 未保存配置的连接测试 与 变更原因与设计记录。

2026-09-18 账号路由与免滚动编辑验证

以下是本轮实际执行记录;下方早期版本的“全量通过”不代表本轮 Windows 环境所有测试通过。

  • 前端:npm.cmd --prefix web run build(Vue 类型检查及 Vite 生产构建)通过。使用 Go 1.25.0 在前端构建结束后生成新的嵌入式测试程序,并通过 SERVICEPORT_E2E_BINARY 运行 Playwright;恢复了受版本控制的 web/dist/.gitkeep。
  • 最终 55 项浏览器用例分批验证通过。全量运行先通过 48 项;旧工作区测试仍假设白名单位于登录表单,按新分组入口修正后,该文件的 6 项业务用例通过。最后的主题用例在创建浏览器上下文时遇到 Edge 退出,使用新浏览器单独重跑通过。因此不是一次完整运行零失败。
  • 新增免滚动用例使用 12 个已有账号,检查 1440×900、375×812、320×568 的登录、目标、权限、更多分组内容高度;验证新增第 13 个账号立即聚焦、切换保留草稿、跨账号错误定位及保存后凭据保留。小屏溢出修正后该用例通过。
  • 账号路由后端改动执行 go test ./... -count=1 -timeout=120s。相关模型、存储、API、网关及协议包通过;internal/desktop 的 TestLocalKeyPersistenceAndLock 仍报 The system cannot find the file specified.,因此完整命令返回失败。go vet ./... 通过。
  • 随后补充的双目标 SSH 账号切换/重连测试单独运行通过,覆盖同一监听端口按账号访问不同目标、只切换一个账号、新连接更新路由以及已有会话保持原目标。SSH、HTTP TLS、MongoDB 和 RabbitMQ 路由测试使用隔离 fixture,没有对实际生产服务做验收。
  • 最新免滚动编辑调整只涉及前端及文档,重新执行前端构建和浏览器验证,未把此前后端结果表述为重新运行后的结果。测试使用独立数据库和端口,未部署或迁移实际使用的数据目录。

改动原因见 变更原因与设计记录,使用方式见 易用性 与 账号说明。

0.3.0 验证

  • 共享代理出口:Go 全套测试与静态检查通过,覆盖旧出口原子迁移/幂等性、凭据不重复保存、目标引用解析、共享更新、运行中修改阻止、引用删除阻止和密码查看权限。八项浏览器流程验证代理独立菜单、目标下拉、多目标共享、解绑删除及既有服务功能;主题测试遇到 Edge 进程退出后独立重跑通过。桌面/390px 手机截图无页面溢出或抽屉裁切。

  • Go 全量测试和 go vet 通过;Vue 类型检查和生产构建通过。

  • 内置 Kubernetes 测试使用模拟 API 与真实 SPDY 流,覆盖 TLS/Token、双向数据、建连取消、成功连接不受拨号 context 取消影响、关闭清理,以及 Service selector 和命名 targetPort。未连接真实 Kubernetes 集群。

  • 七项浏览器流程覆盖既有功能、K8s 配置保存/编辑、缺失 kubeconfig 错误和版本信息;手机抽屉位置、宽度及截图验证通过。主题测试在整套运行时遇到 Edge 进程退出,独立重跑通过。

  • 版本 CLI/API、无数据初始化的版本查询及 Windows 元数据注入构建通过。Linux/Docker 构建尚未运行。

本次验证记录

2026-09-09,Windows / Go 1.25.0 / Node.js 24 / Microsoft Edge:

  • go test ./... 通过,真实服务测试在未提供环境变量时明确跳过。
  • go vet ./... 通过。
  • Vue 类型检查与生产构建通过,生成并嵌入 Go 可执行文件。
  • Playwright 两条完整流程通过:MySQL 默认读写/可选只读/密码查看,MongoDB 与 SSH 的 SOCKS5 配置及编辑后凭据保留。
  • 已检查桌面与移动端截图,移动端使用独立卡片布局且无页面横向溢出。
  • PowerShell、Bash、MongoDB 初始化脚本语法检查及主密钥生成检查通过。
  • MySQL AST 和 MongoDB wire/BSON 只读检查器完成短时模糊测试。

Docker 真实服务矩阵尚未在本机执行,不能据此宣称全部目标版本已完成兼容认证。

本地测试

统一使用 Go 1.25.0。Windows 已安装更高版本 Go 时设置 GOTOOLCHAIN=go1.25.0;首次使用需下载兼容工具链。

$env:GOTOOLCHAIN = 'go1.25.0'
go test ./...
go vet ./...
npm.cmd --prefix web run build
go build -o bin/serviceport.exe ./cmd/serviceport
npm.cmd --prefix web test

浏览器测试使用隔离的临时 SQLite、随机主密钥和仅供测试的登录密码,监听 127.0.0.1:18081,结束后清理。不连接用户的数据库。默认使用已安装的 Edge;其他平台可安装 Playwright Chromium 并设置 SERVICEPORT_BROWSER_CHANNEL=chromium。截图输出到忽略版本控制的 web/test-results。

已有自动化覆盖

模块 覆盖范围
API 登录、会话/CSRF、默认读写、CRUD 脱敏、密码保留和重新认证查看、限流、停止前禁止修改、主机指纹字段防绕过
存储 AES-GCM 随机 nonce、篡改/用途/错误密钥拒绝、SQLite 加密持久化、登录密码重置及会话版本
运行管理 CIDR、来源限制、并发上限、端口冲突、可选 TLS、启停和连接清理
SOCKS5 无认证/密码认证、禁止降级、远端 DNS、IPv4/IPv6、失败不直连、超时和取消
MySQL TLS 网关、raw packet 转发、二进制预编译、重置、可选只读、LOCAL INFILE 拒绝、AST 模糊测试
MongoDB 官方 Go 驱动连接、双端 SCRAM、推测认证、上下游 TLS、BSON/OP_MSG、批量写入/游标、只读递归检查与模糊测试
SSH 进程内真实 SSH 协议、密码/公钥、带口令私钥、固定指纹、PTY/window、exec/退出码、SFTP channel、限制转发及取消
管理界面 登录、新建三类代理、默认读写、切换只读、SOCKS5 配置、凭据保留、密码查看、桌面及移动端布局

进程内协议测试使用可控服务端,不等同于真实数据库版本或 OpenSSH 的完整兼容认证。

Docker 真实版本测试

需要安装并运行 Docker Engine/Compose。所有服务为独立测试实例,端口只绑定到本机;脚本使用独立 Compose 项目,测试会创建并删除临时数据库,结束后删除该项目的测试卷。不要将这些测试指向生产服务。

.\scripts\test-matrix.ps1
bash scripts/test-matrix.sh

固定镜像和端口以 Compose 文件 为准:

服务 版本 本机端口
MySQL 5.7.44 / 8.0.43 / 8.4.6 13357 / 13380 / 13384
MongoDB 6.0.26 / 7.0.24 / 8.0.13 27060 / 27070 / 27080
OpenSSH 测试 Dockerfile 固定基础镜像 12222
SOCKS5 仓库内测试实现,无认证 / 密码 11080 / 11081

生成的测试 CA 用于目标 TLS 验证。MongoDB 8.0 测试实例配置单节点副本集,脚本负责初始化以验证事务。脚本对全部数据库版本及 SSH/SFTP 分别执行直连、无认证 SOCKS5、密码 SOCKS5 三条路径;SOCKS5 路径使用仅 Docker 内可解析的服务名,检查远端 DNS。服务凭据仅供这些一次性测试实例使用,详见 Compose。

手动启动测试实例:

docker compose -f deploy/compose.test.yml up -d --build --wait
docker compose -f deploy/compose.test.yml run --rm --no-deps mongo80-init

独立连接已准备好的目标测试实例:

  • MySQL:SERVICEPORT_MYSQL_TEST_ADDR、SERVICEPORT_MYSQL_TEST_USER、SERVICEPORT_MYSQL_TEST_PASSWORD、可选 SERVICEPORT_MYSQL_TEST_CA(CA 文件路径),执行 go test ./internal/protocol/mysqlproxy -run TestRealMySQL -count=1 -v。
  • MongoDB:SERVICEPORT_MONGO_TEST_ADDR、SERVICEPORT_MONGO_TEST_USER、SERVICEPORT_MONGO_TEST_PASSWORD、可选 SERVICEPORT_MONGO_TEST_CA(PEM 内容),执行 go test ./internal/protocol/mongoproxy -run TestRealMongo -count=1 -v。
  • SSH:SERVICEPORT_SSH_TEST_ADDR、SERVICEPORT_SSH_TEST_USER、SERVICEPORT_SSH_TEST_PASSWORD,执行 go test ./internal/protocol/sshproxy -run TestRealSSH -count=1 -v。验证远程输出和退出码、SFTP 上传下载及清理、禁止 TCP 转发。

三类测试可额外设置 SERVICEPORT_TEST_SOCKS_ADDR 和可选 SERVICEPORT_TEST_SOCKS_USER/PASSWORD,使用真实生产出站层经 SOCKS5 连接上述目标。测试中的首次 SSH 指纹探测仅适用于已明确指定的一次性测试服务,不替代生产环境的管理员独立核对流程。

测试账号须允许创建和删除独立测试库;未设置地址时真实版本测试明确跳过。省略上游 CA 时测试按明文上游运行,但网关客户端仍执行 TLS。

验证边界

当前开发机器没有 Docker、MySQL 或 MongoDB 服务,真实版本矩阵和 OpenSSH/mongosh 客户端组合尚未在此机器执行。Docker 镜像启动、数据库各版本 TLS/认证差异、真实副本集事务以及所有服务经 SOCKS5 的端到端组合,需要运行测试环境后再确认。

只读是严格请求白名单,不等同数据库权限保证;MongoDB 只读游标按客户端连接限制,多文档事务不在只读兼容范围。完整边界见 只读说明 和 开发计划。

Windows 双击启动验证

已通过 go test ./...、go vet ./...,以及 Edge 无头浏览器的桌面启动回归。验证包括无管理员/主密钥环境变量启动、从其他工作目录启动、首次页面创建管理员、自动本机 TLS、DPAPI 密钥持久化、重启后原账号登录。初始化单元测试覆盖错误 token、跨来源请求和重复初始化;Windows 测试覆盖独占锁和数据库存在时禁止替换丢失密钥。

对解压后的发行包运行:

node scripts/verify-package.mjs <单EXE交付目录或serviceport.exe路径>
node scripts/verify-desktop.mjs <解压后的目录>/serviceport.exe

脚本只在独立临时工作目录中测试:无已有库时创建 data 且不创建隔离的 AppData;随后将测试数据移至隔离的 AppData,验证旧库复用、原账号登录、密钥不变且不另建本地库。整个过程不读取实际用户配置。桌面脚本用 Edge 自动操作首次设置页面,禁用系统浏览器弹窗并使用随机本机端口;系统默认浏览器关联及资源管理器双击交互未由此脚本覆盖。

0.2.0 新增验证范围

  • 独立目标 CRUD、多网关复用、目标修改/删除约束、旧版事务迁移、密码/SSH 身份/启用状态保留、网关存储不重复保存上游秘密。
  • 本机免登录开发会话、Host/来源/CSRF 限制;认证启用时的既有登录与重新认证测试。
  • MySQL 模拟服务压缩协商/回退、流量缩减、结果集和预编译;MongoDB 压缩协商/回退、压缩报文边界、凭据命令不压缩、只读网关转发。真实目标压缩仍需实际版本矩阵验证。
  • SQL/MongoDB 放行与拦截审计、预编译模板、日志故障阻止转发;SSH exec/输入/SFTP 解析;日志内容加密、分页、筛选和 7 天保留。
  • Edge 验证默认免登录、独立目标与网关表单、共享目标/只读策略、MongoDB/SSH/SOCKS5、压缩配置、三种主题及系统跟随/持久化、移动布局和命令审计入口。

2026-09-09 扩展验收

  • Go 1.25.0 全量单元、协议、API、迁移测试与 go vet 通过;Vue 类型检查与生产构建通过。
  • 隔离的真实 MySQL 5.7.44 实例通过 TLS + zlib、读写/只读、SHOW TABLE STATUS、SHOW FULL PROCESSLIST 和指定三语句批次测试;结果见 artifacts/mysql-verification/show-batches-mysql57.log。测试库自动清理,实例验证后关闭。
  • Redis 使用可控 RESP 服务验证认证、HELLO、流水线、订阅、取消及审计;RabbitMQ 使用 amqp091-go 客户端连接模拟 broker;PostgreSQL 使用 pgconn 客户端连接模拟后端,验证简单/扩展查询、参数化、认证及审计。尚未对真实 Redis、RabbitMQ、PostgreSQL 部署做版本兼容验收。
  • 审计测试覆盖跨三日 411 条记录分页、跨日关键词和完整导出、密文迁移、失败重试/冲突保护、7 天清理、取消和并发。连接事件覆盖旧记录迁移、跨日筛选/分页及 CSV 导出。未执行 Go race 检查(当前未配置所需 C 工具链)。
  • Edge 六项流程通过,覆盖拖拽连接、审计筛选/导出、共享目标、可选只读、SSH/SOCKS5 出口、三种新增服务配置、主题及移动布局。最后一项首次因 Edge 进程退出失败,单独重跑通过。