Latar Belakang: Saya berpikir untuk mencoba memperkenalkan konsep unit test kepada rekan kerja saya dengan membuat beberapa untuk modul yang telah saya kerjakan; persyaratannya baru-baru ini berubah dan memerlukan beberapa abstraksi / interaksi lagi sehingga sepertinya cara yang baik untuk mengembangkan serangkaian tes yang akan "membuktikan" kerjanya tanpa harus menyodok aplikasi secara manual.
Masalahnya, bagaimanapun, adalah bahwa modul bergantung pada faktor-faktor eksternal yang tidak dapat digerakkan yaitu PDF dan XSL. Pada dasarnya saya membaca XML dari basis data dan menerapkan transformasi XSL ke dalamnya, lalu mengonversinya ke PDF menggunakan pustaka yang disebut ABCPDF. PDF ini kemudian digabungkan dengan PDF lain berdasarkan templat statis. Saya tahu bahwa saya dapat menguji XML dan memastikan nilainya benar, tetapi banyak potensi bug dan masalah terkait dengan tampilan aktual dari dokumen yang sudah selesai - misalnya hal-hal kecil seperti berapa lama string teks dibungkus, di mana area HTML tertentu berada terletak dalam kaitannya dengan dokumen, dll. Apakah mungkin untuk menguji hal-hal ini (saya menyadari ini mungkin tes integrasi atau .. jenis tes ketiga yang namanya saya lupakan [bukan tes Penerimaan, jenis lain], dan bukan unit tes) karena saya tidak bisa, setahu saya, membuat-buat PDF dengan mudah pendek membuatnya kemudian membacanya kembali atau membuat string HTML (yaitu transformasi XML) dan menguraikannya dengan tangan untuk memeriksa keberadaan sel-sel tabel tertentu di hubungan dengan sel tabel lainnya.
Dalam situasi seperti ini, haruskah saya hanya fokus pada unit test untuk memastikan informasi itu benar dan bahwa saya dapat membuat PDF, atau menggabungkannya, atau apa pun dan menggunakan pengujian manual untuk masalah tampilan yang sebenarnya?
sumber
Jawaban:
Uji fitur, bukan unit
Menggunakan input xml yang dikenal, output PDF dan secara manual (dan cermat) memverifikasi bahwa itu benar. Kemudian simpan sebagai referensi.
Tes di masa depan menggunakan input xml yang sama dapat melakukan perbandingan file biner dengan referensi.
Jika perbandingan tingkat file tidak memuaskan, tampilkan PDF di akhir tes dan ambil tangkapan layar, kemudian lakukan pengujian otomatis dibandingkan dengan tangkapan layar referensi.
sumber
Biasanya dalam kasus seperti ini Anda abstrak semua yang Anda tidak dapat menguji di balik implementasi yang dapat Anda gunakan dengan antarmuka. Saya hanya akan melakukan sesuatu yang konyol seperti pembangun PDF karena tampaknya masuk akal.
Anda kemudian dapat mengejek IPdfBuilder dalam tes Anda untuk melakukan apa pun yang Anda inginkan. Ini seringkali berarti Anda harus mulai menggunakan wadah IoC ( /programming/871405/why-do-i-need-an-ioc-container-as-opposed-to-stalletforward-di-code dan /programming/21288/which-net-dependency-injection-frameworks-are-worth-looking-into sebagai tempat untuk memulai) jika Anda tidak menggunakannya sekarang.
Dan tes yang bukan tes unit sering disebut tes integrasi. Tes integrasi yang rumit sering kali tidak sepenuhnya sepadan, sehingga Anda hanya mengabstraksi bagian itu dan mengurangi jumlah logika bisnis dalam abstraksi itu sehingga Anda bisa mengujinya dalam unit test.
Beri tahu saya jika ini tidak sepenuhnya jelas.
sumber
Saya membangun sesuatu yang sangat mirip beberapa waktu lalu, dan hanya menggunakan tes visual dasar. Pengujian tidak harus otomatis, jadi tidak ada yang salah dengan hanya mencari hasil yang diharapkan (jelas, dalam berbagai situasi yang telah ditentukan sebelumnya). Seringkali, sebuah gambar bernilai ribuan tes di mana visual yang bersangkutan . Saya menggunakan pengujian unit otomatis secara luas, tapi saya pikir beberapa orang bisa sedikit terbawa ketika masuk ke pengujian GUI, atau apa pun visual IMHO. Dengan produk tertentu, saya mengakui bahwa pendekatan "cukup baik" ini tidak akan cukup jadi YMMV.
Namun, saya akan sedikit khawatir tentang eksternalitas yang tidak dapat digerakkan. Ini bisa menjadi tanda kopling ketat, yang bagus untuk dihindari sebagai aturan umum, tapi saya tidak akan berspekulasi terlalu banyak pada kode Anda dalam hal itu tanpa rincian lebih lanjut.
sumber