Haruskah penyedia antarmuka juga menyediakan implementasi tiruan untuk pengujian?

8

Kami membuang banyak waktu pada tes integrasi terakhir kami pada bug yang saya pikir seharusnya ditemukan dalam pengujian unit. Masalahnya adalah bahwa antarmuka / layanan yang kami panggil berperilaku berbeda dari yang kami harapkan dan uji unit tidak menemukan masalah ini karena kami mengejek antarmuka tersebut untuk pengujian unit dan tiruan kami tentu saja berdasarkan interpretasi yang keliru tentang apa yang akan antarmuka melakukan. Sekarang saya bisa sedikit marah pada rekan kerja kami yang menyediakan antarmuka, karena deskripsi / spesifikasi mereka (komentar JavaDoc singkat) adalah ambigu dan berkontribusi pada kesalahpahaman kami. Di sisi lain, saya berpikir bahwa masalahnya bisa dihindari jika rekan kerja yang sama telah memberikan implementasi tiruan dari antarmuka mereka yang dapat kita sebut dalam pengujian unit kami.

Sekarang, apa praktik terbaik dalam mengatur penciptaan objek tiruan di antara tim yang menyediakan dan menggunakan antarmuka bersama? Apa pengalaman anda

Robert Jack Will
sumber
Saya harap dalam semua penyelidikan atas kesalahan ini Anda memasukkan beberapa untuk Anda sendiri karena tidak bertanya kepada penulis jika pemahaman Anda benar ... Satu pertanyaan di pihak Anda bisa menyelamatkan semua rasa sakit.
Walter
2
Walter, terima kasih atas suntingan dan komentar konstruktif Anda. Saran Anda tidak menjawab pertanyaan secara langsung, tetapi sebenarnya merupakan solusi untuk masalah awal yang saya miliki. Karena saya merasa sangat sulit untuk mengajukan pertanyaan bagus tentang pemahaman sendiri, saya datang dengan ide lain: kami bisa meminta tim lain untuk meninjau rencana kami untuk menggunakan antarmuka mereka dan mereka mungkin telah menemukan masalah.
Robert Jack Will

Jawaban:

10

Idealnya, ya.

Siapa pun yang menulis kode yang digunakan orang lain tidak terikat untuk memberikan apa pun yang melengkapi kode tersebut. Namun, jika Anda ingin orang menggunakan kode Anda (dan semua orang harus selalu menulis dengan mentalitas ini), dokumentasi yang relevan luas - yang mungkin termasuk contoh - sangat berguna.

Saya pikir saya tidak pernah membaca dokumentasi dan berpikir, "Ini bodoh; terlalu banyak dokumentasi." Orang secara alami berbakat melompati apa yang mereka anggap tidak perlu. Kami, bagaimanapun, tidak bisa hanya membaca pikiran dan menyisipkan dokumentasi atau konsep yang belum dijelaskan. Jadi, aman untuk berasumsi: tidak ada dokumentasi yang terlalu bagus . Ini juga harus mengasumsikan bahwa orang yang membacanya sebagai bayi yang naif (yaitu membuatnya sesederhana mungkin).

Contoh tentang cara membuat instance dan menggunakan kelas selalu membantu. Meskipun, jika kode terlalu bergantung pada dokumentasi untuk dipahami, itu adalah masalah lain (terpisah).

Jawaban ini tidak boleh dilihat sebagai senjata yang akan membenarkan berteriak pada rekan kerja Anda. Itu hanyalah pedoman tentang apa yang menurut saya bermanfaat dan harus dilakukan. Meskipun ini sama sekali tidak berguna dalam situasi Anda (meskipun, saya merasa pertanyaan Anda pada dasarnya adalah kata-kata kasar), hal terbaik berikutnya yang dapat Anda lakukan adalah memimpin dengan memberi contoh dan berharap kolega Anda datang.

JK
sumber
1
Sementara saya telah menemukan diri saya mengeluh tentang terlalu banyak dokumentasi, contoh-contoh telah langka (dan mengambil masalah lebih banyak dengan kualitas yang mengakibatkan sangat panjang bernada dan membingungkan docs).
Pos Tim
1
@Tim: Terima kasih, baru saja diedit - Saya merujuk pada dokumentasi yang baik. Sayangnya, siapa pun dapat menulis banyak sampah sebagai 'dokumentasi'!
JK
5

Haruskah penyedia antarmuka juga menyediakan implementasi tiruan untuk pengujian?

Tidak , tetapi penyedia juga harus memberikan kode sumber untuk unittests mereka. Membaca buku ini Anda akan mendapatkan kesan yang baik bagaimana perpustakaan harus digunakan. Mungkin Anda bisa menambahkan unittests ke tes penyedia untuk menentukan apa yang Anda harapkan dari penyedia.

Ada banyak alat / kerangka mengejek di luar sana yang dapat mengimplementasikan tiruan / rintisan / tiruan.

Meminta penyedia untuk implementasi tiruan tidak memiliki hubungan biaya / manfaat yang baik karena ia tidak dapat mengetahui bagian mana dari implementasi palsu yang hampir identik dengan implementasi nyata dan bagian mana yang hanya fasad.

Cara lain untuk mengatasi ini adalah jika penyedia menggunakan codecontracts untuk memastikan bahwa lib digunakan dengan cara yang ditentukan.

k3b
sumber
+1 "Ada banyak alat / kerangka kerja mengejek di luar sana yang dapat mengimplementasikan tiruan / rintisan / tiruan."
Armand
Pengujian Unit: Saya melihat dua masalah dalam menggunakannya sebagai dokumentasi: 1. mereka hanya menunjukkan contoh apa yang didukung layanan, tetapi tidak akan memberi tahu saya jika penggunaan tertentu yang ada dalam pikiran saya didukung. 2. Membaca unit test hampir sama menuntut / melelahkan seperti membaca kode dan saya mencari solusi yang menghemat pekerjaan semua orang. Saya mencari sesuatu yang bekerja secara otomatis, seperti tes atau kontrak (yang juga sedang kita bahas).
Robert Jack Will
"Penyedia tidak dapat mengetahui penggunaan mock": Saya tidak yakin tentang itu. Untuk satu hal mock harus memeriksa semua prasyarat (apakah layanan digunakan dengan benar) dan harus mengembalikan beberapa nilai dummy. Pada dasarnya semua yang dibutuhkan untuk menguji unit klien. Bisakah Anda menguraikan lebih lanjut tentang informasi apa yang hilang dari penyedia untuk melakukan ini dengan baik?
Robert Jack Will
the mock should check all the preconditions: mengapa mock perlu memeriksa apakah lib sebenarnya melakukan pemeriksaan ini. Jika Anda memiliki tes integrasi dengan lib nyata tes ini akan membawa Anda ke masalah.
k3b
k3b: kami ingin menemukan bug sedini mungkin dan tes integrasi bisa dilakukan nanti. Ini persis masalah yang kita miliki. Yah, kami sudah berupaya meningkatkan proses sehingga tes integrasi dapat terjadi lebih awal dan lebih sering, tetapi unit test tetap harus menemukan bug sebanyak mungkin.
Robert Jack Will