Saya menulis tes untuk sebuah proyek yang terdiri dari beberapa submodula. Setiap test case yang saya tulis berjalan independen satu sama lain dan saya menghapus semua data antar test.
Meskipun tes berjalan secara independen, saya mempertimbangkan untuk menegakkan perintah eksekusi, karena beberapa kasus memerlukan lebih dari satu submodule. Sebagai contoh, sebuah submodule menghasilkan data, dan yang lainnya menjalankan kueri pada data. Jika submodule yang menghasilkan data mengandung kesalahan, tes untuk submodule kueri juga akan gagal, bahkan jika submodule itu sendiri berfungsi dengan baik.
Saya tidak dapat bekerja dengan data dummy, karena fungsi utama yang saya uji adalah koneksi ke server kotak hitam, yang hanya mendapatkan data dari submodule pertama.
Dalam hal ini, apakah boleh untuk menegakkan perintah eksekusi untuk tes atau itu praktik yang buruk? Saya merasa seperti ada bau dalam pengaturan ini, tetapi saya tidak dapat menemukan cara yang lebih baik.
sunting: pertanyaannya adalah dari Bagaimana menyusun tes di mana satu tes adalah setup tes lain? karena tes "sebelumnya" bukan pengaturan, tetapi menguji kode yang melakukan pengaturan.
sumber
Jawaban:
Ini adalah bagian penting bagi saya. Anda dapat berbicara tentang "unit test" dan mereka "berjalan secara independen satu sama lain", tetapi semuanya terdengar seperti mereka bergantung pada server jarak jauh ini dan bergantung pada "sub modul pertama". Jadi semuanya terdengar sangat erat dan tergantung pada kondisi eksternal. Dengan demikian, Anda sebenarnya sedang menulis tes integrasi. Menjalankan tes-tes itu dalam urutan tertentu adalah sangat normal karena sangat tergantung pada faktor-faktor eksternal. Uji coba yang diperintahkan, dengan opsi untuk keluar lebih awal dari uji coba jika ada masalah yang benar-benar dapat diterima untuk uji integrasi.
Tapi, itu juga layak untuk mengambil melihat segar pada struktur aplikasi Anda. Mampu mengolok-olok submodul pertama dan server eksternal akan berpotensi memungkinkan Anda untuk menulis unit test yang benar untuk semua submodul lainnya.
sumber
Ya, itu praktik yang buruk.
Secara umum, tes unit dimaksudkan untuk menguji unit kode tunggal (misalnya fungsi tunggal berdasarkan status yang diketahui).
Saat Anda ingin menguji rangkaian peristiwa yang mungkin terjadi di alam liar, Anda menginginkan gaya uji yang berbeda, seperti tes integrasi. Ini bahkan lebih benar jika Anda bergantung pada layanan pihak ketiga.
Untuk menguji unit hal-hal seperti ini, Anda perlu mencari cara untuk menyuntikkan data dummy, misalnya mengimplementasikan antarmuka layanan data yang mencerminkan permintaan web tetapi mengembalikan data yang diketahui dari file data dummy lokal.
sumber
Perintah pelaksanaan yang dipaksakan yang Anda usulkan hanya masuk akal jika Anda juga membatalkan pengujian setelah kegagalan pertama.
Membatalkan uji coba pada kegagalan pertama berarti bahwa setiap uji coba hanya dapat mengungkap satu masalah dan itu tidak dapat menemukan masalah baru sampai semua masalah sebelumnya telah diperbaiki. Jika tes pertama yang dijalankan menemukan masalah yang membutuhkan waktu satu bulan untuk diperbaiki, maka selama bulan itu secara efektif tidak ada tes yang akan dijalankan.
Jika Anda tidak membatalkan pengujian yang dijalankan pada kegagalan pertama, maka perintah eksekusi yang dipaksakan tidak akan memberi Anda apa pun karena setiap tes yang gagal perlu diselidiki pula. Bahkan jika hanya untuk mengkonfirmasi bahwa pengujian pada submodule kueri gagal karena kegagalan yang juga diidentifikasi pada data yang menghasilkan submodule.
Saran terbaik yang bisa saya berikan adalah menulis tes sedemikian rupa sehingga mudah untuk mengidentifikasi kapan kegagalan dalam ketergantungan menyebabkan tes gagal.
sumber
Aroma yang Anda maksudkan adalah penerapan serangkaian kendala dan aturan yang salah pada pengujian Anda.
Unit Test sering bingung dengan "pengujian otomatis", atau "pengujian otomatis oleh seorang programmer".
Tes Unit harus kecil, independen, dan cepat.
Beberapa orang salah membaca ini sebagai "tes otomatis yang ditulis oleh seorang programmer harus kecil independen dan cepat" . Tapi itu hanya berarti jika tes Anda tidak kecil, independen, dan cepat, mereka tidak Unit Pengujian, dan karena itu beberapa aturan untuk Unit Pengujian tidak harus, tidak bisa, atau tidak harus mengajukan permohonan untuk tes Anda. Contoh sepele: Anda harus menjalankan Tes Unit setelah setiap build, yang tidak boleh Anda lakukan untuk tes otomatis yang tidak cepat.
Meskipun tes Anda bukan Tes Unit berarti Anda dapat melewati satu aturan dan diizinkan untuk memiliki saling ketergantungan di antara tes, Anda juga menemukan bahwa ada aturan lain yang mungkin Anda lewatkan dan perlu diperkenalkan kembali - sesuatu untuk ruang lingkup pertanyaan lain .
sumber
Seperti disebutkan di atas, apa yang Anda jalankan tampaknya merupakan tes integrasi, namun Anda menyatakan bahwa:
Dan ini mungkin tempat yang baik untuk memulai refactoring. Modul yang menjalankan kueri pada data tidak boleh bergantung pada implementasi konkret dari modul (data pembangkit) pertama. Alih-alih akan lebih baik untuk menyuntikkan antarmuka yang berisi metode untuk mendapatkan data itu dan ini kemudian dapat dipermainkan untuk menguji kueri.
misalnya
Jika Anda memiliki:
Alih-alih lebih suka:
Ini menghapus ketergantungan dari kueri pada sumber data Anda dan memungkinkan Anda untuk mengatur tes unit yang mudah diulang untuk skenario tertentu.
sumber
Jawaban lain menyebutkan bahwa tes pemesanan buruk (yang memang benar sebagian besar waktu), tetapi ada satu alasan bagus untuk menegakkan pesanan pada pelaksanaan tes: pastikan tes lambat Anda (yaitu, tes integrasi) berjalan setelah tes cepat Anda (tes yang tidak bergantung pada sumber daya luar lainnya). Ini memastikan bahwa Anda melakukan lebih banyak tes lebih cepat, yang dapat mempercepat putaran umpan balik.
sumber