Pertanyaan File dalam memori untuk pengujian


Bagaimana cara membuat file dalam-memori untuk pengujian unit di Go?

Dalam Python, saya menguji membaca dari file atau menulis ke file menggunakan io.BytesIO atau io.StringIO. Misalnya, untuk menguji parser file, saya akan melakukannya

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

Demikian pula untuk file output, saya akan memiliki sesuatu seperti berikut:

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

5
2017-10-29 04:35


asal


Jawaban:


Anda bisa menggunakan Penyangga.

Secara umum, itu ide yang baik untuk digunakan io.Reader dan io.Writer antarmuka dalam kode Anda (Buffer mengimplementasikan keduanya) untuk menangani IO. Dengan cara itu Anda dapat menangani berbagai metode input / output (file lokal, buffer memori, koneksi jaringan ...) dengan cara yang sama, tanpa mengetahui apa yang Anda hadapi dalam fungsi spesifik yang Anda gunakan. Itu membuatnya lebih abstrak dan membuat pengujian sepele.


Contoh penggunaan dengan fungsi sepele:

Definisi fungsi:

// 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")
}

Penggunaan fungsi dalam program:

package main

import (
    "mypkg"
    "os"
)

func main() {
    mypkg.MyFunction(os.Stdin, os.Stdout)
}

Uji:

// 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()
    }
}

9
2017-10-29 04:46



Seperti yang disebutkan dalam "Pengujian Pragmatis dan Efektif dalam Go", Kamu dapat memakai spf13/afero untuk file abstraksi yang mengarah ke tes lebih mudah.

Perpustakaan itu memiliki Menggunakan Afero untuk Pengujian:

Ada manfaat besar untuk menggunakan sistem file tiruan untuk pengujian.

Ini memiliki keadaan kosong sepenuhnya setiap kali diinisialisasi dan dapat dengan mudah direproduksi tanpa OS.
  Anda dapat membuat file ke isi hati Anda dan akses file akan cepat sementara juga menyelamatkan Anda dari semua masalah yang mengganggu dengan menghapus file sementara, penguncian file Windows, dll.
  The MemMapFs backend sempurna untuk pengujian.

  • Jauh lebih cepat daripada melakukan operasi I / O pada disk
  • Hindari masalah keamanan dan izin
  • Lebih banyak kontrol. 'rm -rf /'Dengan keyakinan
  • Pengaturan tes jauh lebih mudah dilakukan
  • Tidak perlu uji bersih

Ia menggunakan a sepenuhnya filesystem yang didukung memori atom (MemMapFs).
Ini sepenuhnya bersamaan dan akan bekerja dalam rutinitas yang aman.


3
2017-10-29 05:45