我可以在go中创建共享测试实用程序吗?

mmi*_*all 16 go

我想知道是否可以在go中共享包中的测试实用程序代码.具体来说,我正在编写一个TCP服务器,将由多个处理程序用于不同的消息类型,并希望重用一组常用的测试工具.

主TCP服务器代码位于mypkg/tcpserver:

mypkg/tcpserver/tcp_server.go
mypkg/tcpserver/tcp_server_test.go
mypkg/tcpserver/testutils_test.go
Run Code Online (Sandbox Code Playgroud)

testutils_test.go代码旨在成为一个共享库,可供mypkg/tcpserver其他软件包使用,以便为其测试设置测试服务器和客户端.例如,在handler子包中,我有:

mypkg/tcpserver/handler/handler.go
mypkg/tcpserver/handler/csv_handler.go
mypkg/tcpserver/handler/csv_handler_test.go
mypkg/tcpserver/handler/delim_handler.go
mypkg/tcpserver/handler/delim_handler_test.go
Run Code Online (Sandbox Code Playgroud)

这些handler/*_test.go文件都是导入的mypkg/tcpserver,但是它们无法访问以下定义的测试实用程序mypkg/tcpserver/testutils_test.go:

$ wgo test mypkg/tcpserver/handler
# mypkg/tcpserver/handler
src/mypkg/tcpserver/handler/csv_handler_test.go:37: undefined: tcpserver.CreateTestServer
src/mypkg/tcpserver/handler/csv_handler_test.go:40: undefined: tcpserver.TestSender
FAIL    mypkg/tcpserver/handler [build failed]
Run Code Online (Sandbox Code Playgroud)

看来测试可以导入其他包,但不能导入这些包中定义的测试代码?这是意图吗?如果是这样,是否有一种惯用的方式在go中共享测试实用程序?

小智 14

如果您无法创建测试实用程序包(由于文档、依赖项等),请尝试将测试实用程序移动到单个 go 文件,并//go:build testing在文件顶部添加注释。然后您可以使用 运行测试go test -tags testing ./...。此代码不会包含在go build二进制文件中。

查看有关 go build 标签的更多信息:https ://pkg.go.dev/cmd/go#hdr-Build_constraints


Cer*_*món 12

在非_test.go文件中创建包含测试实用程序的包.这种方法的几个例子是httptestiotest.

  • @mmindenhall; 你可以把它作为[内部包](https://golang.org/doc/go1.4#internalpackages),它目前[仍然显示godoc](https://golang.org/pkg/net/http/internal /)但至少它更明显它只是内部的,也许godoc可以获得一个功能来过滤掉未来的内部包. (5认同)
  • 达恩...我希望避免在主代码库中使用测试包(即显示在godoc中)。 (4认同)