Ini adalah sesuatu yang mengganggu saya untuk sementara waktu sekarang. Apakah layak menguji unit klien API?
Katakanlah Anda membuat kelas kecil untuk abstrak-jauh panggilan ke API REST petshop. Petshop adalah API yang sangat sederhana, dan memiliki serangkaian metode dasar:
listProducts()
getProductDetails(ProductID)
addProduct(...)
removeProduct(ProductID)
Dalam menguji ini, kita harus membuat layanan tiruan atau mengejek tanggapan. Tapi itu tampaknya berlebihan; Saya mengerti bahwa kami ingin memastikan bahwa metode kami tidak berhenti bekerja melalui kesalahan ketik / sintaks, tetapi karena kami sedang menulis fungsi yang memanggil metode jarak jauh dan kemudian kami membuat tanggapan palsu dari metode jarak jauh itu, sepertinya buang-buang usaha dan kita sedang menguji sesuatu yang tidak bisa benar-benar gagal. Lebih buruk lagi, jika metode jarak jauh mengubah pengujian unit kami akan berlalu sementara penggunaan produksi gagal.
Saya cukup yakin saya kehilangan sesuatu, atau saya mendapatkan ujung tongkat yang salah, atau saya tidak melihat kayu untuk pepohonan. Bisakah seseorang membuat saya di jalur yang benar?
sumber
Jawaban:
Tugas klien API jarak jauh adalah mengeluarkan panggilan tertentu - tidak lebih, tidak kurang. Karena itu, pengujiannya harus memverifikasi bahwa ia mengeluarkan panggilan-panggilan itu - tidak lebih, tidak kurang.
Tentu, jika penyedia API mengubah semantik tanggapan mereka, maka sistem Anda akan gagal dalam produksi. Tapi itu bukan kesalahan kelas klien Anda; itu sesuatu yang hanya bisa ditangkap dalam tes integrasi. Dengan mengandalkan kode yang tidak di bawah kendali Anda, Anda telah menyerahkan kemampuan untuk memverifikasi kebenaran melalui pengujian internal - itu adalah trade-off, dan ini adalah harganya.
Yang mengatakan, menguji kelas yang hanya terdiri dari delegasi ke kelas lain mungkin berprioritas rendah, karena ada sedikit risiko kesalahan kompleks. Tapi itu berlaku untuk setiap kelas yang hanya terdiri dari satu-liner seragam, itu tidak ada hubungannya dengan memanggil kode vendor lain.
sumber
foo()
dipanggil sebelumnyabar()
, tetapi itu tidak berarti meneleponfoo()
sebelumnyabar()
adalah hal yang benar untuk dilakukan; unit test seperti itu akan lulus bahkan jika kodenya salah. Dan jika hanya itu yang dilakukan klien, menyiapkan tiruan yang memeriksa apakahfoo()
dipanggil sebelumnyabar()
relatif merepotkan untuk sesuatu yang dapat diverifikasi dengan melihat kode klien secara sepintas.add()
metode menambahkan dua angka dengan benar, tetapi itu tidak berarti bahwa menambahkan adalah hal yang benar untuk dilakukan pada titik ini dalam algoritma -add()
unit test akan berhasil walaupun program Anda salah. Jika itu adalah hal yang salah, makalevenshteinDistance()
metode Anda yang harus disalahkan, bukanadd()
metodenya. Ini persis sama. Inti dari pemisahan kode menjadi metode adalah bahwa setiap metode hanya perlu peduli untuk memperbaiki satu hal.Jawaban singkat:
Semua metode harus diuji unit.
Jawaban panjang:
Iya nih. Itu sangat berharga.
Ini adalah beberapa hal yang harus diuji oleh unit test pada metode pemanggilan API tersebut:
Itu adalah hal-hal yang dilakukan metode yang dapat diisolasi saya mengejek layanan API, dan bahwa dengan menguji mereka dengan baik, meyakinkan Anda bahwa kesalahan tidak berasal dari kesalahan dalam kode klien yang memanggil API.
sumber
Ini tidak akan menjadi unit test karena Anda menguji input dan output sistem Anda, lebih seperti tes integrasi terbatas.
Berhati-hatilah ketika Anda mengatakan "itu tampak seperti usaha yang sia-sia dan kami sedang menguji sesuatu yang tidak bisa benar-benar gagal" - itu bisa gagal, itu akan gagal, itu mungkin akan gagal dengan cara yang tidak dapat Anda antisipasi, kegagalan akan lebih buruk jika Anda tidak memiliki tes di tempat.
Kesalahan yang Anda lakukan di sini adalah terkait dengan penemuan roda: Melakukan panggilan ke layanan jarak jauh dan API adalah skenario yang sangat umum sehingga ada beberapa alat yang cukup bagus untuk membantu Anda mengujinya. Terakhir kali saya mengerjakan aplikasi yang terhubung ke layanan jarak jauh saya menggunakan SoapUIyang dapat melihat layanan dan melakukan panggilan palsu ke layanan itu atau berperilaku sebagai salinan lokal dari server yang Anda dapat membuat panggilan uji terhadap dan melacak melalui permintaan dan tanggapan. Butuh beberapa menit untuk mengatur dan juga sangat cepat untuk memperbarui jika antarmuka jarak jauh berubah. Saya belum menggunakannya dalam skenario REST, tetapi bahkan jika itu tidak bekerja dengan baik untuk itu (atau mungkin seseorang membaca jawaban ini di masa depan ketika ada alat yang lebih baik) Anda harus dapat menemukan alat yang dapat mengejek layanan untuk Anda dan ketika tiba saatnya untuk menyebarkan kode Anda, Anda akan senang bahwa Anda melakukannya.
sumber