在写一些单测的时候,我们不希望一些代码在跑单测时被运行,因此,我们需要去判断当前环境是否为单测环境,搜了一大圈发现并没有找到一个很好的方法,后来我找到了一个奇淫技巧,首先可以确定的是,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
}
最后修改:2022 年 07 月 17 日
如果觉得我的文章对你有用,请随意赞赏