unit test golang create unit-testing go working-directory

unit testing - test - Golang: pruebas y directorio de trabajo



create test golang (7)

Aunque no es realmente conveniente, siempre se puede pasar como una variable de línea de comando, por ejemplo:

package blah_test import ( "flag" "fmt" "os" "testing" ) var ( cwd_arg = flag.String("cwd", "", "set cwd") ) func init() { flag.Parse() if *cwd_arg != "" { if err := os.Chdir(*cwd_arg); err != nil { fmt.Println("Chdir error:", err) } } } func TestBlah(t *testing.T) { t.Errorf("cwd: %+q", *cwd_arg) }

Luego ejecútelo como:

┌─ oneofone@Oa [/tmp] └──➜ go test . -cwd="$PWD" --- FAIL: TestBlah (0.00 seconds) blah_test.go:16: cwd: "/tmp"

Estoy escribiendo algunas pruebas de unidad para mi aplicación en Go. Sin embargo, las pruebas fallan porque no puede encontrar los archivos de configuración. Normalmente, el binario busca los archivos de configuración en el directorio de trabajo bajo la ruta conf/*.conf .

Pensé que la búsqueda en el directorio que tiene conf/ y ejecutar go test iría a resolverlo, pero todavía informa que el sistema de archivos no puede encontrar la ruta especificada.

¿Cómo puedo decirle a go test que use cierto directorio como directorio de trabajo para que las pruebas se puedan ejecutar?


Como solución alternativa, compilé la prueba y la ejecuté desde el directorio actual.

go test -c && ./<mypackage>.test

O bien, si desea un comando genérico que pueda usar, puede cambiar el nombre del archivo de prueba con la opción -o .

go test -c -o xyz.test && ./xyz.test


No creo que esto sea posible. No he podido encontrar documentación que indique esto explícitamente, pero creo que go test siempre utiliza el directorio del paquete (que contiene los archivos fuente go) como el directorio de trabajo.


No importa dónde esté el directorio de trabajo. Debe estar bajo su proyecto Dir. Entonces mi solución es

wd, _ := os.Getwd() for !strings.HasSuffix(wd, "<yourProjectDirName>") { wd = filepath.Dir(wd) } raw, err := ioutil.ReadFile(fmt.Sprintf("%s/src/conf/conf.dev.json", wd))

Su ruta siempre debe comenzar desde su proyecto Dir. Cada vez que lea el archivo en un paquete y acceda a main.go o a otra prueba de su unidad de paquete. Siempre funcionará.


Puede usar el paquete os .

Deberías hacer algo como esto

func TestMyFunction(t *testing.T) { os.Chdir("./path") //TEST FUNCTION os.Chdir("..") }

Hay varias posibilidades en el paquete os.


Puede usar la persona que llama para obtener la ruta al archivo fuente de prueba actual, como este:

package sample import ( "testing" "runtime" ) func TestGetFilename(t *testing.T) { _, filename, _, _ := runtime.Caller(0) fmt.Println("Current test filename: " + filename) }


Usaría una variable de entorno para la ubicación de su aplicación. Parece ser la mejor forma de ejecutar las herramientas go, ya que los programas de prueba se pueden ejecutar desde una ubicación temporal.

// get home dir of app, use MYAPPHOME env var if present, else executable dir. func exeDir() string { dir, exists := os.LookupEnv("MYAPPHOME") if exists { return dir } else { ex, err := os.Executable() if err != nil { panic(err) } exPath := path.Dir(ex) return exPath } }