Saya menamai pertanyaan itu dengan bercanda karena saya yakin "itu tergantung," tetapi saya punya beberapa pertanyaan spesifik.
Bekerja dalam perangkat lunak yang memiliki banyak lapisan ketergantungan, tim saya telah terbiasa menggunakan ejekan secara luas untuk memisahkan setiap modul kode dari dependensi di bawahnya.
Karena itu saya terkejut bahwa Roy Osherove menyarankan dalam video ini bahwa Anda harus menggunakan mengejek hanya sekitar 5% dari waktu. Saya kira kita duduk di suatu tempat antara 70-90%. Saya telah melihat panduan serupa lainnya dari waktu ke waktu juga.
Saya harus mendefinisikan apa yang saya anggap sebagai dua kategori "tes integrasi" yang sangat berbeda sehingga mereka benar-benar harus diberi nama yang berbeda: 1) Tes dalam proses yang mengintegrasikan beberapa modul kode dan 2) Tes luar proses yang berbicara ke basis data, sistem file, layanan web, dll. Ini adalah tipe # 1 yang saya khawatirkan, tes yang mengintegrasikan beberapa modul kode semua dalam proses.
Banyak dari panduan komunitas yang telah saya baca menunjukkan bahwa Anda harus lebih memilih sejumlah besar unit test terisolasi, berbutir halus dan sejumlah kecil tes integrasi end-to-end berbutir kasar, karena unit test memberi Anda umpan balik yang tepat di mana tepatnya regresi mungkin telah dibuat, tetapi pengujian kasar, yang rumit untuk diatur, sebenarnya memverifikasi lebih banyak fungsi ujung ke ujung sistem.
Mengingat hal ini, tampaknya perlu menggunakan ejekan yang agak sering untuk mengisolasi unit kode yang terpisah ini.
Diberikan model objek sebagai berikut:
... Juga pertimbangkan bahwa kedalaman ketergantungan aplikasi kita jauh lebih dalam daripada yang bisa saya muat dalam gambar ini, sehingga ada beberapa lapisan N antara lapisan 2-4 dan lapisan 5-13.
Jika saya ingin menguji beberapa keputusan logis sederhana yang dibuat di unit # 1, dan jika setiap ketergantungan adalah konstruktor-disuntikkan ke dalam modul kode yang tergantung padanya sehingga, katakanlah, 2, 3, dan 4 adalah konstruktor yang dimasukkan ke dalam modul 1 di gambar, saya lebih suka menyuntikkan mengejek 2, 3, dan 4 menjadi 1.
Kalau tidak, saya perlu membuat contoh konkret dari 2, 3, dan 4. Ini bisa lebih sulit daripada hanya mengetik tambahan. Seringkali 2, 3, dan 4 akan memiliki persyaratan konstruktor yang dapat menantang untuk memuaskan dan sesuai dengan grafik (dan sesuai dengan realitas proyek kami), saya perlu membuat contoh konkrit dari N hingga 13 untuk memuaskan konstruktor dari 2, 3, dan 4.
Situasi ini menjadi lebih menantang ketika saya membutuhkan 2, 3, atau 4 untuk berperilaku tertentu sehingga saya dapat menguji keputusan logis sederhana di # 1. Saya mungkin perlu memahami dan "secara mental beralasan tentang" seluruh objek grafik / pohon sekaligus untuk mendapatkan 2, 3, atau 4 untuk berperilaku dengan cara yang diperlukan. Seringkali tampak jauh lebih mudah untuk melakukan myMockOfModule2.Setup (x => x.GoLeftOrRight ()). Returns (new Right ()); untuk menguji modul 1 itu merespon seperti yang diharapkan ketika modul 2 memberitahu itu untuk langsung ke kanan.
Jika saya menguji contoh konkret dari 2 ... N ... 13 bersama-sama, pengaturan uji akan sangat besar dan sebagian besar diduplikasi. Kegagalan pengujian mungkin tidak melakukan pekerjaan yang sangat baik untuk menentukan dengan tepat lokasi kegagalan regresi. Tes tidak akan independen ( tautan pendukung lain ).
Memang, seringkali masuk akal untuk melakukan pengujian lapisan bawah berbasis negara, daripada berbasis interaksi, karena modul-modul tersebut jarang memiliki ketergantungan lebih lanjut. Tetapi tampaknya mengejek hampir secara definisi diperlukan untuk mengisolasi setiap modul di atas terbawah.
Dengan semua ini, adakah yang bisa memberi tahu saya apa yang mungkin hilang? Apakah tim kita terlalu sering mengejek? Atau mungkin ada beberapa asumsi dalam pedoman pengujian unit tipikal bahwa lapisan ketergantungan pada sebagian besar aplikasi akan cukup dangkal sehingga memang masuk akal untuk menguji semua modul kode yang diintegrasikan bersama-sama (menjadikan case kami "istimewa")? Atau mungkin secara berbeda, apakah tim kita tidak membatasi konteks kita dengan baik?
Or is there perhaps some assumption in typical unit testing guidance that the layers of dependency in most applications will be shallow enough that it is indeed reasonable to test all of the code modules integrated together (making our case "special")?
<- Ini.