Kami telah membangun sejumlah besar unit test untuk program utama kami selama ini. Beberapa ribu. Masalahnya adalah kita tidak memiliki gagasan yang jelas tentang tes apa yang kita miliki karena ada begitu banyak. Dan itu masalah karena kita tidak tahu di mana kita lemah dalam tes (atau di mana kita memiliki duplikat).
Aplikasi kami adalah mesin pelaporan. Jadi Anda dapat memiliki templat yang digunakan untuk menguji penguraian (apakah kami membaca semua properti tabel), menggabungkan data (apakah kami menyimpan properti tabel yang benar dalam penggabungan), memformat halaman akhir (adalah tabel yang ditempatkan dengan benar pada halaman) ), dan / atau format output (adalah file DOCX yang dibuat benar).
Tambahkan ke ini apa yang perlu kita uji. Ambil bantalan di sekitar sel tabel (kami menggunakan Word, Excel, & PowerPoint untuk desain laporan). Kita harus menguji padding pada page break, untuk tabel di dalam sel, sel yang digabung secara vertikal, sel yang digabungkan secara horizontal, sel yang digabungkan secara vertikal & horizontal yang berisi tabel dengan sel yang digabungkan secara vertikal & horizontal di tabel bagian dalam, di mana tabel itu menerobos satu halaman.
Jadi kategori apa yang masuk dalam tes itu? Padding tabel, page break, sel bersarang, sel yang digabungkan secara vertikal, sel yang digabungkan secara horizontal, atau yang lainnya?
Dan bagaimana kita mendokumentasikan kategori-kategori ini, menamai unit test, dll.?
Pembaruan: Sejumlah orang menyarankan menggunakan alat cakupan untuk memverifikasi bahwa kami memiliki cakupan penuh. Sayangnya itu penggunaan terbatas dalam kasus kami karena bug cenderung disebabkan oleh kombinasi spesifik sehingga kode yang semuanya telah diuji, tetapi tidak dalam kombinasi itu.
Sebagai contoh, kami memiliki pelanggan kemarin yang memulai bookmark Word di akhir loop forEach dalam template mereka (dokumen Word) dan mengakhirinya di awal forEach loop berikutnya. Ini semua menggunakan kode yang memiliki unit test yang menentangnya, tetapi kami belum memikirkan kombinasi templat yang memperluas awal bookmark yang akan dimulai 25 kali, lalu berakhir 10 kali (dua forEach loop memiliki jumlah baris yang berbeda).
sumber
Jawaban:
Secara umum, saya cenderung mirror pohon sumber untuk tes unit saya. Jadi, jika saya memiliki src / lib / fubar, saya akan memiliki tes / lib / fubar yang akan berisi tes unit untuk fubar.
Namun, apa yang Anda uraikan adalah tes yang lebih fungsional. Dalam hal ini, saya akan memiliki tabel multi-dimensi yang menyebutkan semua kondisi Anda yang mungkin. Kemudian, yang tidak memiliki tes tidak masuk akal atau perlu tes baru. Anda bisa, tentu saja, kemudian meletakkannya di set suite tes.
sumber
Struktur yang paling umum tampaknya adalah
src
dantest
cermin direktori.Namun, ada struktur alternatif yang saya lihat yang sekarang saya yakini lebih baik.
Karena unit test cenderung mencerminkan kelas yang mereka uji, menempatkannya di direktori yang sama memberikan akses yang jauh lebih mudah ke file sehingga Anda dapat bekerja di kedua sisi secara berdampingan.
sumber
Dalam .NET, saya cenderung untuk mencerminkan, atau setidaknya perkiraan, struktur namespace untuk kode sumber dalam proyek uji, di bawah "Tests.Unit" atau "Tests.Integration" master namespace. Semua pengujian unit dilakukan dalam satu proyek, dengan struktur dasar kode sumber direplikasi sebagai folder dalam proyek. Sama untuk tes integrasi. Jadi, solusi sederhana untuk proyek mungkin terlihat seperti ini:
Untuk AAT atau AEET yang dikodekan dengan kerangka kerja pengujian unit, ini sedikit berubah; biasanya tes tersebut mencerminkan serangkaian langkah, yang akan menguji fungsionalitas use case atau cerita baru. Saya biasanya menyusun tes-tes ini dalam sebuah
MyProduct.Tests.Acceptance
proyek, dengan tes untuk setiap cerita, mungkin dikelompokkan berdasarkan tonggak sejarah atau kisah "epik" yang menjadi bagian dari cerita yang sedang dikembangkan. Namun, itu benar-benar hanya tes integrasi uber, dan jadi jika Anda lebih suka menyusun tes dalam cara yang lebih berorientasi objek daripada gaya cerita Anda bahkan tidak memerlukanMyProduct.Tests.Acceptance
proyek atau serupa; cukup lemparkan mereka diMyProduct.Tests.Integration
bawah cakupan objek level tertinggi yang diuji.sumber
Tidak ada alasan untuk uji unit hanya dalam satu kategori. Semua perangkat uji unit utama mendukung pembuatan suite uji , yang menggabungkan tes untuk kategori tertentu. Ketika area kode tertentu telah diubah, pengembang harus menjalankan suite itu terlebih dahulu dan sering melihat apa yang rusak. Ketika sebuah tes menyangkut padding dan istirahat dan bersarang, tentu saja memasukkannya ke dalam tiga suite.
Yang mengatakan, titik unit test adalah menjalankannya sepanjang waktu, yaitu mereka harus kecil dan cukup cepat sehingga layak untuk menjalankannya semuanya sebelum melakukan kode apa pun. Dengan kata lain, tidak masalah apa pun kategori tes, itu harus dijalankan sebelum melakukan apa pun. Suites benar-benar hanya sebuah penopang yang Anda gunakan jika karena alasan tertentu Anda tidak dapat menulis tes secepat yang seharusnya.
Adapun cakupan, ada alat cakupan yang sangat baik yang memberi tahu Anda berapa persen garis sebenarnya dilakukan dengan menjalankan tes Anda - ini adalah petunjuk yang jelas untuk tes apa yang masih Anda lewatkan.
Sedangkan untuk penamaan, tidak ada nilai khusus dalam upaya pengeluaran pada nama - nama unit test. Semua yang ingin Anda dengar dari tes Anda adalah "5235 dari 5235 tes lulus". Ketika sebuah tes gagal, apa yang Anda baca bukan namanya, tetapi pesannya , misalnya String di dalam
assert()
yang mengimplementasikan kriteria kesuksesan Anda. Pesan tersebut harus cukup informatif sehingga Anda memiliki gagasan tentang apa yang salah tanpa membaca isi ujian. Nama itu tidak penting dibandingkan dengan itu.sumber
Salah satu cara untuk mengetahui apakah Anda lemah dalam tes adalah keterlacakan. Biasanya untuk tes, ini berbentuk liputan.
Tujuannya adalah untuk mengukur bagian kode mana yang digunakan oleh tes Anda, sehingga Anda dapat melihat kode yang tidak tercakup oleh tes Anda. Terserah Anda (dan alat cakupan) untuk menentukan apa "bagian dari kode" itu. Paling tidak adalah jangkauan cabang.
sumber