Go语言 用于测试的内存文件

qkf9rpyu  于 2022-12-20  发布在  Go
关注(0)|答案(3)|浏览(125)

在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
yxyvkwin

yxyvkwin1#

可以使用缓冲区。
一般来说,在代码中使用io.Reader和io.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()
    }
}
qybjjes1

qybjjes12#

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

import "bytes"

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

这对于http.ServeContent()之类的东西很有用。
或者,更简单地说:

import "strings"

readSeeker := strings.NewReader("success")
wydwbb8l

wydwbb8l3#

正如在“Pragmatic and Effective Testing in Go“中提到的,您可以使用spf13/afero进行文件抽象,从而简化测试。
该库有一个使用Afero进行测试:
使用模拟文件系统进行测试有很大的好处。
它在每次初始化时都处于完全空白状态,并且无论操作系统如何,都可以轻松再现。
你可以创建文件,你的心的内容和文件访问将是快速的,同时也节省了你从所有恼人的问题,删除临时文件,Windows文件锁定等。
MemMapFs后端非常适合测试。

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

它使用完全原子内存支持的文件系统(MemMapFs)。
它是完全并发的,可以在go例程中安全地工作。

相关问题