繁体   English   中英

内存文件进行测试

[英]In-memory file for testing

如何在Go中创建用于单元测试的内存文件?

在Python中,我测试使用io.BytesIOio.StringIO从文件读取还是写入文件。 例如,要测试文件解析器,

def test_parse_function():
    infile = io.StringIO('''\
line1
line2
line3
''')
    parsed_contents = parse_function(infile)
    expected_contents = ['line1', 'line2', 'line3']  # or whatever is appropriate
    assert parsed_contents == expected_contents

同样,对于文件输出,我将具有以下内容:

def test_write_function():
    outfile = io.StringIO()
    write_function(outfile, ['line1', 'line2', 'line3'])
    outfile.seek(0)
    output = outfile.read()
    expected_output = '''\
line1
line2
line3
'''
    assert output == expected_output

您可以使用Buffer

通常,在代码中使用io.Readerio.Writer接口(Buffer都实现)是处理IO的好主意。 这样一来,您就可以以相同的方式处理各种输入/输出方法(本地文件,内存缓冲区,网络连接...),而无需知道正在使用的特定功能中要处理的内容。 它使其更加抽象,并使测试变得微不足道。


使用平凡功能的示例:

功能定义:

// mypkg project mypkg.go
package mypkg

import (
    "bufio"
    "io"
    "strings"
)

func MyFunction(in io.Reader, out io.Writer) {
    rd := bufio.NewReader(in)
    str, _ := rd.ReadString('\n')
    io.WriteString(out, strings.TrimSuffix(str, "\n")+" was input\n")
}

程序中的功能使用:

package main

import (
    "mypkg"
    "os"
)

func main() {
    mypkg.MyFunction(os.Stdin, os.Stdout)
}

测试:

// mypkg project mypkg_test.go
package mypkg

import (
    "bytes"
    "testing"
)

func TestMyFunction(t *testing.T) {
    ibuf := bytes.NewBufferString("hello\n")
    obuf := bytes.NewBufferString("")
    MyFunction(ibuf, obuf)
    if obuf.String() != "hello was input\n" {
        t.Fail()
    }
}

如“ 在Go中进行务实而有效的测试 ”中所述,您可以使用spf13/afero进行文件抽象,从而spf13/afero测试。

该库具有使用Afero进行测试

使用模拟文件系统进行测试有很大的好处。

每次初始化时,它都具有完全空白的状态,并且无论使用什么操作系统,都可以轻松地重现。
您可以按照自己的意愿创建文件,并且文件访问速度很快,同时还可以避免因删除临时文件,Windows文件锁定等所有烦人的问题。
MemMapFs后端非常适合测试。

  • 比在磁盘上执行I / O操作快得多
  • 避免安全问题和权限
  • 控制更多。 ' rm -rf / '充满信心
  • 测试设置要容易得多
  • 无需测试清理

它使用完全原子存储支持的文件系统( MemMapFs
它是完全并行的,并且可以安全地在go例程中运行。

如果您需要io.ReadSeeker ,并且不需要写访问权限,请使用bytes.Reader

import "bytes"

data := []byte("success")
readSeeker := bytes.NewReader(data)

这对于诸如http.ServeContent()事情很有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM