[英]In-memory file for testing
如何在Go中創建用於單元測試的內存文件?
在Python中,我測試使用io.BytesIO
或io.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.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()
}
}
如“ 在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.