外观
测试、pprof 与故障排查
- 状态:未准备
- 适用方向:Go 全栈 / Go 后端
- 最近复习:待填写
- 下次复习:待安排
一句话回答
测试验证行为与失败路径,race 检测执行路径中的数据竞争,pprof 和 trace 用于找资源瓶颈;先形成证据再决定优化。
原理解释
表驱动测试覆盖正常、空输入、非法参数和依赖失败。HTTP 用 httptest,核心协调逻辑注入可控依赖;mock 通过不等于真实数据库、网络和 provider 集成通过。并发测试用完成信号和可控屏障安排时序,避免靠 Sleep 猜测。
sh
go test ./...
go test -race ./...
go vet ./...
go test -bench=. -benchmem ./...命令用于实际 Go 源码仓库,不在本 Markdown 资料库运行;race 需要受支持平台及相应工具链,成本更高,只检测实际覆盖路径。
| 现象 | 先看证据 | 再验证 |
|---|---|---|
| CPU 高 | CPU profile、请求量 | 热函数、循环空转、序列化成本 |
| 内存持续涨 | heap、分配量、goroutine 数 | 引用保留、无界队列、泄漏 |
| 延迟高但 CPU 低 | 数据库池等待、下游耗时、锁等待 | 慢依赖、连接不足、锁竞争 |
| 断连后资源不回落 | goroutine 栈与活跃连接 | 取消传播、阻塞收发、清理遗漏 |
CPU profile 看采样热点,goroutine profile 看等待栈;block/mutex profile 需配置采样,trace 更适合观察调度和时间关系。诊断接口应限制访问,避免暴露业务细节或增加公开攻击面。
场景与边界
基准记录工具链、机器、并发、数据规模、预热及基线,报告吞吐、P50/P95、错误率与分配,不把单次耗时当结论。压测期间同时观察下游和业务正确性。
项目中的应用
沿 EinoTalk dispatcher 测试和 SimulSpeak 乱序/停止用例设计失败注入;当前未宣称已运行这些项目测试。
常见追问
- 覆盖率高就充分? 不能代表断言有效、边界充分或调度被覆盖。
- race 无错误就没死锁? race 不是死锁与业务原子性证明工具。
- 线上怎么先恢复? 明确影响范围,限流/降级/回滚,并保留样本供后续定位。