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

F21*_*F21 4 unit-testing go

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

我能够使用Go运行版runtime.Version()并进行各种比较.

但是,测试文件导入golang.org/x/net/http2.该http2包需要request.Cancel()net/http,但仅适用于进入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)
Run Code Online (Sandbox Code Playgroud)

我尝试添加// +build go1.5到文件的顶部,但它不起作用.

无论如何我可以限制单元测试文件,以便它只在Go 1.5+系统上构建和测试?

icz*_*cza 7

构建约束是这样做的正确方法.

但请注意,您的错误消息是指在Go 1.6http2添加的包,因此您至少需要go1.6构建约束.

构建约束

// +build go1.5
Run Code Online (Sandbox Code Playgroud)

将导致使用Go 1.5及更高版本编译文件.因此,如果您希望您的测试文件仅使用Go 1.6及更高版本进行编译和运行,请使用

// +build go1.6
Run Code Online (Sandbox Code Playgroud)

另外不要忘记:

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

要将构建约束与包文档区分开来,必须在一系列构建约束后面加一个空行.

一个工作的例子:

1  // +build go1.6
2
3  package yourpackage
Run Code Online (Sandbox Code Playgroud)