GO 在测试设置方法中附加标准输入
GO attach stdin in test setup method
我正在使用内置的 testing
模块来 运行 我在 GO 项目中进行的一些功能测试。在我的项目中,我有外部依赖项,我在 TestMain
方法中连接到它们。我将这些连接保存到变量中,然后我自己在测试中使用这些连接,并且连接可能需要很长时间才能正确建立(Kafka 任何人?)。我想 运行 按需测试,但是在设置这些变量之后。
所以我想要的是在我的 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())
}
我已经在圈子里阅读了如何为单元测试和排序模拟这个,但我的案例更像是一个功能测试 运行ner。有什么方法,甚至是一些技巧,可以让我打开或更改测试过程 stdin
?
您可以重定向 os.Stdin
,但它取决于 OS:
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")
}
我正在使用内置的 testing
模块来 运行 我在 GO 项目中进行的一些功能测试。在我的项目中,我有外部依赖项,我在 TestMain
方法中连接到它们。我将这些连接保存到变量中,然后我自己在测试中使用这些连接,并且连接可能需要很长时间才能正确建立(Kafka 任何人?)。我想 运行 按需测试,但是在设置这些变量之后。
所以我想要的是在我的 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())
}
我已经在圈子里阅读了如何为单元测试和排序模拟这个,但我的案例更像是一个功能测试 运行ner。有什么方法,甚至是一些技巧,可以让我打开或更改测试过程 stdin
?
您可以重定向 os.Stdin
,但它取决于 OS:
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")
}