Kapan saya harus menggunakan benda tiruan?

14

Saya sudah membaca banyak hal tentang TDD tapi saya masih ragu. Sebagai contoh, saya punya diagram kelas ini:

masukkan deskripsi gambar di sini

Ini adalah contoh sederhana, hanya untuk mempelajari tentang benda-benda TDD dan tiruan.

Tes mana yang harus saya tulis terlebih dahulu? Produk , lalu Baris dan terakhir, Pesan ? Jika saya melakukan itu, haruskah saya menggunakan Lini dan Produk untuk menguji Pesanan atau haruskah saya menggunakan Objek Mock? Kapan saya harus menggunakan Objek Mock? Haruskah saya menggunakan UML dengan XP dan TDD?

Saya belum mendapatkan barang-barang ini.

Zanon
sumber

Jawaban:

10

Dilihat dari diagram, Produk adalah kelas data yang bodoh, tanpa fungsi untuk diuji. Jadi saya akan mulai menulis tes untuk (dan menerapkan, gaya TDD) pertama Line dan kemudian Order, naik tangga ketergantungan. Biasanya masuk akal untuk menguji kelas level bawah Anda sebelum mulai bekerja pada kelas level yang lebih tinggi (yaitu yang tergantung pada level bawah). Ini membuat penangkapan bug lebih efisien.

Apakah Anda perlu menggunakan objek tiruan tergantung pada dependensi sebenarnya dari kelas yang diuji. Jika ini adalah kelas sederhana yang dapat Anda instantiate dengan mudah dan atur dengan data / kondisi yang diinginkan yang diperlukan untuk pengujian Anda, Anda tidak perlu mengejek. (Ini tampaknya menjadi kasus untuk desain contoh Anda di sini.) Namun, jika salah satu dependensi sulit diinisialisasi / memiliki dependensi yang luas itu sendiri / memiliki efek samping yang tidak diinginkan / tergantung pada sumber daya eksternal seperti DB, maka masuk akal untuk menggunakan objek tiruan sebagai gantinya.

Péter Török
sumber
Seperti yang saya katakan sebelumnya, itu adalah skenario sederhana, hanya untuk mempelajari tentang benda-benda TDD dan Mock ... Jawaban yang bagus, terima kasih. Dan bagaimana dengan UML? Haruskah saya menghindarinya?
@ Thomas, tidak perlu menghindari UML, itu tidak bertentangan dengan TDD. UML sangat baik untuk memvisualisasikan / mengomunikasikan masalah desain. Ini bisa sangat berguna pada tahap pengembangan tertentu. Namun, desain berevolusi, dan berusaha menjaga diagram sistem UML yang indah dan terperinci selaras dengan kode dapat dengan cepat menjadi beban. Jadi ingat untuk membuangnya saat Anda tidak membutuhkannya lagi :-)
Péter Török
1
@ Thomas, btw kebaktian di sini adalah untuk mengunggulkan jawaban yang menurut Anda berguna, dengan mengklik tanda panah di sebelah jawaban :-)
Péter Török
4

Saya tidak melihat banyak kebutuhan untuk benda tiruan di sini. Seperti yang ditunjukkan oleh orang lain, Anda membutuhkan yang sebagian besar jika dependensi sulit diatur.

Sebagai contoh, kami menggunakannya dengan proyek-proyek Ruby on Rails ketika kami menguji pengontrol dan membutuhkan login pengguna yang akan membutuhkan panggilan ke pengontrol lain dan menyimpan bagian dari informasi itu dalam cookie. Dalam hal ini, sangat membantu untuk mengejek pengguna yang masuk yang mengembalikan true, ketika ditanya tentang hak akses tertentu.

thorsten müller
sumber
2

Biasanya untuk pengujian Anda ingin mengisolasi sistem / objek yang diuji, sehingga Anda akan mengejek apa pun yang ada di luar itu. Jadi, gunakan diagram kelas Anda, saat menguji objek pesanan, gunakan tiruan untuk objek garis. Saat menguji Jalur, gunakan tiruan untuk Pesanan dan Produk. Saat menguji produk, gunakan tiruan untuk Line.

Es hitam
sumber
Karena Produk tidak bergantung pada Line, tidak perlu (atau cara) untuk menggunakan tiruan untuk Line di sana. Sama untuk Line and Order.
Péter Török
2

"TDD pada dasarnya adalah teknik desain dengan efek samping untuk memastikan bahwa kode sumber Anda diuji unit secara menyeluruh" - Scott W. Ambler

Idenya adalah menemukan desain dengan menulis unit test. Dalam kasus Anda, tampaknya Anda sudah memiliki desain, yang agak mengalahkan tujuan TDD (dengan asumsi desain Anda final).

Tentang mengejek. Jika Anda ingin mengejek, saya sarankan Anda mengejek Produk saat menulis tes untuk Line dan tiruan Line saat menguji Order. Tapi mungkin berlebihan di sini. Saya pribadi mencoba membatasi ejekan sebanyak mungkin, dan menggunakannya untuk memisahkan dependensi pada kelas eksternal (seperti contoh basis data).

Martin Wickman
sumber
2
Saya hanya memiliki diagram kelas sederhana ...
-1 Jadi memikirkan desain (termasuk mencoret diagram kelas) mencegah Anda melakukan TDD? Itu keliru sekali.
Bjarke Freund-Hansen
1
@jarkef: Tolong baca kembali jawaban saya. Jika desainnya final, Anda tidak dapat benar-benar menggunakan TDD untuk mengusir desain, yang menjadi tujuan TDD. Dan saya pikir ini juga yang membuat OP bingung: dia sudah punya solusi, dan sekarang mencoba menulis tes untuk itu. "Tes mana yang harus saya tulis terlebih dahulu, Produk atau Pesanan". Pertanyaan itu tidak benar-benar relevan jika Anda menulis tes terlebih dahulu.
Martin Wickman
Bagaimana Anda menentukan desain itu final tanpa tes atau kode produksi? Dengan asumsi Anda ingin membuat sesuatu yang berfungsi.
JeffO
@ Jeff: Anda tidak bisa, jelas. Itu satu hal TDD dapat membantu Anda.
Martin Wickman