问题描述
我正在使用内置的testing
模块来运行GO项目中进行的一些功能测试。在我的项目中,我具有外部依赖关系,我可以通过TestMain
方法来连接到外部依赖关系。我将这些连接保存到变量中,然后在测试中使用这些变量,并且连接可能需要很长时间才能正确建立(卡夫卡有人吗?)。我想按需运行测试,但是在设置这些变量之后。
因此,我想听的是stdin
函数中的TestMain
,然后运行或退出测试。但是我希望它由用户控制,以便可以设置测试环境,并且测试将在命令上运行。
但是可悲的是,似乎在运行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
,但这取决于操作系统:
package tests
import (
"fmt"
"os"
"testing"
"bufio"
"runtime"
)
func TestMain(m *testing.M) {
var ttyName string
if runtime.GOOS == "windows" {
ttyName = "con"
} else {
ttyName = "/dev/tty"
}
f,err := os.Open(ttyName)
if err != nil {
panic(err)
}
defer f.Close()
oldStdin := os.Stdin
defer func() { os.Stdin = oldStdin }()
os.Stdin = f
reader := bufio.NewReader(os.Stdin)
if input,err := reader.ReadString('\n'); err != nil {
fmt.Println("Error:",err)
fmt.Println("-----------")
fmt.Println(input)
os.Exit(1)
}
fmt.Println("ESCAPED!")
os.Exit(m.Run())
}
func TestHello(t *testing.T){
fmt.Println("Hello")
}