簡體   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