在写一些单测的时候,我们不希望一些代码在跑单测时被运行,因此,我们需要去判断当前环境是否为单测环境,搜了一大圈发现并没有找到一个很好的方法,后来我找到了一个奇淫技巧,首先可以确定的是,golang的单测一定需要在*_test.go
中运行,因此,只需要在堆栈中,查找是否有*_test.go
即可。
实现代码:
package utils
import (
"runtime/debug"
"strings"
)
func IsInTest() bool {
// 堆栈信息按行分开
stacks := strings.Split(string(debug.Stack()), "\n")
for _, line := range stacks {
// 堆栈中\t开头为文件路径
if strings.HasPrefix(line, "\t") {
// 去除堆栈中的行号
path := strings.Split(strings.TrimSpace(line), ":")[0]
// 是否为_test.go结尾
if strings.HasSuffix(path, "_test.go") {
return true
}
}
}
return false
}