为了账号安全,请及时绑定邮箱和手机立即绑定

GO 在测试设置方法中附加标准输入

GO 在测试设置方法中附加标准输入

Go
千万里不及你 2022-06-27 11:01:39
我正在使用内置testing模块来运行我在 GO 项目中进行的一些功能测试。在我的项目中,我有外部依赖项,我在我的TestMain方法中连接到这些依赖项。我将这些连接保存到变量中,然后我在测试中使用这些变量,并且连接可能需要很长时间才能正确建立(Kafka 有人吗?)。我想按需运行测试,但是在设置了这些变量之后。stdin所以我想要的是在我的函数中收听TestMain并运行或退出测试。但我希望它由用户控制,这样我就可以设置我的测试环境,并且测试将在我的命令下运行。但可悲的是,似乎在运行时go test ...直接stdin映射到/dev/null. 因此,当我尝试阅读时os.Stdin,会出现EOF错误。最低限度的代码是:package testsimport (    "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?
查看完整描述

1 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

您可以重定向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")

}


查看完整回答
反对 回复 2022-06-27
  • 1 回答
  • 0 关注
  • 191 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号