Unit testing 如果测试文件在go 1.4及以下版本的系统上运行,如何跳过该文件?
我有一个文件,其中包含一些应该在Go 1.5+上运行的测试 我可以使用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
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
指令和包名之间添加了一个空行?如果没有,它们就没有被考虑进去(估计它们被认为是文档)。就是这样!我忽略了空白行,认为内置指令是文档。