web-dev-qa-db-fra.com

Golang: tests et répertoire de travail

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?

36
Jesse Brands

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)
}
25
N8Theo

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.

22
Evan

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"
10
OneOfOne

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

10
Joe

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.

6
Tecker.Yu

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.

4
amazingfly

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
    }
}
0
kristianp