# 测试策略 ## 1. 分层 - **领域单测**:状态机、TTL、路由、容量、Fetch 分类和 Extraction 原子性。 - **契约测试**:配置、OpenAPI、Protobuf 和 Provider Adapter fixture。 - **集成测试**:PostgreSQL 事务、Redis Leader/限流、Outbox 与重建。 - **端到端测试**:HTTP、CONNECT、Admin、Distribution 和优雅停机。 - **负载测试**:Worker 调度微基准、50k 隧道 soak、集群 100k QPS 场景。 ## 2. 必测不变量 1. 1,000 个并发预留不突破单 Proxy 最大并发。 2. 同一 Proxy 在并发 Extraction 中最多出现一次。 3. `allOrNothing` 不足时不消耗任何候选。 4. 连续 4 次 Empty 后 Valid 不切换;连续 5 次只从 A 切到 B。 5. Error 和 DuplicateOnly 不累计 Empty。 6. 100 个缺池信号只形成一个合并 Provider reconcile。 7. 并发 Fetch 不突破 `pool.maxSize` 与 `fetch.maxTotal`。 8. TTL safety margin 内不再分配。 9. Snapshot 版本断档、目标错误或校验和错误不替换当前视图。 10. 非幂等 HTTP 和已建立 CONNECT 不自动重放。 11. 所有 Upstream 不可用时严格执行显式策略。 ## 3. 基础质量门禁 ```powershell gofmt -l . go vet ./... go test ./... go test -race ./internal/... go build ./... ``` 单条测试命令超时 60 秒。依赖真实等待的用例必须改为 fake clock;集成和 soak 测试单独标记,不混入快速单测。 ## 4. 100k QPS 验收 测试报告必须记录: - CPU、内存、内核、网卡、文件描述符和 conntrack 配置。 - Worker 数量、故障域、目标利用率和负载均衡算法。 - HTTP/CONNECT 比例、keep-alive、请求/响应大小、上游 RTT 与失败率。 - Proxy 总数、每 Proxy 容量、Routing 数和 Snapshot 更新频率。 - 持续时间、P50/P95/P99、成功率、重试率、GC、RSS 和 goroutine 数。 只有在代表性环境持续达到目标且满足错误率和延迟门槛后,才能把“设计目标” 改为“已验证容量”。 ## 5. 当前本地微基准 2026-07-28,Windows/amd64、Intel Core Ultra 7 155H: ```text BenchmarkAcquire100kIndexed-22 3553592 640.0 ns/op 256 B/op 2 allocs/op BenchmarkStoreApply100k-22 1 472.7 ms/op 654 MB/op 2700642 allocs/op ``` `Acquire` 已使用 scheme/upstream/tag 索引,结果只代表本地选择和容量预留。 `Store.Apply` 属于冷路径且当前内存开销较高;运行态为防止旧快照在途连接超配, 暂不自动回收曾出现过的 Proxy ID。后续需要基于 RCU/引用计数定义安全回收点。 这些数据不包含网络、认证、Provider、存储或多 Worker 协调,不能作为 100k QPS 端到端验收结论。