Saya memiliki kelas dengan satu metode publik Send()
dan beberapa metode pribadi. Ini memanggil beberapa layanan web dan memproses tanggapannya. Pemrosesan dilakukan dengan metode pribadi.
Saya ingin menguji unit kode. Pemahaman saya adalah bahwa unit test harus menguji kode saya secara terpisah (mis. Meniru respons pemasok).
Saya juga percaya bahwa metode pribadi seharusnya tidak perlu diuji unit Tetapi jika saya hanya menguji metode Kirim () kode saya tidak sedang diuji secara terpisah dan tergantung pada respon pemasok.
Haruskah saya membuat metode pribadi saya menjadi publik sehingga saya dapat mengujinya dengan tanggapan palsu? Rasanya latihan yang buruk karena saya hanya kelas yang harus memanggil mereka.
Maaf jika ini pertanyaan mendasar, saya cukup baru dalam pengujian unit.
Saya menggunakan c # dan VS2010
sumber
Jawaban:
Anda harus memisahkan kode yang berhubungan dengan layanan web (yaitu mengirim dan menerima data) dari kode yang memproses hasilnya. Pindahkan kode yang terakhir ke kelas yang berbeda, buat metode yang diperlukan publik. Kemudian Anda dapat dengan mudah menguji logika pemrosesan, terpisah dari dependensi eksternal.
Dengan ini, Anda juga membuat kode Anda sesuai dengan Prinsip Tanggung Jawab Tunggal . Sebagai aturan umum, merasa perlu untuk menguji metode pribadi sering kali merupakan indikasi bahwa kelas memiliki terlalu banyak tanggung jawab, sehingga harus di refactored ke dalam beberapa kelas.
sumber
Saya pikir tes dengan dependensi seperti itu ( memanggil penyedia layanan web ) adalah tes integrasi daripada tes unit.
sumber
Seperti yang dinyatakan orang lain, jika pengujian unit Anda memiliki dependensi eksternal seperti layanan web atau panggilan basis data maka mereka TIDAK sama sekali tes unit, itu adalah tes integrasi.
Uji unit yang sebenarnya dapat berjalan secara independen dari komponen luar selain dari komponen yang akan diuji dan harus dapat diulang terlepas dari lingkungan. Jika layanan web luar turun, pengujian unit Anda seharusnya tidak gagal.
Kami menyiasatinya dengan menggunakan Mocking Framework. Objek tiruan memungkinkan kita untuk membuat tiruan dari sebuah komponen sehingga komponen dalam pengujian unit kami menggunakan objek tiruan ini, bukan yang asli. Kita dapat menyuntikkan objek tiruan ke dalam komponen yang dapat diuji, dan menentukan argumen apa yang kita harapkan, apa yang kita inginkan untuk dikembalikan ketika dipanggil, bahkan pengecualian apa yang ingin kita lemparkan. Saya sangat merekomendasikan membaca lebih lanjut tentang masalah ini karena akan meningkatkan keandalan dan kemandirian tes unit Anda.
Untuk posting yang bagus tentang berbagai kerangka kerja mengejek C # lihat utas SO berikut:
/programming/37359/what-c-mocking-framework-to-use
EDIT: Untuk yang terlalu sensitif, saya akan mengatakan bahwa saya lalai menyebut DbUnit atau alat transaksional lain yang dapat mengembalikan perubahan database pada akhir tes. Ini juga dapat diulang dan bisa agnostik lingkungan dengan data uji yang dihasilkan sehingga Kerangka Pengejekan tidak diperlukan dalam kasus ini.
sumber