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