我们有一个包含相当数量的复杂测试的软件包。作为测试套件的一部分,它们在构建等上运行。
func TestFunc(t *testing.T) {
//lots of setup stuff and defining success conditions
result := SystemModel.Run()
}
现在,对于其中一个测试,我想引入某种前端,这将使我能够调试一些东西。它不是真正的测试,而是一个调试工具。为此,我只想运行相同的测试,但使用构建器模式:
func TestFuncWithFrontend(t *testing.T) {
//lots of setup stuff and defining success conditions
result := SystemModel.Run().WithHTTPFrontend(":9999")
}
只有当我从前端通过HTTP发送信号时,测试才会开始。基本上WithHTTPFrontend()
只是等待来自前端的HTTP调用上的通道。
这当然会使自动测试失败,因为不会发送此类信号并且执行将挂起。
我不能只是将包重命名为main
,因为包有 15 个文件,并且它们在系统中的其他地方使用。
同样,我还没有找到一种方法来仅按需运行测试,同时将其从测试套件中排除,因此TestFuncWithFrontend
只能从命令行运行 - 我不在乎是使用go run
还是go test
或其他什么。
我也想到了ExampleTestFunc()
但是测试产生的输出太多了,它毫无用处,如果不定义Output: ...
,示例将无法运行。
不幸的是,测试需要的(私有,即小写(包级别也有很多初始化代码。所以我不能只创建一个子包main
,因为很多东西都无法访问。
看来我有三个选择:
以大写形式导出所有这些初始化变量和代码,以便我可以从子主包中使用它
复制整个代码。
将测试移动到子包
main
,然后有一个用于使用 Frontend 进行测试的func main()
和一个用于普通测试的_test.go
,这必须从父包导入一些内容。
我宁愿避免第二种选择...第一个更好,但恕我直言也不是很好。我想我会去第三个,但是...
我是否错过了其他选择?
您可以将自定义命令行参数传递给go test
并基于该参数启动调试端口。像这样:
package hello_test
import (
"flag"
"log"
"testing"
)
var debugTest bool
func init() {
flag.BoolVar(&debugTest, "debug-test", false, "Setup debugging for tests")
}
func TestHelloWorld(t *testing.T) {
if debugTest {
log.Println("Starting debug port for test...")
// Start the server here
}
log.Println("Done")
}
然后,如果您只想运行该特定测试,go test -debug-test -run '^TestHelloWorld$' ./
.
或者,也可以设置一个自定义环境变量,您可以在测试函数中签入该变量以更改行为。
我终于找到了一个可以接受的选择。这个答案
使用 go 测试跳过一些测试
把我带到了正确的轨道上。
本质上使用构建标记,这些标记在正常构建中不存在,但我可以在手动执行时提供。