Metode pengujian unit yang memanggil layanan web pemasok

10

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

Tom Squires
sumber
Jika Anda tidak menguji metode pribadi, bagaimana Anda tahu jika itu berhasil?
Bryan Oakley
1
@BryanOakley Anda tidak perlu tahu bahwa metode pribadi berfungsi, itu pribadi. Anda tahu itu berfungsi karena metode publik yang menyebutnya lulus tes.
StuperUser
@Bryan Oakley lihat tautannya
Tom Squires
Halo Tom, saya telah memperbarui tautan untuk membuatnya lebih menonjol dan membuat teks tautan mencerminkan targetnya. Silakan rollback.
StuperUser

Jawaban:

18

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.

Péter Török
sumber
3

Saya pikir tes dengan dependensi seperti itu ( memanggil penyedia layanan web ) adalah tes integrasi daripada tes unit.

OC
sumber
3

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.

maple_shaft
sumber
Bisakah seseorang menjelaskan downvote? Saya tidak menyalin di PHP, ROR, database NoSQL, Javascript di server, produk Apple atau tren hebat lainnya, tetapi saya masih
MENDAPATKAN
Saya kira seseorang tidak suka memiliki unit test mereka disebut "tidak unit test sama sekali" (bukan saya) :)
Daniel B