run golang testing go command-line-arguments go-flag

testing - run - golang exit



Procesar los argumentos de la línea de comando en go test (3)

En mi experiencia, las configuraciones ambientales se guardan mejor en variables ambientales. Puede confiar en variables globales así:

var envSetting = os.Getenv("TEST_ENV")

Alternativamente, si el uso de indicadores es un requisito, puede colocar su código de inicialización dentro de una función llamada init ().

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

¿Hay una manera de obtener los argumentos de la línea de comandos en "pruebas",
Cuando llama a go test obviamente, su main no se ejecuta, por lo que hay una manera de procesar los argumentos de la línea de comandos,

Una forma sería usar los paquetes de flags y verificar los argumentos de la línea de comandos en cada prueba o función que se está probando, pero eso no es ideal, ya que necesita hacerlo en muchos lugares, a diferencia de cómo lo hace simplemente en main cuando ejecutas la aplicación.

Uno puede pensar que es algo incorrecto y que está en contra de la pureza de las pruebas unitarias:

  1. no todas las pruebas son pruebas unitarias
  2. es muy funcional no confiar en las variables "ENV" y pasar las cosas como argumentos en la línea de comando,

Para el registro terminé poniendo una función init() en uno de mis archivos _test , y configuré la variable que se establece a través de indicadores cuando se llama al principal de esta manera.


Un enfoque alternativo es hacer que main() sea ​​un código auxiliar que simplemente llame a otra función después de que los argumentos sean procesados ​​por flag.Parse() , por ejemplo:

var flagvar int func init() { flag.IntVar(&flagvar, "flagname", 1234, "help for flagname") } func main() { flag.Parse() submain(flag.Args) } func submain(args []string) { ... }

Luego, en sus pruebas, se pueden establecer variables de bandera y establecer argumentos antes de llamar a submain(...) simulando el establecimiento de la línea de comando de submain(...) y argumentos. Este enfoque se puede utilizar para maximizar la cobertura de la prueba sin utilizar realmente una línea de comandos. Por ejemplo, en main_test.go, puede escribir:

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


os.Args[1] = "-conf=my.conf" flag.Parse()

Observe que el nombre del archivo de configuración está codificado.