Подтвердить что ты не робот

Голанг: тесты и рабочий каталог

Я пишу некоторые модульные тесты для своего приложения в Go. Однако тесты не работают, потому что они не могут найти файлы конфигурации. Обычно двоичный файл ищет файлы конфигурации в рабочем каталоге по пути conf/*.conf.

Я решил, что просмотр в каталоге с conf/ и запуском go test в нем решит его, но он все еще сообщает, что файловая система не может найти указанный путь.

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

4b9b3361

Ответ 1

Вы можете использовать Caller для получения пути к текущему исходному файлу теста, например так:

package sample

import (
    "testing"
    "runtime"
    "fmt"
)

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

Ответ 2

Я не считаю, что это возможно. Мне не удалось найти документацию, в которой это явно указано, но я считаю, что go test всегда использует каталог пакетов (содержащий исходные исходные файлы) в качестве рабочего каталога.

Ответ 3

Хотя это не очень удобно, вы всегда можете передать его как переменную командной строки, например:

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

Затем запустите его так:

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

Ответ 4

В качестве обходного пути я скомпилировал тест и выполнил тест из текущего каталога.

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

Или, если вы хотите использовать общую команду, которую вы можете использовать, вы можете переименовать тестовый файл с помощью опции -o.

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

Ответ 5

Независимо от того, где находится рабочий каталог. Это должно быть под вашим проектом Dir. Итак, мое решение

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))

Ваш путь должен всегда начинаться с вашего проекта Dir. Каждый раз, когда вы читаете файл в пакете и получаете доступ через main.go или ваш другой пакет unit test. Он всегда будет работать.

Ответ 6

Вы можете использовать os package.

Вы хотели бы сделать что-то вроде этого

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

        //TEST FUNCTION

        os.Chdir("..")
    }

В пакете os имеется несколько возможностей.

Ответ 7

Я бы использовал переменную среды для размещения вашего приложения. Кажется, что это лучший способ запускать инструменты go, поскольку тестовые программы можно запускать из временного местоположения.

// 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
    }
}

Ответ 8

У меня была похожая проблема, и я нашел решение в этом блоге

Как правило, вы можете изменить папку, в которой выполняется тест, используя аналогичную функцию:

package main

import (
    "os"
    "path"
    "runtime"
)

func MakeFunctionRunOnRootFolder() {
    _, filename, _, _ := runtime.Caller(0)
    // The ".." may change depending on you folder structure
    dir := path.Join(path.Dir(filename), "..")
    err := os.Chdir(dir)
    if err != nil {
        panic(err)
    }
}