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")
}