在非主包中运行类似主包



我们有一个包含相当数量的复杂测试的软件包。作为测试套件的一部分,它们在构建等上运行。

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,因为很多东西都无法访问。

看来我有三个选择:

  1. 以大写形式导出所有这些初始化变量和代码,以便我可以从子主包中使用它

  2. 复制整个代码。

  3. 将测试移动到子包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 测试跳过一些测试

把我带到了正确的轨道上。

本质上使用构建标记,这些标记在正常构建中不存在,但我可以在手动执行时提供。

相关内容

  • 没有找到相关文章

最新更新