【问题标题】:How do I package golang test helper code?如何打包 golang 测试助手代码?
【发布时间】:2019-10-17 15:36:58
【问题描述】:

我的 golang 库中有一些测试助手代码,我想在测试各种子包时使用这些代码。但是,我遇到了一个障碍:

outer
|
+- test_helpers_test.go
|
+- inner
   |
   +- something.go
   +- something_test.go

要使用test_helpers_test.go中的代码,我必须导入外包装。但是当我从something_test.go导入外包时,报错“import cycle not allowed in test”

所以我尝试为共享测试助手制作一个包:

outer
|
+- test
|  |
|  +- test_helpers_test.go
|
+- inner
   |
   +- something.go
   +- something_test.go

现在它抱怨“/home/karl/Projects/outer/test 中没有非测试 Go 文件”

我不想称它为test_helpers.go,因为它是我的测试代码的一部分,而不是我的库代码。我不想在库中发布该代码。

我该如何解决这个问题?


更新:我可以通过在test 目录中创建一个dummy.go 文件来解决此问题,但现在出现了一个新问题:导入包不会导入其测试代码!所以现在我得到:./something_test.go:12:2: undefined: test.AssertDoesPanic

【问题讨论】:

  • 您可以将其称为 test_helpers.go,但将其放在名为 testdata 的包中。
  • 这与在名为 test 的包中调用 test_helpers.go 有何不同?
  • 不确定 test 包名,但 testdata 被 go 工具忽略。
  • 我不希望它被忽略。它包含我要调用的测试代码。
  • @Karl,是的。您库的用户无法导入您的内部包。

标签: go testing


【解决方案1】:

你是对的,你不能从另一个包中导入测试代码,所以你的辅助函数必须进入正确的代码文件而不是测试文件。

如果它不是从您的非测试代码中导入的,那么它将不会被构建到最终的二进制文件中。

作者倾向于将包称为 ...test 以表明它只是测试助手,例如来自标准库的 httptest 或来自开源的 zaptest

https://golang.org/pkg/net/http/httptest/ https://godoc.org/go.uber.org/zap/zaptest

【讨论】:

    【解决方案2】:

    go issue 8279 之后,我看到添加了虚拟文件,如tommie/acme-cli commit 479f8c7

    outer/outer.go
    
    // +build ignore+
    package outer
    

    作为一种解决方法,看看这是否有帮助。


    如上所述,在internal package (from Go 1.4+) 中使用测试助手代码是另一种选择,因为该项目中的任何客户端都无法访问所述助手。见design document
    您可以看到它在typical Go project layout 中使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-28
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-19
      相关资源
      最近更新 更多