GO прикрепите stdin в методе настройки теста

Я использую встроенный testingмодуль для запуска некоторых функциональных тестов, которые есть в моем проекте GO. В моем проекте у меня есть внешние зависимости, к которым я подключаюсь в своемTestMainметод. Я сохраняю эти соединения в переменных, которые затем использую в самих тестах, и для правильной установки соединений может потребоваться много времени (кто-нибудь Kafka?). Я хотел бы запускать тесты по запросу, но после настройки этих переменных.

Я хочу послушать 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?

1 ответ

Решение

Вы можете перенаправить 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")
}
Другие вопросы по тегам