Когда я запускаю "go test", я хочу использовать другой файл конфигурации. Как узнать в моем коде, если я запускаю тестовый контекст или обычный контекст? Есть ли какая-то переменная среды для проверки?
Как я узнаю, что я работаю в тесте "go test"
Ответ 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")
}
}