2016-10-29 2 views
4

Как создать файлы в памяти для модульного тестирования в 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 

ответ

9

Вы можете использовать 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() 
    } 
} 
+0

Спасибо за предоставление примеров кода! – gotgenes

2

Как указано в «Pragmatic and Effective Testing in Go», вы можете использовать spf13/afero для абстракции файла, что приводит к более простым испытаниям.

Эта библиотека имеет Using Afero for Testing:

Существует большое преимущество использования макет файловой системы для тестирования.

Он имеет абсолютно пустое состояние при каждом его инициализации и может быть легко воспроизведен независимо от ОС.
Вы можете создавать файлы в своем сердце, и доступ к файлам будет быстрым, а также избавит вас от всех неприятных проблем с удалением временных файлов, блокировкой файлов Windows и т. Д.
Бэкэнд MemMapFs идеально подходит для тестирования.

  • Гораздо быстрее, чем выполнение операций ввода/вывода на диске
  • вопросы безопасности Избегайте и разрешения
  • гораздо больше контроля. «rm -rf /» с уверенностью
  • Испытательная установка гораздо проще сделать
  • Никакое испытание очистки не требуется

Он использует fully atomic memory backed filesystem (MemMapFs).
Он полностью параллелен и будет работать в безопасном режиме.

+0

Afero высмеивает всю файловую систему. Это действительно тяжело по сравнению с моими потребностями, когда мне нужно только фальсифицировать ввод-вывод файлов. Я вижу, как Аферо имеет ценность для чего-то вроде Хьюго. – gotgenes

Смежные вопросы