猿问

golang 测试临时目录

我有一个简单的函数,可以将配置文件解析为 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的建议也是一个好主意。


qq_笑_17
浏览 274回答 3
3回答

慕神8447489

只是为了与你所拥有的进行比较ioutil.TempDir,以下是与 的情况io.Reader:// Load main.conf from the specified file pathfunc LoadMainSettings(src io.Reader) (*MainSettings, error) {&nbsp; &nbsp; b, err := ioutil.ReadAll(src)&nbsp; &nbsp; if err != nil { return nil, err }&nbsp; &nbsp; r := &MainSettings{}&nbsp; &nbsp; err = json.Unmarshal(b, r)&nbsp; &nbsp; if err != nil { return nil, err }&nbsp; &nbsp; return r, nil}具体来说,我们改变从参数path字符串的src io.Reader实例,我们在更换ioutil.ReadFile用ioutil.ReadAll。您编写的测试用例最终会缩短一点,因为我们可以省去文件操作:s, err := LoadMainSettings(strings.NewReader("{...sample config data...}"))

慕婉清6462132

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

慕哥9229398

从 Go 1.15 版开始,现在T.TempDir()在标准testing包中。该文档解释如下:TempDir 返回一个临时目录供测试使用。当测试及其所有子测试完成时,Cleanup 会自动删除该目录。每次对 t.TempDir 的后续调用都会返回一个唯一的目录;如果目录创建失败,TempDir 通过调用 Fatal 终止测试。
随时随地看视频慕课网APP

相关分类

Go
我要回答