如何 运行 在多模块 Go 项目中进行测试

How to run tests in a multimodule Go project

我正在学习围棋 Programming with Google Go。它有几个课程,每个课程都有几个模块。

我的项目如下所示(使用 https://ascii-tree-generator.com/ 制作):

google-golang/
├─ .github/
│  ├─ workflows/
│  │  ├─ ci.yml
├─ golang-getting-started/
│  ├─ module1/
│  │  ├─ main.go
│  │  ├─ main_test.go
│  ├─ module2/
│  │  ├─ trunc/
│  │  │  ├─ main.go
│  │  │  ├─ main_test.go
├─ .gitignore
├─ README.md

我想 运行 每次提交 *_test.go 文件中的所有测试,但我不清楚该怎么做从根目录 (google-golang)。我认为不需要一个模块导入另一个模块,因为练习可以独立完成。 有两个答案,一个建议使用子模块,另一个建议使用 Go workspace,但都没有提供像我这样的新手可以学习的具体说明。

我不是在寻求有关 GitHub 操作的帮助,我知道如何编写这些操作。我正在寻找一个或多个可以找到并 运行 测试的命令。

您似乎对什么是模块感到困惑。根据经验,一个 go.mod 文件等于一个模块。 Go Wiki, gomod:

A module is defined by a tree of Go source files with a go.mod file in the tree's root directory.

根据问题中显示的目录树,看不到 go.mod 文件,因此没有 Go 模块。事实上,如果您尝试从 google-golanggolang-getting-started 中 运行 执行 module-aware 命令,您将得到:

go: go.mod file not found in current directory or any parent directory; see 'go help modules'

如果你想 运行 从 multi-module 回购的根目录进行所有测试,正如你问题的标题所说,使用 Go 1.17 你可以:

  1. 初始化 sub-modules:
$ cd google-golang/golang-getting-started/module1
$ go mod init example.com/module1
$ cd ../module2
$ go mod init example.com/module2
  1. 从 multi-module 项目的根目录使用 the trick suggested by Cerise Limón
$ cd google-golang
$ find . -name go.mod -execdir go test ./... \;

如果您实际上并不关心将 sub-repos 保留为单独的模块,您可以在根存储库中初始化一个模块,然后 运行 从那里进行所有测试:

$ cd google-golang # or google-golang/golang-getting-started/
$ go mod init example.com/mainmod
$ go test ./...

...然而,即使这个 hack 现在有效,它也没有多大意义,因为你的名为 moduleN 的回购有 main.go 个文件,其包应该命名为 main,在他们每个人中。所以它们确实被组织为单独的 sub-modules.