Unit testing 内存中用于测试的文件

Unit testing 内存中用于测试的文件,unit-testing,go,Unit Testing,Go,如何在Go中创建用于单元测试的内存文件 在Python中,我使用或测试从文件读取或写入文件。例如,要测试文件解析器,我需要 def test_parse_function(): infile = io.StringIO('''\ line1 line2 line3 ''') parsed_contents = parse_function(infile) expected_contents = ['line1', 'line2', 'line3'] # or whate

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

在Python中,我使用或测试从文件读取或写入文件。例如,要测试文件解析器,我需要

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
你可以用一个

通常,最好在代码中使用和接口(缓冲区同时实现这两个接口)来处理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)
}
测试:

正如在“”中提到的,您可以将其用于文件抽象,从而简化测试

该图书馆有:

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

每次初始化时,它都有一个完全空白的状态,并且无论操作系统如何,都可以轻松复制。
您可以随心所欲地创建文件,文件访问速度会很快,同时还可以避免删除临时文件、Windows文件锁定等所有烦人的问题。
MemMapFs后端非常适合测试

  • 比在磁盘上执行I/O操作快得多
  • 避免安全问题和权限
  • 更大的控制力。”<代码>rm-rf/“信心十足
  • 测试设置要容易得多
  • 不需要测试清理
它使用一个。

它是完全并发的,可以在go例程中安全地工作。

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


这对于以下情况很有用。

Afero模拟整个文件系统。与我的需求相比,这真的很重,我只需要模拟文件I/O。不过,我可以看出Afero对Hugo这样的东西有多大的价值。
// 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()
    }
}
import "bytes"

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