【问题标题】:How does one exclude Mock or Stub structs from being built in Go如何将 Mock 或 Stub 结构排除在 Go 中构建
【发布时间】:2018-07-29 18:07:32
【问题描述】:

假设我有一个带有许多接口的 Go 包。对于此示例,我将重点关注 Middleware 中定义的 middleware.go

type Middleware interface {
  // some functions
}  

我有一些系统的其他部分使用它,所以为了更好地帮助测试系统的这些部分,我在mock_middleware.go 中手动创建了一个模拟实现:

type MockMiddleware struct {

}  

// implementations

在没有测试的情况下构建二进制文件时,如何将模拟类排除在二进制文件中?我知道middleware_test.go 将被排除在外,但我不想用该约定命名我的所有模拟,以免将实际测试与支持测试的实现混淆。

【问题讨论】:

  • AFAIK,Go 的编译器消除了死代码。因此,如果您的模拟类型仅用于测试,则可能已经从最终二进制文件中排除。此外,可能重复stackoverflow.com/a/42827979/965900
  • 这是一个公平的观点。我在浪费时间编译它,但是对于我的项目规模来说并不算太大。我想当您的应用程序变得相当大(例如 100,000 行代码)时,这将是一个问题。

标签: unit-testing go


【解决方案1】:

一种方法是使用Build Constraints

Go 甚至支持内置的 ignore 标签,但我不确定它与测试/基准工具链的交互:

不考虑构建文件:

// +构建忽略

【讨论】:

  • 我查看了构建约束,但找不到在此场景中实际工作的文档或示例。关于探索什么有什么建议吗?
  • 对不起,我对它们的唯一经验是对测试套件进行分区,并且只执行带有特定标签的测试,即单元、集成、服务。 Soundcloud 在此处说明了如何执行此操作:peter.bourgon.org/go-in-production/#testing-and-validation
猜你喜欢
  • 2017-04-24
  • 2021-03-20
  • 1970-01-01
  • 2012-11-25
  • 2017-06-23
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
相关资源
最近更新 更多