macOS Go1.18.3运行terratest报构建约束排除所有Go文件问题
这个报错90%都是基础配置错误,按以下顺序逐一排查即可:
1. 先检查测试文件后缀
Go 测试链仅识别以_test.go结尾的文件作为测试用例。如果你的测试文件命名为s3.go、terratest.go这类不带_test.go后缀的名字,哪怕代码写的全对,go test也会直接忽略目录下所有Go文件,抛出你看到的build constraints错误。
正确命名参考:
s3_creation_test.go,只要后缀符合要求即可,前缀名可自定义。
2. 修正测试文件的package声明
你当前测试代码写的package main是错误的。main包是Go用来标记可执行程序入口的,测试目录下的main包会被判定为无效构建目标直接排除。
- 如果测试文件放在项目的
./test子目录下,包名直接写package test(和目录名保持一致)即可。
修正后的测试文件头部示例:
package test import ( "regexp" "testing" "github.com/gruntwork-io/terratest/modules/terraform" "github.com/stretchr/testify/assert" ) // 原有的TestS3Creation函数逻辑不需要改动
3. 删除多余的构建约束与手动环境变量配置
你之前手动加的两行build标签、手动设置的GOOS/GOARCH全是多余的,反而会触发构建排除逻辑,直接全部删掉/取消:
- 把测试文件头部的这两行直接删除:
这部分标签强制要求开启cgo、匹配特定系统才编译,你本地如果默认没开cgo,反而会直接把测试文件排除。Terratest本身不需要手动加任何平台构建约束。//+build darwin,cgo linux //go:build (darwin && cgo) || linux - 执行命令取消手动设置的环境变量,Go会自动匹配你当前的系统架构:
unset GOOS GOARCH
4. 拉齐依赖,用正确的命令执行测试
回到项目根目录,先执行依赖整理命令,拉取所有缺失的依赖包:
go mod tidy
注意执行测试的路径:如果你的测试代码放在./test子目录,不要直接在根目录跑go test -v,要显式指定测试目录:
go test -v ./test/...
直接在根目录执行go test时,工具链只会扫描根目录下的Go文件,根目录如果只有Terraform配置、没有Go源码/测试文件,同样会报找不到构建目标的错。
5. 兜底检查项
如果以上操作做完还是报错,再核对两个点:
- 执行
go env CGO_ENABLED查看输出,如果值为0,临时执行export CGO_ENABLED=1再重试(正常删掉错误build标签后不需要开cgo,这步仅兜底)。 - 检查测试文件有没有被误加
//go:build ignore这类排除标签,这类标签会直接让Go工具链跳过对应文件。
额外提一句:你写的正则^sg-*是有问题的,*在正则里是匹配前一个字符(这里是-)0次或多次,会匹配到sg、sg-这类不符合安全组ID格式的字符串,等测试跑通后可以改成^sg-[a-f0-9]+$,才能正确匹配AWS安全组ID格式。
内容的提问来源于stack exchange,提问作者Georgios F.

