17

我有一个简单的函数,可以将配置文件解析为 JSON。我想编写一个测试,它要么使用一些示例静态配置文件并解析它们,要么在测试期间创建示例并尝试解析它们。

这个问题并不完全必要,但这里是基本代码:

// config.go

// ...(package,imports)...

// Overall settings - corresponds to main.conf
type MainSettings struct {
    // stuff
}

// Load main.conf from the specified file path
func LoadMainSettings(path string) (*MainSettings, error) {

    b, err := ioutil.ReadFile(path)
    if err != nil { return nil, err }

    r := &MainSettings{}
    err = json.Unmarshal(b, r)
    if err != nil { return nil, err }

    return r, nil

}

和测试:

// config_test.go

func TestLoadMainSettings(t *testing.T) {

    // possibly generate some example config files,
    // or use static samples packaged with the source

    s, err := LoadMainSettings("conf/main.conf") // <-- what should this path be??
    if err != nil { panic(err) }

    // more sanity checking...

}

也就是说,我的具体问题是:

  • 仅适用于测试的静态资产(如示例配置文件)是否有合适的位置?
  • 在测试执行期间,是否有适当的(跨平台,使用“go clean”清理)位置来写出临时文件?

(注意:我在 Linux 上运行我的大部分东西用于暂存和生产,在 Mac 上运行本地开发 - 所以在实践中使用 /tmp/ 作为测试的临时目录对我有用。但想知道是否有更好的方法......)


编辑:最终使用这种方法进行测试:

f, err := ioutil.TempFile("", "testmainconf")
if err != nil { panic(err) }
defer syscall.Unlink(f.Name())
ioutil.WriteFile(f.Name(), []byte("{...sample config data...}"), 0644)

s, err := LoadMainSettings(f.Name())

但是另一个让 LoadMainSettings 接受 anio.Reader而不是 astring的建议也是一个好主意。

4

4 回答 4

21

从 Go 版本 1.15 开始,现在T.TempDir()在标准testing包中。文档解释如下:

TempDir 返回一个临时目录供测试使用。当测试及其所有子测试完成时,Cleanup 会自动删除该目录。对 t.TempDir 的每次后续调用都会返回一个唯一的目录;如果目录创建失败,TempDir 通过调用 Fatal 终止测试。

于 2020-11-20T19:31:29.473 回答
14

您可以使用同一个包中的ioutil.TempDir或 TempFile。

于 2013-09-29T21:51:29.843 回答
10

只是为了与你所拥有的进行比较ioutil.TempDir,这里的情况是这样的io.Reader

// Load main.conf from the specified file path
func LoadMainSettings(src io.Reader) (*MainSettings, error) {
    b, err := ioutil.ReadAll(src)
    if err != nil { return nil, err }

    r := &MainSettings{}
    err = json.Unmarshal(b, r)
    if err != nil { return nil, err }

    return r, nil
}

具体来说,我们将参数从path字符串更改为src io.Reader实例,并将 替换ioutil.ReadFileioutil.ReadAll

您编写的测试用例最终会变得更短,因为我们可以省去文件操作:

s, err := LoadMainSettings(strings.NewReader("{...sample config data...}"))
于 2013-09-30T05:05:06.653 回答
0

你也可以这样做:

uniqueTempDir, err := os.MkdirTemp(os.TempDir(), "*-myOptionalSuffix")
if err != nil {
    return err
}
于 2022-01-16T09:04:36.207 回答