Как я узнаю, что я работаю в тесте "go test" - программирование

Как я узнаю, что я работаю в тесте "go test"

Когда я запускаю "go test", я хочу использовать другой файл конфигурации. Как узнать в моем коде, если я запускаю тестовый контекст или обычный контекст? Есть ли какая-то переменная среды для проверки?

4b9b3361

Ответ 1

Пакет тестирования изменяет глобальную среду при загрузке: он регистрирует множество флагов командной строки. Итак, мы можем проверить, зарегистрированы ли эти флаги:

func init() {
    if flag.Lookup("test.v") == nil {
        fmt.Println("normal run")
    } else {
        fmt.Println("run under go test")
    }
}

Ответ 2

Примеры кода помогут. Но из вашего вопроса это звучит так, будто вы жестко закодировали путь к файлу конфигурации где-то, когда вы, вероятно, захотели передать его вместо этого.

Измените функцию, которую вы тестируете, чтобы принять параметр, определяющий конфигурационный файл, а затем в тестовом коде передайте другой путь, чем вы используете в не тестирующем коде. Плохая практика для вашего кода иметь другой путь при тестировании и производстве.

Ответ 3

Одна из возможностей заключается в использовании ограничений сборки. Если вы запустите go test как:

go test -tags testing pkgname

Затем вы можете использовать этот тег, чтобы выбрать, какие файлы будут включены в стандартную сборку вашего пакета и которые будут использоваться для тестирования.

Если вы разместите стандартную конфигурацию в собственном файле, добавив строку вверху, как показано ниже, убедитесь, что она не используется для тестирования:

// +build !testing

Затем вы можете включить конфигурацию тестирования в один из файлов *_test.go или в другой файл, для которого необходимо установить тег testing.

Ответ 4

Поскольку подход flag.Lookup("test.v") не работает для меня, я хотел бы поделиться своим решением:

strings.HasSuffix(os.Args[0], ".test")

Или

strings.Contains(os.Args[0], "/_test/")

Оба, похоже, работают.

Ответ 5

Более надежное решение, которое Garrett:

 func init() {
    if v := flag.Lookup("test.v"); v == nil || v.Value.String() != "true" {
        fmt.Println("normal run")
    } else {
        fmt.Println("run under go test")
    }
 }