unit test untuk parser csv

14

Tes apa yang harus saya gunakan untuk menguji parser csv?

Saya memiliki parser csv sederhana di C #, dan saya ingin memastikan bahwa saya memiliki cakupan tes unit yang baik dari semua kasus tepi umum (dan tidak umum). Tes apa yang harus saya gunakan untuk mengidentifikasi masalah potensial dan kasus batas?

Joel Coehoorn
sumber
5
Sudahkah Anda memeriksa generata.com untuk membuat berbagai file uji?
Aaron McIver
@ Harun - tes yang baik dapat diulang, dan karena itu tidak menggunakan data yang bervariasi. Tapi saya mungkin bisa menggunakannya untuk satu generasi yang kemudian saya simpan untuk test suite. Tetapi meskipun demikian, saya ingin memastikan saya telah membahas semua kasus tepi yang berbeda, yang tidak dijamin secara acak.
Joel Coehoorn
Coehorn Hasil tes yang baik dapat diulang. Saya berpendapat bahwa menggunakan data yang bervariasi baik-baik saja selama hasil yang diinginkan tetap konstan. Jika Anda ingin memastikan bahwa Anda telah membahas semua kasus tepi yang berbeda (berdasarkan komentar Anda, Anda tampak yakin apa itu) mengapa tidak mulai menulis tes? Anda akan menghabiskan lebih banyak waktu mencari solusi ajaib kemudian hanya menulis tes.
Aaron McIver
Penulis mencari kasus uji, bukan data uji. Saya berharap saya tahu di mana menemukan tes publik untuk berbagai hal juga.
ProdigySim

Jawaban:

16

Berikut adalah beberapa kasus batas yang harus Anda pikirkan dan uji kasusnya.

  1. Bidang dasar. ,foo,
  2. Bidang kutipan dasar. ,"foo",
  3. Bidang dikutip dengan baris baru tertanam. ,"foo\nbar"
  4. Bidang dikutip dengan koma tertanam. ,"foo,bar"
  5. Bidang dikutip dengan kutipan yang disematkan. ,"foo""bar"
  6. Apakah Anda membedakan antara string kosong dan null? Jika Anda melakukannya maka ,,harus menjadi nol dan ,"",harus memberikan string kosong.
  7. Apakah Anda mencoba mendeteksi tipe data dan melakukan hal yang benar? CSV sering digunakan untuk data numerik. Tambahkan tes apa pun yang menurut Anda sesuai untuk itu.
  8. Jika Anda menulis data, Anda harus mencakup semua kasus di atas.
  9. Apa yang Anda lakukan dengan garis dengan jumlah bidang yang berbeda? (Menguji.)
  10. Apa yang Anda lakukan dengan mengikuti garis kosong? (Menguji.)
  11. Bagaimana kinerja pada file besar? (Uji itu. Saya telah melihat terlalu banyak parser CSV buatan sendiri yang menggunakan string secara tidak efisien dan sebagai hasilnya membutuhkan waktu kuadrat, yang menyebabkan hal-hal sederhana menjadi sangat lambat.)
btilly
sumber
10

Tidak ada spesifikasi formal untuk file CSV. Namun, lihat RFC 4180 - Format Umum dan tipe MIME untuk file CSV , (khususnya Bagian 2) yang mendokumentasikan format yang tampaknya diikuti oleh sebagian besar implementasi.

Tampaknya cukup mudah untuk mulai membuat beberapa kasus uji dari daftar di bagian 2, khususnya:

  1. Setiap catatan terletak pada jalur yang terpisah, dibatasi oleh pemutusan jalur (CRLF). Sebagai contoh:

    aaa, bbb, ccc CRLF zzz, yyy, xxx CRLF

  2. Catatan terakhir dalam file mungkin atau mungkin tidak memiliki jeda baris akhir. Sebagai contoh:

    aaa, bbb, ccc CRLF zzz, yyy, xxx

  3. Mungkin ada baris header opsional yang muncul sebagai baris pertama file dengan format yang sama dengan baris rekaman normal. Header ini akan berisi nama-nama yang sesuai dengan bidang dalam file dan harus berisi jumlah bidang yang sama dengan catatan dalam sisa file (ada atau tidaknya baris header harus ditunjukkan melalui parameter "header" opsional dari ini. Tipe MIME). Sebagai contoh:

    field_name, field_name, field_name CRLF aaa, bbb, ccc CRLF zzz, yyy, xxx CRLF

  4. Di dalam tajuk dan setiap catatan, mungkin ada satu atau beberapa bidang, dipisahkan dengan koma. Setiap baris harus berisi jumlah bidang yang sama di seluruh file. Spasi dianggap sebagai bagian dari bidang dan tidak boleh diabaikan. Bidang terakhir dalam catatan tidak harus diikuti oleh koma. Sebagai contoh:

    aaa, bbb, ccc

  5. Setiap bidang mungkin atau mungkin tidak dilampirkan dalam tanda kutip ganda (namun beberapa program, seperti Microsoft Excel, tidak menggunakan tanda kutip ganda sama sekali). Jika bidang tidak disertai dengan tanda kutip ganda, maka tanda kutip ganda mungkin tidak muncul di dalam bidang. Sebagai contoh:

    "aaa", "bbb", "ccc" CRLF zzz, yyy, xxx

  6. Bidang yang berisi penghentian baris (CRLF), tanda kutip ganda, dan koma harus dilampirkan dalam tanda kutip ganda. Sebagai contoh:

    "aaa", "b CRLF bb", "ccc" CRLF zzz, yyy, xxx

  7. Jika tanda kutip ganda digunakan untuk menyertakan bidang, maka tanda kutip ganda yang muncul di dalam bidang harus diloloskan dengan mendahului dengan tanda kutip ganda lainnya. Sebagai contoh:

    "aaa", "b" "bb", "ccc"

Paddyslacker
sumber
8

Data sensus AS tersedia di CSV

Saya sudah mengerjakannya untuk sementara waktu. Ini tentu cukup aneh untuk menjadi ujian yang bagus, dan ada berton-ton.

Satanicpuppy
sumber
maukah Anda menjelaskan lebih lanjut tentang apa yang dilakukannya dan mengapa Anda merekomendasikannya untuk menjawab pertanyaan yang diajukan? "Jawaban khusus tautan" tidak diterima di Stack Exchange
agas
4

Periksa direktori ini dan lihat kode di file * .t .:

http://cpansearch.perl.org/src/MAKAMAKA/Text-CSV-1.32/t/

(Nomor versi -1.32 mungkin akan berubah pada akhirnya sehingga tautannya menjadi "mati". Tambahkan nomor versi sendiri dengan coba-coba, atau buka direktori induk atau klik di sini

https://metacpan.org/pod/Text::CSV

dan klik "Browse" ke kode sumber dari versi terbaru)

Text :: CSV_XS adalah modul perl matang untuk mem-parsing file csv. File * .t ditulis dalam Perl 5, mengandung banyak testcases untuk menguji sendiri modul, mereka harus dilakukan pada waktu pemasangan modul.

knb
sumber