Ada dua masalah yang harus kita perhatikan di sini.
Yang pertama adalah bahwa Anda tampaknya melihat semua tes Anda dari perspektif tes unit. Tes unit sangat berharga, tetapi bukan satu-satunya jenis tes. Tes sebenarnya dapat dibagi menjadi beberapa lapisan yang berbeda, dari tes unit yang sangat cepat hingga tes integrasi yang kurang cepat hingga tes penerimaan yang lebih lambat . (Mungkin ada lebih banyak lapisan pecah, seperti tes fungsional .)
Yang kedua adalah bahwa Anda menggabungkan panggilan untuk kode pihak ketiga dengan logika bisnis Anda, menciptakan tantangan pengujian dan mungkin membuat kode Anda lebih rapuh.
Tes unit harus cepat dan harus sering dijalankan. Mengejek dependensi membantu agar tes ini berjalan cepat, tetapi berpotensi dapat menyebabkan lubang dalam cakupan jika ketergantungan berubah dan tiruan tidak. Kode Anda dapat rusak sementara tes Anda masih berjalan hijau. Beberapa perpustakaan mengejek akan memperingatkan Anda jika antarmuka ketergantungan berubah, yang lain tidak bisa.
Tes integrasi, di sisi lain, dirancang untuk menguji interaksi antara komponen, termasuk perpustakaan pihak ketiga. Mock tidak boleh digunakan pada tingkat pengujian ini karena kami ingin melihat bagaimana objek aktual berinteraksi bersama. Karena kami menggunakan objek nyata, tes ini akan lebih lambat, dan kami tidak akan menjalankannya hampir sesering unit kami menguji.
Tes penerimaan terlihat pada tingkat yang lebih tinggi, menguji apakah persyaratan untuk perangkat lunak terpenuhi. Tes-tes ini dijalankan terhadap keseluruhan, sistem lengkap yang akan dikerahkan. Sekali lagi, tidak ada ejekan yang harus digunakan.
Salah satu pedoman yang menurut orang berharga tentang mengolok-olok adalah dengan tidak mengolok-olok tipe yang tidak Anda miliki . Amazon memiliki API ke S3 sehingga mereka dapat memastikan itu tidak berubah di bawah mereka. Anda, di sisi lain, tidak memiliki jaminan ini. Karena itu, jika Anda mengejek API S3 dalam pengujian Anda, itu dapat mengubah dan memecahkan kode Anda, sementara semua pengujian Anda menunjukkan hijau. Jadi, bagaimana kita menyatukan kode uji yang menggunakan pustaka pihak ketiga?
Yah, kita tidak tahu. Jika kita mengikuti panduan ini, kita tidak bisa mengejek benda yang bukan milik kita. Tetapi ... jika kita memiliki ketergantungan langsung kita, kita dapat mengejeknya. Tapi bagaimana caranya? Kami membuat bungkus kami sendiri untuk API S3. Kita dapat membuatnya sangat mirip dengan API S3, atau kita dapat membuatnya sesuai dengan kebutuhan kita lebih dekat (lebih disukai). Kita bahkan dapat membuatnya sedikit lebih abstrak, katakan saja PersistenceService
daripada AmazonS3Bucket
. PersistenceService
akan menjadi antarmuka dengan metode seperti #save(Thing)
dan #fetch(ThingId)
, jenis metode yang mungkin ingin kita lihat (ini adalah contoh, Anda mungkin sebenarnya ingin metode yang berbeda). Kami sekarang dapat menerapkan PersistenceService
sekitar S3 API (katakanlah S3PersistenceService
), merangkumnya dari kode panggilan kami.
Sekarang ke kode yang memanggil API S3. Kita perlu mengganti panggilan itu dengan panggilan ke PersistenceService
objek. Kami menggunakan injeksi ketergantungan untuk meneruskan kami PersistenceService
ke objek. Penting untuk tidak meminta S3PersistenceService
, tetapi untuk meminta PersistenceService
. Ini memungkinkan kami untuk menukar implementasi selama pengujian kami.
Semua kode yang digunakan untuk menggunakan API S3 secara langsung sekarang menggunakan kode kami PersistenceService
, dan kode kami S3PersistenceService
sekarang membuat semua panggilan ke API S3. Dalam pengujian kami, kami dapat mengejek PersistenceService
, karena kami memilikinya, dan menggunakan tiruan itu untuk memastikan bahwa kode kami membuat panggilan yang benar. Tapi sekarang tinggal bagaimana cara menguji S3PersistenceService
. Ini memiliki masalah yang sama seperti sebelumnya: kami tidak dapat mengujinya tanpa memanggil ke layanan eksternal. Jadi ... kita tidak mengujinya. Kita bisa mengejek dependensi S3 API, tetapi ini akan memberi kita sedikit tambahan atau tidak ada kepercayaan tambahan. Sebagai gantinya, kami harus mengujinya di tingkat yang lebih tinggi: tes integrasi.
Ini mungkin terdengar agak mengganggu mengatakan bahwa kita seharusnya tidak menguji bagian dari kode kita, tetapi mari kita lihat apa yang telah kita capai. Kami memiliki banyak kode di semua tempat kami tidak dapat menguji unit yang sekarang dapat diuji melalui unit PersistenceService
. Kami memiliki kekacauan perpustakaan pihak ketiga kami terbatas pada kelas implementasi tunggal. Kelas itu harus menyediakan fungsionalitas yang diperlukan untuk menggunakan API, tetapi tidak memiliki logika bisnis eksternal yang menyertainya. Oleh karena itu, setelah ditulis, itu harus sangat stabil dan tidak banyak berubah. Kita dapat mengandalkan tes yang lebih lambat yang tidak sering kita jalankan karena kodenya stabil.
Langkah selanjutnya adalah menulis tes integrasi untuk S3PersistenceService
. Ini harus dipisahkan dengan nama atau folder sehingga kita dapat menjalankannya secara terpisah dari pengujian unit cepat kami. Tes integrasi sering dapat menggunakan kerangka kerja pengujian yang sama dengan pengujian unit jika kodenya cukup informatif, jadi kita tidak perlu mempelajari alat baru. Kode aktual untuk tes integrasi adalah apa yang akan Anda tulis untuk Opsi 1 Anda.