golang测试临时目录

时间:2013-09-29 18:46:48

标签: file testing go

我有一个简单的函数,它将配置文件解析为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...

}

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

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

(注意:我在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接受io.Reader而不是string的建议也是一个好主意。

3 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:8)

只是为了与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.ReadFile替换为ioutil.ReadAll

您编写的测试用例最终会缩短,因为我们可以免除文件操作:

s, err := LoadMainSettings(strings.NewReader("{...sample config data...}"))

答案 2 :(得分:1)

从Go版本1.15开始,标准let p0 = pickerArray[0][pickerViewOutlet.selectedRow(inComponent: 0)] let p1 = pickerArray[1][pickerViewOutlet.selectedRow(inComponent: 1)] let p2 = pickerArray[2][pickerViewOutlet.selectedRow(inComponent: 2)] 软件包中现在包含T.TempDir()docs explain it如下:

TempDir返回一个临时目录供测试使用。的 测试和所有 其子测试完成。随后每次调用t.TempDir都会返回一个 唯一目录;如果目录创建失败,则TempDir终止 通过致电致命来进行测试。