Аргументы командной строки процесса в go test

Есть ли способ получить аргументы командной строки в go "tests",
Когда вы вызываете go test, очевидно, ваш main не запускается, так что есть способ обработать аргументы командной строки,

Один из способов - использовать пакеты flags и проверить аргументы командной строки в каждом тестируемом или тестируемом объекте, но это не идеально для того, что вам нужно делать это во многих местах, в отличие от как вы это делаете в main при запуске приложения.

РЕДАКТИРОВАТЬ: в основном, для нисходящих избирателей, я полагаю, вы пытаетесь решить вопрос, потому что считаете, что это неправильно, и против чистоты модульных тестов,

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

EDIT 2: для записи я положил функцию init() в один из моих файлов _test и установил переменную, установленную с помощью флагов, когда main вызывается таким образом.

Ответ 1

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

var envSetting = os.Getenv("TEST_ENV")

В качестве альтернативы, если использовать флаги, вы можете поместить свой код инициализации внутри функции init().

func init() {
    flags.Parse()
    myEnv = *envFlag
    // ...
}

Ответ 2

os.Args [1] = "-conf = my.conf"

flag.Parse()

Обратите внимание, что имя файла конфигурации жестко закодировано.

Ответ 3

Альтернативный подход заключается в том, чтобы сделать main() заглушкой, которая просто вызывает другую функцию после обработки аргументов flag.Parse(), например:

var flagvar int
func init() {
    flag.IntVar(&flagvar, "flagname", 1234, "help for flagname")
}

func main() {
    flag.Parse()
    submain(flag.Args)
}

func submain(args []string) {
   ...
}

Затем в ваших тестах могут быть установлены переменные флагов и аргументы, установленные до вызова submain(...), имитирующего установление флагов и аргументов командной строки. Этот подход можно использовать для максимизации охвата тестирования без фактического использования командной строки. Например, в main_test.go вы можете написать:

func TestSomething(t *testing.T) {
    flagvar = 23
    args := []string{"a", "b", "c"}
    submain(args)
    ...
}