Bagaimana cara menguji pembaca file?

19

Saya sedang mengerjakan proyek dengan beberapa format file. Beberapa format ditentukan oleh .xsds, lainnya oleh dokumentasi di situs web masing-masing, dan beberapa format khusus yang tidak memiliki dokumentasi. Mwahahahaha.

Apa masalahnya?

Saya ingin menguji pembaca file saya, tetapi saya tidak sepenuhnya yakin bagaimana cara melakukan ini. Alur aplikasi adalah sebagai berikut:

file.___  ===> read by FileReader.java ===> which creates a Model object

di mana FileReaderantarmuka

public interface FileReader {
    public Model read(String filename);
}

The Modelmemiliki sejumlah atribut yang dihuni ketika file tersebut dibaca. Itu terlihat seperti

public class Model {
    List<String> as;
    List<String> bs;
    boolean isAPain = true;
    // ...
}

Apa yang sudah saya coba?

Satu-satunya ide saya adalah membuat file "generator" untuk setiap format file. Generator ini pada dasarnya adalah pembangun yang menerima beberapa variabel (mis. Jumlah komentar untuk dihasilkan dalam file), dan mengeluarkan file sampel yang kemudian saya baca dan bandingkan hasilnya Modeldengan variabel yang saya gunakan untuk menghasilkan file.

Ini memiliki beberapa masalah, meskipun:

  • File yang dihasilkannya tidak terlihat seperti file nyata. Generator sama sekali tidak menyadari konteksnya.
  • Sulit untuk mengenali apakah generator telah menghasilkan kasus tepi karena akulah yang secara manual mengatur variabel. Metode ini hampir tidak lebih baik daripada saya membuat selusin file sampel.

Apakah ada cara yang lebih baik untuk melakukan ini?

EDIT: Mengubah unit menjadi integrasi karena itulah yang saya maksud sebenarnya.

EDIT2: Berikut adalah contoh dari kasus tepi yang saya sebutkan.

Setiap file mewakili grafik yang terdiri dari simpul dan tepi. Vertikal dan tepi ini dapat dilampirkan dengan berbagai cara, jadi:

v1 -- e1 --> v2 <-- e2 -- v3

berbeda dengan

v1 -- e1 --> v2 -- e2 --> v3

dalam hal arah tepi penting. Saya tidak yakin apakah ini dalam lingkup pertanyaan, tetapi sulit untuk memikirkan semua kasus tepi terkait ketika saya secara manual mengatur jumlah simpul, jumlah tepi, dan hanya menghasilkan koneksi secara acak.

sdasdadas
sumber
1
Pengujian berbasis data muncul di pikiran. Bisakah Anda memberikan contoh konkret kasus tepi (berdasarkan kasus tepi yang mungkin dipicu dalam FileReaderimplementasi aktual )? Contoh: mengingat kasus tepi yang ditemukan dalam format file gambar , untuk setiap entri tabel, jika kombinasi baris / kolom dari properti didukung, harus ada setidaknya satu kasus uji (file data) yang mencakup kombinasi itu.
rwong
@rwong saya menambahkan contoh tapi saya tidak yakin apakah itu memberi Anda ide. Saya kira masalah saya adalah umum dengan kasus tepi, yaitu. Apakah saya ketinggalan? Meskipun, pengujian berbasis data terlihat menarik. Terima kasih!
sdasdadas
7
Juga, saya hanya memperhatikan ini, tetapi kasus tepi saya benar-benar kasus tepi .
sdasdadas
1
Mengapa tidak membuat file tes kerajinan tangan, dan kemudian selalu menjalankannya dengan yang sama?
Bobson
@ Bobson Itu sedikit lebih buruk daripada menggunakan generator. Dalam hal ini saya mungkin kehilangan kasus tepi (karena saya mungkin hilang sekarang), tetapi saya juga mungkin memperkenalkan kesalahan dalam pengetikan saya. Dan dengan file besar, membuat mereka sendiri akan memakan waktu cukup lama.
sdasdadas

Jawaban:

19

Pertama, mari kita bicara tentang apa tujuan Anda:

  • Anda jelas tidak ingin menguji "format file" - Anda ingin menguji FileReaderimplementasi yang berbeda

  • Anda ingin menemukan berbagai jenis kesalahan sebanyak mungkin dengan tes otomatis

Untuk mencapai tujuan itu secara penuh, IMHO Anda harus menggabungkan berbagai strategi:

  • pertama, pengujian unit nyata: FileReaderimplementasi Anda akan terdiri dari banyak bagian dan fungsi yang berbeda. Tulis tes kecil yang menguji masing-masing secara terpisah; mendesain fungsi Anda dengan cara yang tidak benar-benar perlu untuk membaca data dari file. Tes semacam ini akan membantu Anda menguji sebagian besar kasus tepi Anda.
  • kedua, file yang dihasilkan: itulah yang saya sebut tes integrasi. File tersebut akan membantu Anda melacak kegagalan yang berbeda dari poin 1, misalnya, kombinasi parameter tertentu, kesalahan dalam akses file, dll. Untuk membuat kasus uji yang baik, juga akan membantu untuk mempelajari beberapa teknik klasik seperti mengelompokkan kasus uji ke dalam kelas kesetaraan atau pengujian nilai batas. Dapatkan salinan buku ini dari Glenford Myers untuk mempelajari lebih lanjut tentang itu. The Wikipedia artikel tentang pengujian perangkat lunak adalah sumber yang baik, juga.
  • ketiga, cobalah untuk mendapatkan data dunia nyata: mungkin sulit untuk memverifikasi bahwa file-file ini dievaluasi dengan benar oleh Anda FileReader, tetapi mungkin layak untuk melakukan ini karena sering menemukan bug yang tidak diungkapkan oleh dua strategi pertama. Beberapa orang akan menyebut hal-hal semacam ini juga "tes integrasi", yang lain lebih suka "tes penerimaan", tetapi pada kenyataannya istilah itu tidak terlalu penting.

IMHO tidak ada pendekatan "jalan pintas" yang akan memberi Anda manfaat dari ketiga strategi "untuk harga satu". Jika Anda ingin mendeteksi kasus tepi serta kegagalan dalam kasus standar serta kasus dunia nyata, Anda harus berinvestasi setidaknya beberapa - lebih mungkin banyak - usaha. Untungnya, semua pendekatan itu dapat digunakan untuk membuat pengujian otomatis yang dapat diulang.

Selain itu, Anda harus memastikan bahwa Anda FileReadertidak menutupi kesalahan saat membaca data itu - buat pemeriksaan / pernyataan bawaan, berikan pengecualian ketika ada yang tidak beres secara internal dll. Ini memberikan kode pengujian peluang yang jauh lebih baik untuk mendeteksi kesalahan , bahkan ketika Anda tidak memiliki file tes eksplisit atau test case untuk situasi yang tidak terduga.

Doc Brown
sumber
Jawaban yang luar biasa, dan saya akan mengedit judul pertanyaan saya agar lebih baik. Terima kasih!
sdasdadas