Голанг: тесты и рабочий каталог
Я пишу некоторые модульные тесты для своего приложения в Go. Однако тесты не работают, потому что они не могут найти файлы конфигурации. Обычно двоичный файл ищет файлы конфигурации в рабочем каталоге по пути conf/*.conf
.
Я решил, что просмотр в каталоге с conf/
и запуском go test
в нем решит его, но он все еще сообщает, что файловая система не может найти указанный путь.
Как я могу сказать go test
использовать определенный каталог в качестве рабочего каталога, чтобы на самом деле могли быть выполнены тесты?
Ответы
Ответ 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)
}
}