uber-go/goleak
GitHub: uber-go/goleak
一款用于在 Go 测试结束时检测并防止 Goroutine 泄漏的轻量级工具库。
Stars: 5208 | Forks: 162
# goleak [][doc] [][ci] [][cov]
Goroutine 泄漏检测器,用于帮助避免 Goroutine 泄漏。
## 安装
你可以使用 `go get` 来获取最新版本:
`go get -u go.uber.org/goleak`
`goleak` 同样支持 semver 版本发布。
请注意,go-leak 仅[支持][release] Go 的两个最新次要版本。
## 快速开始
为了验证在测试结束时没有意外的 goroutine 正在运行:
```
func TestA(t *testing.T) {
defer goleak.VerifyNone(t)
// test logic here.
}
```
除了在每个测试结束时检查泄漏,`goleak` 还可以通过为你的
包创建一个 `TestMain` 函数,在
每个测试包结束时运行:
```
func TestMain(m *testing.M) {
goleak.VerifyTestMain(m)
}
```
### 注意
对于使用 [t.Parallel](https://pkg.go.dev/testing#T.Parallel) 的测试,`goleak` 无法
区分是发生泄漏的 goroutine 还是尚未运行完毕的测试。
```
func TestA(t *testing.T) {
tt := struct{
name string
input SomeType
expected string
}{
// ...
}
for _, t := range tt {
t.Run(t.name, func(t *testing.T) {
t.Parallel() // <- goleak gets confused here!
// ...
}
}
}
```
对于这类情况,你也应该如上所述使用 `goleak.VerifyTestMain`。
## 确定包泄漏的来源
当使用 `TestMain` 验证泄漏时,泄漏测试只会在所有测试
运行完毕后执行一次。这通常足以确保没有 goroutine 从
测试中泄漏,但是当发生泄漏时,很难确定是哪个测试导致了泄漏。
你可以使用以下 bash 脚本来确定失败测试的来源:
```
# 创建一个 test binary,用于单独运行每个测试
$ go test -c -o tests
# 单独运行每个测试,为成功的测试打印“.”,或为
# 失败的测试打印测试名称。
$ for test in $(go test -list . | grep -E "^(Test|Example)"); do ./tests -test.run "^$test\$" &>/dev/null && echo -n "." || echo -e "\n$test failed"; done
```
这只会打印出失败测试的名称,以便单独进行调查。例如,
```
.....
TestLeakyTest failed
.......
```
## 稳定性
goleak 是 v1 版本,并严格遵循 [SemVer](http://semver.org/)。
在 2.0 版本之前,不会对导出的 API 进行任何破坏性更改。
标签:EVTX分析, Golang, Goroutine, Go语言, SOC Prime, Uber开源, 代码分析, 内存泄漏, 凭证管理, 协程泄漏, 单元测试, 安全编程, 并发编程, 开发工具, 性能优化, 日志审计, 检测绕过, 测试工具, 程序破解