亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 153 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號