Seperti disebutkan oleh jawaban terpilih, Martin Fowler membahas perbedaan-perbedaan ini di Mocks Aron't Stubs , dan khususnya subjudul The Difference Between Mocks and Stubs , jadi pastikan untuk membaca artikel itu.
Daripada berfokus pada bagaimana hal-hal ini berbeda, saya pikir itu lebih mencerahkan untuk fokus pada mengapa ini adalah konsep yang berbeda. Masing-masing ada untuk tujuan yang berbeda.
Palsu
Sebuah palsu adalah sebuah implementasi yang berperilaku "alami", tetapi tidak "nyata". Ini adalah konsep yang kabur dan orang yang berbeda memiliki pemahaman yang berbeda tentang apa yang membuat sesuatu menjadi palsu.
Salah satu contoh palsu adalah basis data dalam memori (misalnya menggunakan sqlite dengan :memory:
toko). Anda tidak akan pernah menggunakan ini untuk produksi (karena data tidak bertahan), tetapi itu sangat memadai sebagai database untuk digunakan dalam lingkungan pengujian. Ini juga jauh lebih ringan daripada database "nyata".
Sebagai contoh lain, mungkin Anda menggunakan beberapa jenis penyimpanan objek (misalnya Amazon S3) dalam produksi, tetapi dalam pengujian Anda bisa menyimpan objek ke file pada disk; maka implementasi "save to disk" Anda akan menjadi palsu. (Atau Anda bahkan bisa memalsukan operasi "simpan ke disk" dengan menggunakan sistem file di memori sebagai gantinya.)
Sebagai contoh ketiga, bayangkan objek yang menyediakan API cache; sebuah objek yang mengimplementasikan antarmuka yang benar tetapi tidak melakukan caching sama sekali tetapi selalu mengembalikan cache miss akan menjadi semacam palsu.
Tujuan dari suatu kepalsuan bukan untuk mempengaruhi perilaku sistem yang diuji , tetapi untuk menyederhanakan implementasi tes (dengan menghapus ketergantungan yang tidak perlu atau kelas berat).
Rintisan bertopik
Sebuah stub merupakan implementasi yang berperilaku "tidak wajar". Ini sudah dikonfigurasikan sebelumnya (biasanya oleh set tes) untuk menanggapi input spesifik dengan output spesifik.
Tujuan dari rintisan adalah untuk menguji sistem Anda ke keadaan tertentu. Misalnya, jika Anda menulis tes untuk beberapa kode yang berinteraksi dengan REST API, Anda bisa mematikan REST API dengan API yang selalu mengembalikan respons kalengan, atau yang menanggapi permintaan API dengan kesalahan tertentu. Dengan cara ini Anda bisa menulis tes yang membuat pernyataan tentang bagaimana sistem bereaksi terhadap keadaan ini; misalnya, menguji respons yang didapat pengguna Anda jika API mengembalikan kesalahan 404.
Sebuah rintisan biasanya diterapkan untuk hanya menanggapi interaksi persis yang Anda katakan untuk ditanggapi. Tetapi fitur kunci yang membuat sesuatu menjadi rintisan adalah tujuannya : rintisan adalah tentang menyiapkan test case Anda.
Mengejek
Sebuah mock mirip dengan rintisan, tapi dengan verifikasi ditambahkan dalam. Tujuan dari mock adalah untuk membuat pernyataan tentang bagaimana sistem Anda di bawah uji berinteraksi dengan ketergantungan .
Misalnya, jika Anda menulis tes untuk sistem yang mengunggah file ke situs web, Anda bisa membuat tiruan yang menerima file dan yang dapat Anda gunakan untuk menyatakan bahwa file yang diunggah benar. Atau, dalam skala yang lebih kecil, adalah hal biasa untuk menggunakan tiruan dari suatu objek untuk memverifikasi bahwa sistem yang diuji memanggil metode tertentu dari objek yang diejek.
Mock terikat pada pengujian interaksi , yang merupakan metodologi pengujian khusus. Orang-orang yang lebih suka menguji keadaan sistem daripada interaksi sistem akan menggunakan ejekan hemat jika sama sekali.
Tes ganda
Palsu, bertopik, dan mengolok-olok semuanya termasuk dalam kategori tes ganda . Tes ganda adalah objek atau sistem apa pun yang Anda gunakan dalam ujian alih-alih yang lain. Sebagian besar pengujian perangkat lunak otomatis melibatkan penggunaan uji ganda atau sejenisnya. Beberapa jenis lain dari ganda tes meliputi nilai-nilai boneka , mata-mata , dan I / O Blackholes .