Перейти к подключению stdin в методе настройки теста

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