【问题标题】:Can I create shared test utilities?我可以创建共享测试实用程序吗?
【发布时间】:2022-04-10 22:27:41
【问题描述】:

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

主要的TCP服务器代码在mypkg/tcpserver:

mypkg/tcpserver/tcp_server.go
mypkg/tcpserver/tcp_server_test.go
mypkg/tcpserver/testutils_test.go

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

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]

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

【问题讨论】:

    标签: go


    【解决方案1】:

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

    【讨论】:

    • 该死...我希望避免在主代码库中有一个测试包(即显示在 godoc 中)。
    • @mmindenhall;你可以把它设为internal package,它现在是still show up godoc,但至少更明显的是它只是内部的,也许godoc将来会获得过滤掉内部包的功能。
    • Godoc.org 从搜索结果中过滤掉内部包,但在目录列表中显示它们。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-02-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      相关资源
      最近更新 更多