#go #go-testing
#Вперед #перейти к тестированию
Вопрос:
Я использую встроенный 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. «Итак, что я хочу, так это прослушать stdin в моей функции TestMain и либо запустить, либо завершить тесты». Не делайте этого. Используйте переменную среды или флаг командной строки, чтобы указать, следует ли запускать или пропускать тест. Чтение из stdin — плохая идея для такого рода управления. Использование флага командной строки имеет дополнительное преимущество в том, что он самодокументируется.
2. Речь идет не о пропуске тестов, а о сохранении подключений к таким вещам, как Kafka, и запуске тестов с этими подключениями, которые все еще активны. Проблема, которую необходимо решить, заключается в том, что установление этих подключений занимает много времени (~ 15 секунд), и это очень раздражает при каждом запуске тестов. Я хочу установить соединения, затем запускать тесты снова и снова (по требованию, конечно) без повторного установления соединений.
Ответ №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")
}