J'écris des tests unitaires pour mon application dans Go. Les tests échouent cependant car il ne trouve pas les fichiers de configuration. Normalement, le binaire recherche les fichiers de configuration dans le répertoire de travail sous le chemin conf/*.conf
.
J'ai pensé que la navigation vers le répertoire contenant conf/
et en cours d'exécution go test
dedans le résoudrait, mais il signale toujours que le système de fichiers ne trouve pas le chemin spécifié.
Comment puis-je dire go test
utiliser un certain répertoire comme répertoire de travail pour que les tests puissent réellement être exécutés?
Vous pourrez peut-être utiliser l'appelant pour obtenir le chemin d'accès au fichier source de test actuel, comme ceci:
package sample
import (
"testing"
"runtime"
"fmt"
)
func TestGetFilename(t *testing.T) {
_, filename, _, _ := runtime.Caller(0)
fmt.Println("Current test filename: " + filename)
}
Je ne pense pas que cela soit possible. Je n'ai pas pu trouver de documentation le mentionnant explicitement, mais je crois que go test
utilise toujours le répertoire du package (contenant les fichiers source go) comme répertoire de travail.
Bien que cela ne soit pas vraiment pratique, vous pouvez toujours le passer en tant que variable de ligne de commande, par exemple:
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)
}
Ensuite, exécutez-le comme:
┌─ oneofone@Oa [/tmp]
└──➜ go test . -cwd="$PWD"
--- FAIL: TestBlah (0.00 seconds)
blah_test.go:16: cwd: "/tmp"
Comme solution de contournement, j'ai compilé le test et exécuté le test à partir du répertoire actuel.
go test -c && ./<mypackage>.test
Ou, si vous voulez une commande générique que vous pouvez utiliser, vous pouvez renommer le fichier de test avec -o
option.
go test -c -o xyz.test && ./xyz.test
Peu importe où se trouve le répertoire de travail. Il doit être sous votre projet Dir. Donc ma solution est
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))
Votre chemin doit toujours commencer à partir de votre projet Dir. Chaque fois que vous lisez le fichier dans un package et que vous y accédez par main.go ou votre autre test unitaire de package. Cela fonctionnera toujours.
Vous pouvez utiliser le package os .
Vous voudriez faire quelque chose comme ça
func TestMyFunction(t *testing.T) {
os.Chdir("./path")
//TEST FUNCTION
os.Chdir("..")
}
Il existe plusieurs possibilités dans le package os.
J'utiliserais une variable d'environnement pour l'emplacement de votre application. Cela semble être le meilleur moyen lors de l'exécution des outils go, car les programmes de test peuvent être exécutés à partir d'un emplacement temporaire.
// 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
}
}