anti-pola : harus ada setidaknya dua elemen kunci yang hadir untuk secara formal membedakan anti-pola yang sebenarnya dari kebiasaan buruk yang sederhana, praktik buruk, atau ide buruk:
- Beberapa pola tindakan, proses atau struktur yang berulang-ulang yang awalnya tampak bermanfaat, tetapi pada akhirnya menghasilkan konsekuensi yang lebih buruk daripada hasil yang bermanfaat, dan
- Solusi refactored yang didokumentasikan dengan jelas, terbukti dalam praktik nyata dan dapat diulang.
Pilih anti-pola TDD yang terlalu banyak Anda lihat "di alam liar".
Posting blog oleh James Carr dan diskusi terkait pada testdrivendevelopment yahoogroup
Jika Anda menemukan yang 'tidak bernama' satu .. poskan juga. Satu pos per anti-pola tolong untuk membuat suara dihitung untuk sesuatu.
Minat saya adalah menemukan subset top-n sehingga saya bisa mendiskusikan mereka di kotak makan siang bertemu dalam waktu dekat.
unit-testing
tdd
anti-patterns
Gishu
sumber
sumber
Jawaban:
Warga Kelas Kedua - kode tes tidak terlalu baik di refactored sebagai kode produksi, yang mengandung banyak kode duplikat, membuatnya sulit untuk mempertahankan tes.
sumber
Free Ride / Piggyback - James Carr, Tim Ottinger
Daripada menulis metode uji kasus baru untuk menguji fitur / fungsionalitas lain yang berbeda , pernyataan baru (dan tindakan terkaitnya yaitu langkah-langkah Bertindak dari AAA) ikut serta dalam sebuah uji kasus yang ada .
sumber
true
setelah setiap panggilan mutator yang mungkin. Jadi, Anda akan ingin memeriksa bahwa setiap invarian adalahtrue
setelah setiap kombinasi dari mutator dan input data yang Anda uji. Tetapi Anda ingin mengurangi duplikasi, dan memastikan Anda memeriksa semua invarian, termasuk invarian yang saat ini tidak menyebabkan kegagalan pengujian. Jadi, Anda menempatkan semuanya dalamcheckInvariants()
fungsi verifikasi dan menggunakannya dalam setiap tes. Kode berubah dan invarian lain ditambahkan. Anda memasukkannya ke dalam fungsi juga, tentu saja. Tetapi ini adalah freerider.Selamat Jalan
Tes tetap berada di jalur senang (yaitu hasil yang diharapkan) tanpa menguji batas dan pengecualian.
JUnit Antipatterns
sumber
Pahlawan Lokal
Kasing uji yang bergantung pada sesuatu yang spesifik untuk lingkungan pengembangan yang ditulisnya agar dapat dijalankan. Hasilnya adalah tes lulus pada kotak pengembangan, tetapi gagal ketika seseorang mencoba menjalankannya di tempat lain.
Ketergantungan Tersembunyi
Terkait erat dengan pahlawan lokal, tes unit yang membutuhkan beberapa data yang ada telah diisi di suatu tempat sebelum tes berjalan. Jika data itu tidak diisi, tes akan gagal dan meninggalkan sedikit indikasi kepada pengembang apa yang diinginkannya, atau mengapa ... memaksa mereka untuk menggali melalui kode hektar untuk mencari tahu dari mana data yang digunakan seharusnya berasal.
Sayangnya melihat ini terlalu sering dengan file .dll kuno yang bergantung pada file .ini yang samar dan bervariasi yang terus-menerus tidak sinkron pada sistem produksi yang diberikan, apalagi masih ada di mesin Anda tanpa konsultasi ekstensif dengan tiga pengembang yang bertanggung jawab untuk dll. Mendesah.
sumber
Gang Rantai
Beberapa tes yang harus dijalankan dalam urutan tertentu, yaitu satu tes mengubah keadaan global sistem (variabel global, data dalam database) dan tes berikutnya tergantung padanya.
Anda sering melihat ini dalam tes basis data. Alih-alih melakukan rollback
teardown()
, tes melakukan perubahan mereka ke database. Penyebab umum lainnya adalah bahwa perubahan pada negara global tidak dibungkus blok try / akhirnya yang bersih jika tes gagal.sumber
The Mockery
Terkadang mengejek bisa baik, dan berguna. Tetapi terkadang pengembang dapat kehilangan diri mereka sendiri dan dalam upaya mereka untuk mengejek apa yang tidak diuji. Dalam hal ini, tes unit berisi begitu banyak ejekan, stub, dan / atau palsu sehingga sistem yang sedang diuji bahkan tidak diuji sama sekali, sebaliknya data yang dikembalikan dari ejekan adalah apa yang sedang diuji.
Sumber: Pos James Carr.
sumber
The Silent Catcher - Kelly?
Tes yang lolos jika pengecualian dilempar .. bahkan jika pengecualian yang sebenarnya terjadi adalah yang berbeda dari yang dimaksudkan pengembang.
Lihat Juga: Penangkap Rahasia
sumber
Tes unit Inspektur A yang melanggar enkapsulasi dalam upaya mencapai cakupan kode 100%, tetapi mengetahui begitu banyak tentang apa yang terjadi pada objek sehingga setiap upaya untuk refactor akan merusak tes yang ada dan memerlukan perubahan apa pun untuk tercermin dalam unit uji.
'bagaimana cara menguji variabel anggota saya tanpa mempublikasikannya ... hanya untuk pengujian unit?'
sumber
Pengaturan Berlebihan - James Carr
. Tes yang membutuhkan pengaturan besar untuk memulai pengujian. Kadang-kadang beberapa ratus baris kode digunakan untuk mempersiapkan lingkungan untuk satu pengujian, dengan beberapa objek yang terlibat, yang dapat membuatnya sulit untuk benar-benar memastikan apa yang diuji karena "noise" dari semua pengaturan yang terjadi. (Src: posting James Carr )
sumber
Probe Anal
Tes yang harus menggunakan cara-cara gila, ilegal atau tidak sehat untuk melakukan tugasnya seperti: Membaca bidang pribadi menggunakan setAccessible Java (benar) atau memperluas kelas untuk mengakses bidang / metode yang dilindungi atau harus memasukkan tes dalam paket tertentu untuk mengakses paket bidang / metode global.
Jika Anda melihat pola ini, kelas yang diuji menggunakan terlalu banyak data yang disembunyikan.
Perbedaan antara ini dan Inspektur adalah bahwa kelas yang diuji mencoba menyembunyikan bahkan hal-hal yang perlu Anda uji. Jadi tujuan Anda bukan untuk mencapai cakupan pengujian 100% tetapi untuk dapat menguji apa pun. Pikirkan kelas yang hanya memiliki bidang pribadi,
run()
metode tanpa argumen dan tidak ada getter sama sekali. Tidak ada cara untuk menguji ini tanpa melanggar aturan.Komentar oleh Michael Borgwardt: Ini bukan benar-benar sebuah antipattern pengujian, ini pragmatisme untuk menangani kekurangan dalam kode yang diuji. Tentu saja lebih baik untuk memperbaiki kekurangan-kekurangan itu, tetapi itu tidak mungkin dalam kasus perpustakaan pihak ke-3.
Aaron Digulla: Saya agak setuju. Mungkin entri ini benar-benar lebih cocok untuk wiki "JUnit HOWTO" dan bukan antipattern. Komentar?
sumber
Tes Tanpa Nama - Nick Pellow
Tes yang ditambahkan untuk mereproduksi bug tertentu dalam pelacak bug dan yang menurut penulis tidak menjamin nama sendiri. Alih-alih meningkatkan tes yang ada, kurang, tes baru dibuat disebut testForBUG123.
Dua tahun kemudian, ketika tes itu gagal, Anda mungkin perlu terlebih dahulu mencoba dan menemukan BUG-123 di pelacak bug Anda untuk mengetahui maksud tes.
sumber
Lambat Poke
Tes unit yang berjalan sangat lambat. Ketika pengembang menendang, mereka punya waktu untuk pergi ke kamar mandi, merokok, atau lebih buruk lagi, menendang tes sebelum mereka pulang pada akhir hari. (Src: posting James Carr )
alias tes yang tidak akan berjalan sesering yang seharusnya
sumber
Kupu-kupu
Anda harus menguji sesuatu yang berisi data yang berubah sepanjang waktu, seperti struktur yang berisi tanggal saat ini, dan tidak ada cara untuk memakukan hasilnya ke nilai tetap. Bagian buruknya adalah Anda sama sekali tidak peduli dengan nilai ini. Itu hanya membuat tes Anda lebih rumit tanpa menambahkan nilai apa pun.
Kelelawar sayapnya dapat menyebabkan badai di sisi lain dunia. - Edward Lorenz, The Butterfly Effect
sumber
System.DateTime.Now
, selain memiliki tes unit yang lebih sederhana atau lebih deterministik?toString()
objek yang tidak menimpa metode. Itu akan memberi Anda ID objek yang tergantung pada alamat memori. AtautoString()
berisi kunci utama objek dan yang berubah setiap kali Anda menjalankan tes. Ada tiga cara untuk memperbaikinya: 1. Ubah kode yang Anda uji, 2. gunakan regexp untuk menghapus bagian variabel dari hasil pengujian atau 3. gunakan alat yang kuat untuk menimpa layanan sistem untuk membuatnya mengembalikan hasil yang dapat diprediksi.The Flickering Test (Sumber: Romilly Cocking)
Tes yang kadang-kadang gagal, bukan pada waktu tertentu, dan umumnya disebabkan oleh kondisi lomba dalam tes. Biasanya terjadi ketika menguji sesuatu yang tidak sinkron, seperti JMS.
Mungkin super set ke anti-pola ' Tunggu dan Lihat ' dan ' The Sleeper '.
Build gagal, oh well, jalankan build lagi. - Pengembang Anonim
sumber
Tunggu dan lihat
Tes yang menjalankan beberapa kode pengaturan dan kemudian perlu 'menunggu' waktu tertentu sebelum dapat 'melihat' apakah kode yang diuji berfungsi seperti yang diharapkan. Sebuah testMethod yang menggunakan Thread.sleep () atau yang setara pasti merupakan tes "Tunggu dan Lihat".
Biasanya, Anda dapat melihat ini jika tes ini menguji kode yang menghasilkan peristiwa eksternal ke sistem seperti email, permintaan http atau menulis file ke disk.
Tes semacam itu juga bisa menjadi Pahlawan Lokal karena akan GAGAL saat dijalankan pada kotak yang lebih lambat atau server CI yang kelebihan beban.
Anti-Pola Tunggu dan Lihat tidak harus disamakan dengan The Sleeper .
sumber
Fixture Bersama yang Tidak Pantas - Tim Ottinger
Beberapa test case dalam fixture test bahkan tidak menggunakan atau membutuhkan pengaturan / penghancuran. Sebagian karena inersia pengembang untuk membuat fixture tes baru ... lebih mudah hanya menambahkan satu lagi test case ke tumpukan
sumber
Raksasa
Sebuah unit test yang, meskipun secara valid menguji objek yang sedang diuji, dapat menjangkau ribuan garis dan berisi banyak kasus uji. Ini bisa menjadi indikator bahwa sistem yang diuji adalah Obyek Tuhan (posting James Carr).
Tanda pasti untuk yang satu ini adalah tes yang mencakup lebih dari beberapa baris kode. Seringkali, tes ini sangat rumit sehingga mulai mengandung bug dari perilaku sendiri atau serpihan.
sumber
Saya akan percaya ketika saya melihat beberapa flashing GUI
. Fiksasi / obsesi yang tidak sehat dengan menguji aplikasi melalui GUI-nya 'seperti pengguna yang sebenarnya'
"Anda harus mengerti bahwa melihat adalah percaya, tetapi juga tahu bahwa percaya adalah melihat." - Denis Waitley
sumber
The Sleeper, alias Gunung Vesuvius - Nick Pellow
Tes yang diperuntukkan bagi GAGAL pada waktu dan tanggal tertentu di masa depan. Ini sering disebabkan oleh batas yang salah saat memeriksa kode pengujian yang menggunakan objek Tanggal atau Kalender. Terkadang, tes mungkin gagal jika dijalankan pada waktu yang sangat spesifik, seperti tengah malam.
'The Sleeper' tidak perlu bingung dengan anti-pola ' Tunggu dan Lihat '.
Kode itu akan diganti jauh sebelum tahun 2000 - Banyak pengembang pada tahun 1960
sumber
Pohon Mati
Sebuah tes dimana sebuah rintisan dibuat, tetapi tes itu tidak ditulis.
Saya sebenarnya melihat ini dalam kode produksi kami:
Aku bahkan tidak tahu harus berpikir apa tentang itu.
sumber
dapatkan sedikit dari ini hari ini:
Lantai basah :
Tes menciptakan data yang bertahan di suatu tempat, tetapi tes tidak membersihkan saat selesai. Ini menyebabkan tes (tes yang sama, atau mungkin tes lain) gagal pada tes berikutnya .
Dalam kasus kami, tes meninggalkan file tergeletak di dir "temp", dengan izin dari pengguna yang menjalankan tes pertama kali. Ketika pengguna yang berbeda mencoba menguji pada mesin yang sama: boom. Dalam komentar di situs James Carr, Joakim Ohlrogge menyebut ini sebagai "Pekerja Ceroboh", dan itu adalah bagian dari inspirasi untuk "Generous Leftovers". Saya suka nama saya untuk itu lebih baik (kurang menghina, lebih akrab).
sumber
The Cuckoo - Frank Carver
Sebuah unit test yang duduk dalam sebuah case uji dengan beberapa yang lain, dan menikmati proses setup yang sama (berpotensi panjang) seperti tes lain dalam case test, tetapi kemudian membuang beberapa atau semua artefak dari setup dan menciptakan sendiri.
Gejala Lanjutan: Jadwal yang Tidak Pantas Dibagikan
sumber
The Secret Catcher - Frank Carver
Sebuah tes yang pada pandangan pertama tampaknya tidak melakukan pengujian, karena tidak adanya penegasan. Tapi "Iblis ada dalam perincian" .. tes ini benar-benar mengandalkan pengecualian yang akan dilempar dan mengharapkan kerangka pengujian untuk menangkap pengecualian dan melaporkannya kepada pengguna sebagai kegagalan.
sumber
Assert.DoesNotThrow(SomeDelegateType act)
pernyataan gaya yang dapat digunakan secara khusus dalam kasus-kasus seperti ini. Saya menemukan ini kurang kotor daripada memiliki test case yang berhasil ketika konstruktor mengembalikan non-nol, tetapi gagal ketika konstruktor melempar. Konstruktor tidak akan pernah mengembalikan nol. (Catatan: hanya berlaku untuk bahasa di mana konstruktor dijamin untuk mengembalikan non-null)Perusak Lingkungan
Tes 'unit' yang untuk berbagai 'persyaratan' mulai tumpah ke lingkungannya, menggunakan dan mengatur variabel / port lingkungan. Menjalankan dua tes ini secara bersamaan akan menyebabkan pengecualian 'port tidak tersedia' dll.
Tes ini akan berselang, dan membuat pengembang mengatakan hal-hal seperti 'jalankan saja lagi'.
Salah satu solusi yang pernah saya lihat adalah memilih nomor port secara acak untuk digunakan. Ini mengurangi kemungkinan konflik, tetapi jelas tidak menyelesaikan masalah. Jadi jika Anda bisa, selalu mengejek kodenya sehingga tidak benar-benar mengalokasikan sumber daya yang tidak dapat dibagi.
sumber
Tes Turing
Sebuah testcase secara otomatis dihasilkan oleh beberapa alat mahal yang memiliki banyak, banyak pernyataan yang diperoleh dari kelas yang diuji menggunakan beberapa analisis aliran data yang terlalu pintar setengahnya. Membuai pengembang menjadi rasa percaya diri yang salah bahwa kode mereka diuji dengan baik, membebaskan mereka dari tanggung jawab merancang dan mempertahankan tes berkualitas tinggi. Jika mesin dapat menulis tes untuk Anda, mengapa mesin itu tidak bisa mengeluarkan jari dan menulis aplikasi itu sendiri?
Halo bodoh - Komputer terpintar di dunia hingga murid baru (dari komik Amiga lama).
sumber
Tes Tiang Kaki Empat Puluh
Takut terlalu dekat dengan kelas yang mereka coba uji, tes ini bertindak dari kejauhan, dipisahkan oleh lapisan abstraksi yang tak terhitung jumlahnya dan ribuan baris kode dari logika yang mereka periksa. Karena itu mereka sangat rapuh, dan rentan terhadap segala macam efek samping yang terjadi pada perjalanan epik ke dan dari kelas yang diminati.
sumber
Serupa
Untuk menguji sesuatu, Anda harus menyalin bagian dari kode yang sedang diuji ke kelas baru dengan nama dan paket yang sama dan Anda harus menggunakan sihir classpath atau classloader kustom untuk memastikan itu terlihat terlebih dahulu (sehingga salinan Anda diambil naik).
Pola ini menunjukkan sejumlah dependensi tersembunyi yang tidak sehat yang tidak dapat Anda kendalikan dari tes.
Saya melihat wajahnya ... wajah saya! Itu seperti cermin tetapi membuat darah saya membeku.
sumber
Mother Hen - Frank Carver
Pengaturan umum yang jauh lebih banyak dari yang dibutuhkan oleh test case yang sebenarnya. Misalnya membuat semua jenis struktur data kompleks yang dihuni dengan nilai-nilai yang tampaknya penting dan unik ketika tes hanya menegaskan ada atau tidak adanya sesuatu.
Gejala Lanjutan: Jadwal yang Tidak Pantas Dibagikan
Saya tidak tahu apa fungsinya ... Saya tetap menambahkannya, untuk berjaga-jaga. - Pengembang Anonim
sumber
Ujilah Semuanya
Saya tidak percaya ini belum disebutkan sampai sekarang, tetapi tes tidak boleh melanggar Prinsip Tanggung Jawab Tunggal .
Saya telah menemukan ini berkali-kali, tes yang melanggar aturan ini menurut definisi adalah mimpi buruk untuk dipertahankan.
sumber
Pemukul baris
Pada tes tampilan pertama mencakup semuanya dan alat cakupan kode mengkonfirmasikannya dengan 100%, tetapi pada kenyataannya tes hanya mengenai kode tanpa analisis output.
kode cakupan-vs-terjangkau
sumber