Izinkan saya mulai dengan memasukkan sumber - Pengujian Unit Pragmatis di Java dengan JUnit (Ada versi dengan C # -Nunit juga .. tapi saya punya yang ini .. sebagian besar agnostik. Direkomendasikan.)
Tes yang Baik haruslah PERJALANAN (Akronimnya tidak cukup lengket - Saya memiliki cetakan lembar contekan di buku yang harus saya tarik untuk memastikan saya melakukannya dengan benar ..)
- Otomatis : Menjalankan tes serta memeriksa hasil untuk LULUS / GAGAL harus otomatis
- Menyeluruh : Cakupan; Meskipun bug cenderung berkerumun di sekitar wilayah tertentu dalam kode, pastikan Anda menguji semua jalur dan skenario utama .. Gunakan alat jika Anda harus mengetahui wilayah yang belum diuji
- Dapat diulang : Tes harus menghasilkan hasil yang sama setiap saat .. setiap saat. Tes tidak harus bergantung pada parameter yang tidak terkendali.
- Independen : Sangat penting.
- Tes harus menguji hanya satu hal pada satu waktu. Beberapa pernyataan diperbolehkan selama semuanya menguji satu fitur / perilaku. Saat tes gagal, itu harus menunjukkan lokasi masalah.
- Tes tidak harus bergantung satu sama lain - Terisolasi. Tidak ada asumsi tentang urutan eksekusi pengujian. Pastikan 'bersihkan batu tulis' sebelum setiap pengujian dengan menggunakan pengaturan / pembongkaran dengan tepat
Profesional : Dalam jangka panjang, Anda akan memiliki kode pengujian sebanyak produksi (jika tidak lebih), oleh karena itu ikuti standar desain yang baik yang sama untuk kode pengujian Anda. Kelas metode yang difaktorkan dengan baik dengan nama yang mengungkapkan niat, Tanpa duplikasi, pengujian dengan nama baik, dll.
Tes yang bagus juga berjalan dengan Cepat . tes apa pun yang membutuhkan waktu lebih dari setengah detik untuk dijalankan .. perlu dikerjakan. Semakin lama rangkaian pengujian yang diperlukan untuk menjalankan .. semakin jarang pengujian akan dijalankan. Semakin banyak perubahan, dev akan mencoba menyelinap di antara lari .. jika ada yang rusak .. akan membutuhkan waktu lebih lama untuk mencari tahu perubahan mana yang menjadi penyebabnya.
Perbarui 2010-08:
- Dapat dibaca : Ini dapat dianggap sebagai bagian dari Profesional - namun tidak bisa cukup menekankan. Tes asam akan menemukan seseorang yang bukan bagian dari tim Anda dan memintanya untuk mengetahui perilaku yang diuji dalam beberapa menit. Pengujian perlu dipertahankan seperti halnya kode produksi - jadi buatlah agar mudah dibaca meskipun membutuhkan lebih banyak usaha. Pengujian harus simetris (mengikuti pola) dan ringkas (menguji satu perilaku pada satu waktu). Gunakan konvensi penamaan yang konsisten (misalnya gaya TestDox). Hindari mengacaukan ujian dengan "detail insidental" .. jadilah minimalis.
Selain itu, sebagian besar lainnya adalah pedoman yang mengurangi pekerjaan dengan manfaat rendah: misalnya 'Jangan menguji kode yang tidak Anda miliki' (misalnya DLL pihak ketiga). Jangan mencoba menguji pengambil dan penyetel. Perhatikan rasio biaya-ke-manfaat atau probabilitas kerusakan.
sumber
Sebagian besar jawaban di sini tampaknya membahas praktik terbaik pengujian unit secara umum (kapan, di mana, mengapa, dan apa), daripada benar-benar menulis pengujian itu sendiri (bagaimana). Karena pertanyaannya tampak cukup spesifik pada bagian "bagaimana", saya pikir saya akan memposting ini, diambil dari presentasi "tas coklat" yang saya lakukan di perusahaan saya.
5 Hukum Tes Menulis Womp:
1. Gunakan nama metode pengujian yang panjang dan deskriptif.
2. Tulis tes Anda dalam gaya Atur / Bertindak / Tegaskan .
3. Selalu berikan pesan kegagalan dengan Asserts Anda.
4. Komentari alasan pengujian - apa asumsi bisnisnya?
5. Setiap pengujian harus selalu mengembalikan status sumber daya yang disentuhnya
sumber
Ingatlah tujuan ini (diadaptasi dari buku xUnit Test Patterns oleh Meszaros)
Beberapa hal untuk mempermudah ini:
Jangan lupa bahwa Anda juga dapat melakukan pengujian intergrasi dengan framework xUnit tetapi tetap pisahkan pengujian intergrasi dan pengujian unit
sumber
Tes harus diisolasi. Satu tes tidak harus bergantung pada yang lain. Lebih jauh lagi, pengujian seharusnya tidak bergantung pada sistem eksternal. Dengan kata lain, uji kode Anda , bukan kode yang bergantung pada kode. Anda dapat menguji interaksi tersebut sebagai bagian dari pengujian integrasi atau fungsional Anda.
sumber
Beberapa sifat pengujian unit yang bagus:
Ketika sebuah tes gagal, harus segera terlihat jelas di mana letak masalahnya. Jika Anda harus menggunakan debugger untuk melacak masalah, pengujian Anda tidak cukup terperinci. Memiliki tepat satu pernyataan per pengujian membantu di sini.
Saat Anda melakukan refaktorisasi, tidak ada pengujian yang gagal.
Tes harus berjalan sangat cepat sehingga Anda tidak pernah ragu untuk menjalankannya.
Semua tes harus selalu lulus; tidak ada hasil non-deterministik.
Pengujian unit harus difaktorkan dengan baik, seperti kode produksi Anda.
@Alotor: Jika Anda menyarankan bahwa perpustakaan seharusnya hanya memiliki pengujian unit di API eksternalnya, saya tidak setuju. Saya ingin pengujian unit untuk setiap kelas, termasuk kelas yang tidak saya perlihatkan kepada penelepon eksternal. (Namun, jika saya merasa perlu menulis tes untuk metode privat, maka saya perlu melakukan refactor. )
EDIT: Ada komentar tentang duplikasi yang disebabkan oleh "satu pernyataan per pengujian". Secara khusus, jika Anda memiliki beberapa kode untuk menyiapkan skenario, dan kemudian ingin membuat beberapa pernyataan tentang hal itu, tetapi hanya memiliki satu pernyataan per pengujian, Anda dapat menduplikasi penyiapan di beberapa pengujian.
Saya tidak mengambil pendekatan itu. Sebagai gantinya, saya menggunakan perlengkapan uji per skenario . Berikut contoh kasarnya:
sumber
Apa yang Anda kejar adalah penggambaran perilaku kelas yang diuji.
Maksud dasarnya adalah meningkatkan kepercayaan diri Anda terhadap perilaku kelas.
Ini sangat berguna saat melihat pemfaktoran ulang kode Anda. Martin Fowler memiliki artikel menarik tentang pengujian di situs webnya.
HTH.
Bersulang,
rampok
sumber
Tes seharusnya gagal. Kemudian Anda harus menulis kode yang membuatnya lulus, jika tidak, Anda berisiko menulis pengujian yang disadap dan selalu lolos.
sumber
Saya suka akronim Right BICEP dari buku Pragmatic Unit Testing yang disebutkan di atas :
Secara pribadi saya merasa Anda bisa melangkah cukup jauh dengan memeriksa bahwa Anda mendapatkan hasil yang benar (1 + 1 harus mengembalikan 2 dalam fungsi penjumlahan), mencoba semua kondisi batas yang dapat Anda pikirkan (seperti menggunakan dua angka yang jumlahnya lebih besar dari nilai maks bilangan bulat dalam fungsi tambah) dan memaksa kondisi kesalahan seperti kegagalan jaringan.
sumber
Tes yang baik perlu dipertahankan.
Saya belum tahu bagaimana melakukan ini untuk lingkungan yang kompleks.
Semua buku teks mulai terlepas saat basis kode Anda mulai menjangkau ratusan 1000 atau jutaan baris kode.
Arsitektur yang baik dapat mengontrol beberapa ledakan interaksi, tetapi tak terelakkan ketika sistem menjadi lebih kompleks, sistem pengujian otomatis tumbuh bersamanya.
Di sinilah Anda mulai harus berurusan dengan trade-off:
Anda juga perlu memutuskan:
di mana Anda menyimpan kasus uji di basis kode Anda?
Saya bisa bertahan selamanya, tetapi maksud saya adalah:
Tes harus dapat dipertahankan.
sumber
Saya membahas prinsip-prinsip ini beberapa waktu lalu di artikel Majalah MSDN ini yang menurut saya penting untuk dibaca oleh setiap pengembang.
Cara saya mendefinisikan pengujian unit yang "baik", adalah jika pengujian tersebut memiliki tiga properti berikut:
sumber
sumber
Jay Fields memiliki banyak nasihat bagus tentang menulis tes unit dan ada posting di mana dia merangkum nasihat paling penting . Di sana Anda akan membaca bahwa Anda harus memikirkan secara kritis konteks Anda dan menilai apakah nasihat itu berharga bagi Anda. Anda mendapatkan banyak jawaban luar biasa di sini, tetapi terserah Anda untuk memutuskan mana yang terbaik untuk konteks Anda. Cobalah dan lakukan refactoring jika baunya tidak enak bagi Anda.
Salam
sumber
Jangan pernah berasumsi bahwa metode 2 baris yang sepele akan berhasil. Menulis tes unit cepat adalah satu-satunya cara untuk mencegah tes nol yang hilang, tanda minus yang salah tempat dan / atau kesalahan pelingkupan halus dari menggigit Anda, pasti ketika Anda memiliki lebih sedikit waktu untuk menghadapinya daripada sekarang.
sumber
Saya mendukung jawaban "A TRIP", kecuali bahwa tes HARUS bergantung satu sama lain !!!
Mengapa?
KERING - Jangan Ulangi Dirimu - berlaku juga untuk pengujian! Uji ketergantungan dapat membantu untuk 1) menghemat waktu penyiapan, 2) menghemat sumber daya perlengkapan, dan 3) menunjukkan kegagalan. Tentu saja, hanya karena kerangka pengujian Anda mendukung dependensi kelas satu. Kalau tidak, saya akui, mereka buruk.
Tindak lanjuti http://www.iam.unibe.ch/~scg/Research/JExample/
sumber
Seringkali pengujian unit didasarkan pada objek tiruan atau data tiruan. Saya suka menulis tiga jenis tes unit:
Intinya adalah untuk menghindari memutar ulang semuanya agar dapat menguji setiap fungsi.
sumber
Pikirkan tentang 2 jenis pengujian dan perlakukan mereka secara berbeda - pengujian fungsional dan pengujian kinerja.
Gunakan masukan dan metrik yang berbeda untuk masing-masing. Anda mungkin perlu menggunakan perangkat lunak yang berbeda untuk setiap jenis tes.
sumber
Saya menggunakan konvensi penamaan pengujian yang konsisten yang dijelaskan oleh standar Penamaan Uji Unit Roy Osherove Setiap metode dalam kelas kasus uji yang diberikan memiliki gaya penamaan berikut MethodUnderTest_Scenario_ExpectedResult.
Bagian nama pengujian pertama adalah nama metode dalam sistem yang diuji.
Berikutnya adalah skenario spesifik yang sedang diuji.
Terakhir adalah hasil dari skenario itu.
Setiap bagian menggunakan Casing Unta Atas dan dibatasi oleh skor di bawah.
Saya menemukan ini berguna ketika saya menjalankan tes tes dikelompokkan berdasarkan nama metode yang diuji. Dan memiliki konvensi memungkinkan pengembang lain untuk memahami maksud pengujian.
Saya juga menambahkan parameter ke nama Metode jika metode yang diuji telah kelebihan beban.
sumber