Go 在测试设置方法中连接标准DIN

Go 在测试设置方法中连接标准DIN,go,go-testing,Go,Go Testing,我正在使用内置的测试模块来运行我在GO项目中的一些功能测试。在我的项目中,我有外部依赖项,我在TestMain方法中连接到这些依赖项。我将这些连接保存到变量中,然后在测试中使用这些变量,这些连接可能需要很长时间才能正确建立(Kafka Anywhere?)。我想按需运行测试,但是在设置了这些变量之后 因此,我想要的是在我的TestMain函数中收听stdin,然后运行或退出测试。但是我希望它由用户控制,这样我就可以设置我的测试环境,并且测试将在我的命令上运行 但遗憾的是,在运行go test…时

我正在使用内置的
测试
模块来运行我在GO项目中的一些功能测试。在我的项目中,我有外部依赖项,我在
TestMain
方法中连接到这些依赖项。我将这些连接保存到变量中,然后在测试中使用这些变量,这些连接可能需要很长时间才能正确建立(Kafka Anywhere?)。我想按需运行测试,但是在设置了这些变量之后


因此,我想要的是在我的
TestMain
函数中收听
stdin
,然后运行或退出测试。但是我希望它由用户控制,这样我就可以设置我的测试环境,并且测试将在我的命令上运行

但遗憾的是,在运行
go test…
时,
stdin
似乎直接映射到
/dev/null
。因此,当我尝试读取os.Stdin时,我得到一个
EOF
错误。这方面的最低代码是:

package tests

import (
    "bufio"
    "fmt"
    "os"
    "testing"
)

func TestMain(m *testing.M) {
    reader := bufio.NewReader(os.Stdin)
    if input, err := reader.ReadString('\n'); err != nil {
        fmt.Println(err)
        fmt.Println("-----------")
        fmt.Println(input)
        os.Exit(1)
    }
    fmt.Println("ESCAPED!")
    os.Exit(m.Run())
}

我已经在圈里读过如何在单元测试和排序中模拟它,但我的案例更像是一个功能测试运行程序。有没有一种方法,或者甚至一些诡计,可以让我打开或更改测试过程
stdin

您可以重定向
os.stdin
,但这取决于操作系统:

包测试
进口(
“fmt”
“操作系统”
“测试”
“布菲奥”
“运行时”
)
func TestMain(m*testing.m){
var ttyName字符串
如果runtime.GOOS==“windows”{
ttyName=“con”
}否则{
ttyName=“/dev/tty”
}   
f、 错误:=os.Open(ttyName)
如果错误!=零{
恐慌(错误)
}
延迟f.关闭()
oldStdin:=os.Stdin
defer func(){os.Stdin=oldStdin}()
os.Stdin=f
reader:=bufio.NewReader(os.Stdin)
如果输入,err:=reader.ReadString('\n');err!=nil{
fmt.Println(“错误:”,错误)
格式打印项次(“------------”)
fmt.Println(输入)
操作系统退出(1)
}
fmt.Println(“转义!”)
操作系统退出(m.Run())
}
func TestHello(t*testing.t){
fmt.Println(“你好”)
}

“所以我想在TestMain函数中监听stdin,然后运行或退出测试。”不要这样做。使用环境变量或命令行标志来控制是运行还是跳过测试。从stdin读取数据对于这种控制来说是个坏主意。使用命令行标志还有一个额外的好处,那就是它是自我记录的。这不是关于跳过测试,而是关于保持与Kafka之类的连接,并在这些连接仍处于活动状态的情况下运行测试。要解决的问题是,建立这些连接需要很长的时间(~15秒),而且每次运行测试时都很烦人。我想建立连接,然后一遍又一遍地运行测试(当然是根据需要),而不需要重新建立连接。