Library Klien Cloud untuk Rust menyediakan cara untuk melakukan stub pada implementasi klien yang sebenarnya, sehingga Anda dapat memasukkan tiruan untuk pengujian. Anda dapat menggunakan tiruan untuk menulis pengujian unit yang terkontrol dan andal yang tidak melakukan panggilan jaringan atau menimbulkan biaya yang ditagih.
Dalam dokumen ini, Anda akan mempelajari topik berikut:
- Cara menulis antarmuka yang dapat diuji menggunakan klien
StorageCloud Storage. - Cara membuat tiruan operasi baca.
- Cara membuat tiruan operasi tulis.
- Alasan desain klien
Storageberbeda dengan klien Google Cloud lainnya.
Dependensi
Tambahkan library klien Cloud Storage ke file Cargo.toml Anda:
cargo add google-cloud-storage
Untuk mengompilasi dan menjalankan pengujian unit dalam dokumen ini, tambahkan dependensi pengembangan berikut:
cargo add --dev anyhow bytes mockall
cargo add --dev tokio --features macros,rt-multi-thread
Menulis antarmuka yang dapat diuji
Jika tidak menguji unit kode penyimpanan, Anda dapat menulis antarmuka secara langsung dalam hal Storage, yang parameter jenis stub default-nya adalah implementasi produksi klien:
Untuk menguji kode Anda dengan klien tiruan, tulis antarmuka Anda dalam hal
parameter jenis generik T yang dibatasi oleh gcs::stub::Storage + 'static:
Operasi baca tiruan
Untuk membuat tiruan permintaan read_object, selesaikan langkah-langkah berikut:
Tulis fungsi aplikasi yang menggunakan klien
&Storage<T>generik. Misalnya, fungsi berikut mendownload objek dan menghitung jumlah karakter baris baru yang ada di dalamnya:Buat fungsi bantuan yang membuat aliran byte
ReadObjectResponsepalsu dengan meneruskan payload keReadObjectResponse::from_source. Metode ini menerima jenis payload yang sama denganStorage::write_object:Tentukan struct tiruan yang mengimplementasikan
gcs::stub::Storage. Dokumen ini menggunakan cratemockall, meskipun Anda dapat menggunakan framework tiruan yang berbeda dalam pengujian:Tulis pengujian unit yang menetapkan ekspektasi pada tiruan, buat klien menggunakan
Storage::from_stub, dan panggilcount_newlines:
Operasi tulis tiruan
Untuk membuat tiruan permintaan write_object, selesaikan langkah-langkah berikut:
Tulis fungsi aplikasi yang mengupload objek menggunakan klien
&Storage<T>generik:Dengan menggunakan struct
MockStorageyang ditentukan di bagian sebelumnya, tulis pengujian unit yang mengonfigurasi ekspektasi pada tiruan, membuat klien menggunakanStorage::from_stub, dan memanggilupload:
Detail ekspektasi
Karena fungsi upload memanggil send_unbuffered, tetapkan ekspektasi pada
metode expect_write_object_unbuffered yang sesuai:
Makro mockall::mock! memperlakukan setiap pembuatan instance generik sebagai metode yang berbeda. Tentukan jenis payload konkret, Payload<BytesSource>, dalam
tanda tangan closure sehingga compiler dapat mencocokkan ekspektasi metode:
Alasan desain
Bagian berikut menjelaskan alasan klien Storage menggunakan parameter jenis generik untuk stub-nya, bukan pengiriman dinamis.
Klien lainnya
Sebagian besar klien, seperti StorageControl, menyimpan implementasi trait stub yang dihitung referensi (Arc) dan kompatibel dengan dyn secara internal. Mereka menggunakan
pengiriman dinamis untuk meneruskan permintaan dari klien ke stub yang mendasarinya,
yang dapat berupa implementasi produksi atau tiruan.
Karena klien ini menggunakan pengiriman dinamis, compiler tidak perlu menyelesaikan jenis stub konkret pada waktu kompilasi, dan struct klien tidak memerlukan parameter jenis generik untuk stub-nya.
Klien Storage
Di Rust, trait yang kompatibel dengan dyn tidak boleh memiliki metode generik atau menampilkan nilai impl Future yang tidak di-unboxing:
- Metode
write_object_buffereddanwrite_object_unbufferedbersifat generik pada jenis sumber payload. - Metode trait
gcs::stub::Storagemenampilkanimpl Futuresecara langsung, bukan mem-boxing future yang ditampilkan.
Menggunakan pengiriman dinamis untuk klien Storage akan memerlukan payload boxing
dan future pada setiap panggilan, sehingga menambahkan alokasi heap dan overhead pengiriman dinamis
pada jalur data. Untuk menghindari overhead ini, klien Storage menggunakan
parameter jenis untuk implementasi konkret dari karakteristik gcs::stub::Storage.
Kode aplikasi dan suite pengujian lengkap
Kode berikut menggabungkan fungsi aplikasi dan pengujian unit menjadi contoh yang lengkap:
Jalankan cargo test untuk mengeksekusi test_count_lines dan test_upload:
cargo test