【问题标题】:How to shutdown glog completely to run go tests?如何完全关闭 glog 以运行 go 测试?
【发布时间】:2016-11-27 00:20:37
【问题描述】:

我正在为我的代码编写测试代码,并希望获得 100% 的代码覆盖率。

这意味着测试调用 glog.Fatal() 的极端情况。

所以我首先需要禁用 glog 的任何输出,因为我没有测试 glog。所以我可以运行 go test 而不在/tmp 中生成文件或向stderr 发送消息。

我需要的第二件事是调用glog.Fatal() 并调用os.Exit() 不会干扰运行测试。

我怎样才能做到这一点?

【问题讨论】:

    标签: go glog


    【解决方案1】:

    您应该可以通过对glog 接口进行编程来实现它。我不确定那是什么,但它可能看起来像

    type Logger interface {
      Fatal()
      Info()
      // etc...
    }
    

    那么你的包/函数/结构等,将不得不要求与包含全局相反的接口。

    type SomeStruct struct {
      log Logger
    }
    

    或者在您的顶级模块上:

    func SomeFunc(log Logger) {}
    

    使用接口可以将您的代码与特定于记录器的实现分离。

    在您的单元测试中,您可以创建一个特定于测试的记录器,它是一个存根或模拟。

    type TestLogger struct {}
    func (tl TestLogger) Fatal() {}
    func (tl TestLogger) Info() {}
    // etc....
    

    那么您的代码必须能够在您的生产代码中实例化和配置真实的Glog 实例。为了测试这一点,它应该像封装“创建”一个 Glog 实例一样简单。

    func NewLogger Logger {
      // configure `Glog` 
      // return `Glog`
    }
    

    这样您应该能够对NewLogger 正确配置记录器进行单元测试,而无需实际调用记录器。

    【讨论】:

    • 这看起来很有趣。我将删除 glog 依赖项。它使用全局变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 2021-08-08
    • 2012-02-15
    相关资源
    最近更新 更多