【问题标题】:How to test the main package in Golang from a "test" package?如何从“测试”包中测试 Golang 中的主包?
【发布时间】:2019-05-28 13:21:29
【问题描述】:

我有一个用 Golang 编写的简单程序。这是一个 API。所以在项目文件夹中,有一个名为 cmd 的文件夹,其中包含我的 main 包(用于初始化应用程序并定义 API 的端点)。还有一个以我的程序命名的文件夹,其中包含来自同样以我的程序命名的包中的多个文件。该包用作执行所有必要查询的模型,并包含我定义的所有类型。

我还创建了一个名为test 的文件夹。它包含我在名为test 的包下的所有测试文件。问题是要运行测试,我必须访问我的主包!有没有办法在 Golang 中做到这一点?我尝试简单地使用import "cmd/main",但它当然不起作用。

我也有一个想法。也许我可以将我所有的初始化函数(在cmd 文件夹中)移动到以我的程序命名的包中。这样我就可以在test 中做一个常规的import。我在cmd 的内部创建了一个main.gomain 包中用作编译器的入口点。

我是 Go 新手,所以我不是很自信。你认为这是正确的方式吗?

谢谢。

编辑:显然有些人认为这个问题是重复的,但事实并非如此。这是我对 cme​​ts 的解释:

我在发布之前阅读了这篇文章,但它没有回答我的问题 因为在那篇文章中,该人在主包中进行了测试。这 我问我的问题的原因是因为我不想让我的 在主包中进行测试。我宁愿把它们都放在一个测试文件夹中 在同一个包内。

【问题讨论】:

  • 我在发布之前阅读了这篇文章,但它没有回答我的问题,因为在那篇文章中,该人在主包中进行了测试。我问我的问题的原因是因为我不想在主包中进行测试。我宁愿将它们全部放在同一个包内的test 文件夹中。
  • @Flimzy 我编辑了我的帖子,如果您是版主,可以删除“重复”标题吗?
  • “在同一个包内的测试文件夹中”在 Go 中是不可能的。包是文件夹范围的。
  • 你不能导入“main”,所以你从“main”包中测试它。与 Go 工具抗争没有意义,只需像其他项目一样做。

标签: api unit-testing go


【解决方案1】:

你想做的事情在 GO 中是不可能的(假设你想测试私有函数)。

因为我不想在主包中进行测试。我宁愿 将它们全部放在同一个包内的测试文件夹中。

如果您将代码移动到不同的文件夹,您的代码属于不同的包。

这就是 GO 定义包的方式https://golang.org/doc/code.html#Organization

每个包都包含一个或多个单个中的 Go 源文件 目录。

这是您的代码结构:

main
| -- main.go (package main)
+ -- test
     | -- main_test.go (package test)

将测试与代码保存在同一个文件夹中是惯用的。如果语言或框架设置了一些开发人员必须遵循的规则,这是正常的。 GO 对此非常严格。

这是您组织代码的方式:

main
| -- main.go (package main)
| -- main_test.go (package main_test)
| -- main_private_test.go (package main)

根据公共接口测试代码通常是有意义的。做到这一点的最好方法是将测试放入不同的包中。 GO 约定是将测试保存在同一个文件夹中,这导致使用相同的包名称。该问题有一个解决方法。您可以在测试包名称中添加 _test (package main_test) 前缀。

如果无法使用公共接口测试您的代码,您可以添加另一个带有测试的文件并在该文件中使用package main

【讨论】:

  • 感谢您的回答。但是,如果我的所有测试都需要访问相同的功能怎么办?例如,在我的测试中,我经常需要清空一些表,所以我有一个名为“clearTable(tableName)”的函数。是否有共享所有这些功能的正确方法,或者我应该复制粘贴我想要为每个文件共享的功能?
  • @tomfl 函数具有包范围。将函数放在任何包文件中。如果函数只在测试中使用,将函数放在 _test.go 文件中。
  • @tomfl 我通常将所有共享测试例程移动到名为mock 的专用包中。就我而言,它是在针对不同包的测试中重用的存储库和外部服务的模拟。您需要的略有不同,但解决方案是相同的。因此,测试仍然与代码存储在同一个包中的代码附近,但实用程序存储在专用包中。
猜你喜欢
  • 2015-09-29
  • 2015-03-28
  • 2017-09-29
  • 2019-03-17
  • 2019-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
相关资源
最近更新 更多