【问题标题】:Load data files across different tests in Golang在 Golang 中跨不同测试加载数据文件
【发布时间】:2020-02-16 03:10:58
【问题描述】:

我的目录结构如下:

./gen/items/items.go
./gen/items/items_test.go
./gen/items/data/items.xml
./engine/action/actions_test.go

items.go 中,我有一个方法应该运行一次,并使用从items.xml 加载的项目填充一些数据结构。我使用绝对路径执行此操作,当代码在 items_test.go 中运行时,该路径有效,因为我假设 go test 中的当前工作目录是当前测试包的包根目录。

itemsXMLPath := "./data/items.xml"
absPath, err := path.Abs(itemsXMLPath)
if err != nil {
    ...
}
bytes, err := ioutil.ReadFile(absPath)

您可以在这里看到为什么绝对路径 ./data/items.xmlgen/items 目录中可以正常工作。

如果我在actions_tests.go 中运行测试,它会尝试使用来自action 的相对路径并失败,因为action 中没有data 目录。

当我在 items.go 中调用 loadFromXML 方法时,我希望它始终使用来自 items 目录的相对路径,这将搜索下面的数据目录。

我假设由于调用代码在items.go 中,路径将从那里开始,但它似乎使用了测试运行器或 go 运行器的工作目录(如果我运行 main.go)。

有没有办法确保无论是在测试运行中使用,还是在主运行中使用,xml 加载函数都使用来自 repo 中一致目录的相对路径(例如,我如何在运行时始终找到包根目录来自 MAIN 或测试)。

我确信有一种方法可以在不复制测试数据或不传递 loadFromXML 函数的相对路径的情况下实现这一点,必须根据调用方法的位置进行调整!

【问题讨论】:

  • 不,没有办法做到这一点。将文件名作为参数传递。您也可以使用实际的绝对路径(以斜线开头,而不是点开头),但如果您想在另一台机器上运行此代码,这显然不太实用。
  • 解释一下:运行时没有包,所以运行时没有“包根”之类的东西。包只是用于构建程序的东西,而不是在运行它时。
  • 那些 XML 文件是静态的吗?如果是,请使用 github.com/GeertJohan/go.ricegithub.com/gobuffalo/packr

标签: file go path absolute-path


【解决方案1】:

我最终只是编写了一个函数,它可以从项目中任何正在运行的文件夹中找到根目录,然后我可以从那里应用相对路径。似乎可以从主运行程序或测试运行程序运行。

func getRootPath() string {
    dir, err := os.Getwd()
    if err != nil {
        log.Fatal(err)
    }

    // Check if already in root directory (e.g. main.go)
    lastSlashIndex := strings.LastIndex(dir, "/")
    cName := dir[lastSlashIndex+1:]
    if cName == "#root-folder-name#" {
        return dir
    }

    // Get parent directory
    parent := filepath.Dir(dir)
    lastSlashIndex = strings.LastIndex(parent, "/")
    pName := parent[lastSlashIndex+1:]

    // If not at root, continue getting parent
    for pName != "#root-folder-name#" {
        parent = filepath.Dir(parent)
        lastSlashIndex = strings.LastIndex(parent, "/")
        pName = parent[lastSlashIndex+1:]
    }
    return parent
}

然后我可以把这个目录和相对路径连接起来,在filepath.Abs中使用

itemsXMLPath := getRootPath() + "/folder/path/data/items.xml"
absPath, err := filepath.Abs(itemsXMLPath)

【讨论】:

  • 工作目录与源位置无关。这仅在您从源代码树中实际执行代码时才有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
  • 2017-06-04
  • 1970-01-01
  • 2019-04-22
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
相关资源
最近更新 更多