Unit testing 如果测试文件在go 1.4及以下版本的系统上运行,如何跳过该文件?

Unit testing 如果测试文件在go 1.4及以下版本的系统上运行,如何跳过该文件?,unit-testing,go,Unit Testing,Go,我有一个文件,其中包含一些应该在Go 1.5+上运行的测试 我可以使用runtime.version()并进行各种比较来获得Go运行时版本 但是,测试文件导入golang.org/x/net/http2。http2程序包需要来自net/http的request.Cancel(),但这仅适用于Go 1.5+ 在我的CI环境中导致以下错误,从而导致生成失败: ../../../golang.org/x/net/http2/transport.go:214: req.Cancel undefined

我有一个文件,其中包含一些应该在Go 1.5+上运行的测试

我可以使用
runtime.version()
并进行各种比较来获得Go运行时版本

但是,测试文件导入
golang.org/x/net/http2
http2
程序包需要来自
net/http
request.Cancel()
,但这仅适用于Go 1.5+

在我的CI环境中导致以下错误,从而导致生成失败:

../../../golang.org/x/net/http2/transport.go:214: req.Cancel undefined (type *http.Request has no field or method Cancel)
../../../golang.org/x/net/http2/transport.go:218: req.Cancel undefined (type *http.Request has no field or method Cancel)
../../../golang.org/x/net/http2/transport.go:777: req.Cancel undefined (type *http.Request has no field or method Cancel)
我尝试将
/+build go1.5
添加到文件顶部,但没有成功

我是否可以限制单元测试文件,使其仅在Go 1.5+系统上构建和测试?

这是正确的方法

但是请注意,您的错误消息引用的是以前的
http2
包,因此您至少需要
go1.6
build约束

构建约束

// +build go1.5
将导致使用Go 1.5及更高版本编译文件。因此,如果您希望您的测试文件只使用Go 1.6及更高版本编译和运行,那么使用

// +build go1.6
也不要忘记:

约束可能出现在任何类型的源文件中(不仅仅是Go),但它们必须出现在文件顶部附近,前面只有空行和其他行注释。这些规则意味着在Go文件中,生成约束必须出现在package子句之前

要将生成约束与包文档区分开来,一系列生成约束后面必须有一个空行

一个有效的例子:

1  // +build go1.6
2
3  package yourpackage

在测试文件的顶部包含build指令没有问题(
//+build ignore
成功地忽略了损坏的测试文件),但我正在运行go 1.6。愚蠢的问题:您是否在
build
指令和包名之间添加了一个空行?如果没有,它们就没有被考虑进去(估计它们被认为是文档)。就是这样!我忽略了空白行,认为内置指令是文档。