Jaminan Kualitas Perangkat Lunak Sumber Terbuka (OSS) - Studi Kasus Milvus
Gambar sampul depan
Artikel ini ditulis oleh Wenxing Zhu dan disadur oleh Angela Ni.
Jaminan kualitas (QA) adalah proses sistematis untuk menentukan apakah suatu produk atau layanan memenuhi persyaratan tertentu. Sistem QA adalah bagian tak terpisahkan dari proses R&D karena, seperti namanya, sistem ini memastikan kualitas produk.
Tulisan ini memperkenalkan kerangka kerja QA yang diadopsi dalam mengembangkan basis data vektor Milvus, yang bertujuan untuk memberikan panduan bagi pengembang dan pengguna yang berkontribusi untuk berpartisipasi dalam proses tersebut. Ini juga akan mencakup modul pengujian utama di Milvus serta metode dan alat yang dapat dimanfaatkan untuk meningkatkan efisiensi pengujian QA.
Langsung ke:
- Pengenalan umum terhadap sistem QA Milvus
- Modul-modul pengujian di Milvus
- Alat dan metode untuk efisiensi QA yang lebih baik
Pengenalan umum terhadap sistem QA Milvus
Arsitektur sistem sangat penting untuk melakukan pengujian QA. Semakin seorang insinyur QA memahami sistem, semakin besar kemungkinan dia akan menghasilkan rencana pengujian yang masuk akal dan efisien.
Arsitektur Milvus
Milvus 2.0 mengadopsi arsitektur cloud-native, terdistribusi, dan berlapis, dengan SDK sebagai pintu masuk utama bagi data untuk mengalir di Milvus. Pengguna Milvus sangat sering menggunakan SDK, oleh karena itu pengujian fungsional pada sisi SDK sangat dibutuhkan. Selain itu, uji fungsi pada SDK dapat membantu mendeteksi masalah internal yang mungkin ada di dalam sistem Milvus. Selain uji fungsi, jenis pengujian lain juga akan dilakukan pada database vektor, termasuk uji unit, uji penerapan, uji keandalan, uji stabilitas, dan uji kinerja.
Arsitektur cloud-native dan terdistribusi memberikan kemudahan sekaligus tantangan dalam pengujian QA. Tidak seperti sistem yang digunakan dan dijalankan secara lokal, instance Milvus yang digunakan dan dijalankan di cluster Kubernetes dapat memastikan bahwa pengujian perangkat lunak dilakukan dalam kondisi yang sama dengan pengembangan perangkat lunak. Namun, sisi negatifnya adalah kompleksitas arsitektur terdistribusi membawa lebih banyak ketidakpastian yang dapat membuat pengujian QA sistem menjadi lebih sulit dan berat. Sebagai contoh, Milvus 2.0 menggunakan layanan mikro dari komponen yang berbeda, dan hal ini menyebabkan peningkatan jumlah layanan dan node, serta kemungkinan lebih besar terjadinya kesalahan sistem. Oleh karena itu, rencana QA yang lebih canggih dan komprehensif diperlukan untuk efisiensi pengujian yang lebih baik.
Pengujian QA dan manajemen masalah
QA di Milvus melibatkan pelaksanaan pengujian dan pengelolaan masalah yang muncul selama pengembangan perangkat lunak.
Pengujian QA
Milvus melakukan berbagai jenis pengujian QA sesuai dengan fitur Milvus dan kebutuhan pengguna sesuai dengan urutan prioritas seperti yang ditunjukkan pada gambar di bawah ini.
Prioritas pengujian QA
Pengujian QA dilakukan pada aspek-aspek berikut di Milvus dengan prioritas sebagai berikut:
- Fungsi: Memverifikasi apakah fungsi dan fitur bekerja sesuai dengan rancangan awal.
- Penerapan: Memeriksa apakah pengguna dapat melakukan deployment, menginstal ulang, dan meng-upgrade versi mandiri Mivus dan cluster Milvus dengan metode yang berbeda (Docker Compose, Helm, APT atau YUM, dll.).
- Kinerja: Menguji kinerja penyisipan data, pengindeksan, pencarian vektor, dan kueri di Milvus.
- Stabilitas: Periksa apakah Milvus dapat berjalan dengan stabil selama 5-10 hari di bawah tingkat beban kerja normal.
- Keandalan: Menguji apakah Milvus masih dapat berfungsi sebagian jika terjadi kesalahan sistem tertentu.
- Konfigurasi: Memverifikasi apakah Milvus bekerja seperti yang diharapkan dalam konfigurasi tertentu.
- Kompatibilitas: Menguji apakah Milvus kompatibel dengan berbagai jenis perangkat keras atau perangkat lunak.
Manajemen masalah
Banyak masalah yang mungkin muncul selama pengembangan perangkat lunak. Penulis dari templat masalah dapat berupa insinyur QA sendiri atau pengguna Milvus dari komunitas sumber terbuka. Tim QA bertanggung jawab untuk mencari tahu masalah tersebut.
Alur kerja manajemen isu
Ketika sebuah isu dibuat, isu tersebut akan melalui triase terlebih dahulu. Selama triase, masalah baru akan diperiksa untuk memastikan bahwa rincian masalah yang cukup disediakan. Jika isu tersebut dikonfirmasi, maka isu tersebut akan diterima oleh pengembang dan mereka akan mencoba untuk memperbaiki isu tersebut. Setelah pengembangan selesai, penulis isu perlu memverifikasi apakah isu tersebut sudah diperbaiki. Jika ya, isu tersebut akan ditutup.
Kapan QA dibutuhkan?
Salah satu kesalahpahaman umum adalah bahwa QA dan pengembangan tidak bergantung satu sama lain. Namun, kenyataannya adalah untuk memastikan kualitas sistem, diperlukan upaya dari pengembang dan insinyur QA. Oleh karena itu, QA perlu dilibatkan di seluruh siklus hidup.
Siklus hidup QA
Seperti yang ditunjukkan pada gambar di atas, siklus hidup R&D perangkat lunak yang lengkap mencakup tiga tahap.
Pada tahap awal, pengembang mempublikasikan dokumentasi desain sementara insinyur QA membuat rencana pengujian, menentukan kriteria rilis, dan menetapkan tugas QA. Pengembang dan insinyur QA harus terbiasa dengan dokumen desain dan rencana pengujian sehingga pemahaman bersama tentang tujuan rilis (dalam hal fitur, kinerja, stabilitas, konvergensi bug, dll.) Dibagikan di antara kedua tim.
Selama R&D, pengembangan dan pengujian QA sering berinteraksi untuk mengembangkan dan memverifikasi fitur dan fungsi, serta memperbaiki bug dan masalah yang dilaporkan oleh komunitas sumber terbuka.
Pada tahap akhir, jika kriteria rilis terpenuhi, citra Docker baru dari versi Milvus yang baru akan dirilis. Sebuah catatan rilis yang berfokus pada fitur-fitur baru dan bug yang telah diperbaiki serta tag rilis diperlukan untuk rilis resmi. Kemudian tim QA juga akan mempublikasikan laporan pengujian pada rilis ini.
Modul pengujian di Milvus
Ada beberapa modul pengujian di Milvus dan bagian ini akan menjelaskan setiap modul secara rinci.
Unit test
Uji coba unit
Unit test dapat membantu mengidentifikasi bug perangkat lunak pada tahap awal dan memberikan kriteria verifikasi untuk restrukturisasi kode. Menurut kriteria penerimaan pull request (PR) Milvus, cakupan uji unit kode harus 80%.
Uji fungsi
Uji fungsi di Milvus terutama diatur di sekitar PyMilvus dan SDK. Tujuan utama dari uji fungsi adalah untuk memverifikasi apakah antarmuka dapat bekerja seperti yang dirancang. Uji fungsi memiliki dua aspek:
- Menguji apakah SDK dapat mengembalikan hasil yang diharapkan ketika parameter yang benar diberikan.
- Menguji apakah SDK dapat menangani kesalahan dan mengembalikan pesan kesalahan yang wajar ketika parameter yang salah diberikan.
Gambar di bawah ini menggambarkan kerangka kerja saat ini untuk uji fungsi yang didasarkan pada kerangka kerja pytest arus utama. Kerangka kerja ini menambahkan pembungkus ke PyMilvus dan memberdayakan pengujian dengan antarmuka pengujian otomatis.
Uji fungsi
Mempertimbangkan metode pengujian bersama diperlukan dan beberapa fungsi perlu digunakan kembali, kerangka kerja pengujian di atas diadopsi, daripada menggunakan antarmuka PyMilvus secara langsung. Modul "cek" juga disertakan dalam kerangka kerja untuk memberikan kemudahan dalam verifikasi nilai yang diharapkan dan nilai aktual.
Sebanyak 2.700 kasus uji fungsi dimasukkan ke dalam direktori tests/python_client/testcases
, yang mencakup hampir semua antarmuka PyMilvus. Uji fungsi ini secara ketat mengawasi kualitas setiap PR.
Uji penyebaran
Milvus hadir dalam dua mode: mandiri dan cluster. Dan ada dua cara utama untuk men-deploy Milvus: menggunakan Docker Compose atau Helm. Dan setelah men-deploy Milvus, pengguna juga dapat memulai ulang atau meningkatkan layanan Milvus. Ada dua kategori utama dari uji coba penyebaran: uji coba restart dan uji coba peningkatan.
Restart test mengacu pada proses pengujian persistensi data, yaitu apakah data masih tersedia setelah restart. Upgrade test mengacu pada proses pengujian kompatibilitas data untuk mencegah situasi di mana format data yang tidak kompatibel dimasukkan ke dalam Milvus. Kedua jenis uji penerapan ini memiliki alur kerja yang sama seperti yang diilustrasikan pada gambar di bawah ini.
Uji penyebaran
Dalam uji coba restart, kedua deployment menggunakan citra docker yang sama. Namun dalam pengujian peningkatan, deployment pertama menggunakan citra docker dari versi sebelumnya sedangkan deployment kedua menggunakan citra docker dari versi yang lebih baru. Hasil pengujian dan data disimpan dalam file Volumes
atau persistent volume claim (PVC).
Ketika menjalankan pengujian pertama, beberapa koleksi dibuat dan operasi yang berbeda dilakukan pada masing-masing koleksi. Ketika menjalankan pengujian kedua, fokus utamanya adalah memverifikasi apakah koleksi yang dibuat masih tersedia untuk operasi CRUD, dan apakah koleksi baru dapat dibuat lebih lanjut.
Uji keandalan
Pengujian keandalan sistem terdistribusi cloud-native biasanya menggunakan metode chaos engineering yang bertujuan untuk mengatasi kesalahan dan kegagalan sistem sejak awal. Dengan kata lain, dalam uji coba chaos engineering, kami sengaja menciptakan kegagalan sistem untuk mengidentifikasi masalah dalam uji tekanan dan memperbaiki kegagalan sistem sebelum benar-benar mulai menimbulkan bahaya. Selama uji kekacauan di Milvus, kami memilih Chaos Mesh sebagai alat untuk menciptakan kekacauan. Ada beberapa jenis kegagalan yang perlu dibuat:
- Pod kill: simulasi skenario di mana node mati.
- Kegagalan pod: Menguji jika salah satu pod node pekerja gagal apakah seluruh sistem masih dapat terus bekerja.
- Memory stress: simulasi konsumsi memori dan sumber daya CPU yang berat dari node kerja.
- Partisi jaringan: Karena Milvus memisahkan penyimpanan dari komputasi, sistem ini sangat bergantung pada komunikasi antara berbagai komponen. Simulasi skenario di mana komunikasi antara pod yang berbeda dipartisi diperlukan untuk menguji saling ketergantungan komponen Milvus yang berbeda.
Uji keandalan
Gambar di atas menunjukkan kerangka kerja uji reliabilitas di Milvus yang dapat mengotomatiskan uji kekacauan. Alur kerja uji reliabilitas adalah sebagai berikut:
- Inisialisasi cluster Milvus dengan membaca konfigurasi penerapan.
- Ketika cluster sudah siap, jalankan
test_e2e.py
untuk menguji apakah fitur-fitur Milvus sudah tersedia. - Jalankan
hello_milvus.py
untuk menguji persistensi data. Buat koleksi bernama "hello_milvus" untuk penyisipan data, flush, pembuatan indeks, pencarian vektor, dan kueri. Koleksi ini tidak akan dirilis atau dihapus selama pengujian. - Buat sebuah objek pemantauan yang akan memulai enam thread yang mengeksekusi operasi create, insert, flush, index, search dan query.
checkers = {
Op.create: CreateChecker(),
Op.insert: InsertFlushChecker(),
Op.flush: InsertFlushChecker(flush=True),
Op.index: IndexChecker(),
Op.search: SearchChecker(),
Op.query: QueryChecker()
}
- Buat pernyataan pertama - semua operasi berhasil seperti yang diharapkan.
- Perkenalkan kegagalan sistem pada Milvus dengan menggunakan Chaos Mesh untuk mem-parsing file yaml yang mendefinisikan kegagalan. Kegagalan dapat berupa mematikan simpul kueri setiap lima detik misalnya.
- Buat pernyataan kedua saat memperkenalkan kegagalan sistem - Menilai apakah hasil yang dikembalikan dari operasi di Milvus selama kegagalan sistem sesuai dengan yang diharapkan.
- Hilangkan kegagalan melalui Chaos Mesh.
- Ketika layanan Milvus telah pulih (yang berarti semua pod telah siap), buat pernyataan ketiga - semua operasi berhasil seperti yang diharapkan.
- Jalankan
test_e2e.py
untuk menguji apakah fitur Milvus tersedia. Beberapa operasi selama kekacauan mungkin diblokir karena pernyataan ketiga. Dan bahkan setelah kekacauan dihilangkan, beberapa operasi mungkin akan terus diblokir, sehingga menghambat pernyataan ketiga untuk berhasil seperti yang diharapkan. Langkah ini bertujuan untuk memfasilitasi pernyataan ketiga dan berfungsi sebagai standar untuk memeriksa apakah layanan Milvus telah pulih. - Jalankan
hello_milvus.py
, muat koleksi yang telah dibuat, dan lakukan operasi CRUP pada koleksi tersebut. Kemudian, periksa apakah data yang ada sebelum kegagalan sistem masih tersedia setelah pemulihan kegagalan. - Kumpulkan log.
Uji stabilitas dan kinerja
Gambar di bawah ini menjelaskan tujuan, skenario pengujian, dan metrik uji stabilitas dan performa.
Uji stabilitas | Uji kinerja | |
---|---|---|
Tujuan | - Memastikan bahwa Milvus dapat bekerja dengan lancar untuk jangka waktu tertentu di bawah beban kerja normal. - Memastikan sumber daya dikonsumsi secara stabil ketika layanan Milvus dimulai. | - Menguji kinerja semua antarmuka Milvus. - Temukan konfigurasi yang optimal dengan bantuan tes kinerja. - Berfungsi sebagai tolok ukur untuk rilis mendatang. - Menemukan hambatan yang menghambat kinerja yang lebih baik. |
Skenario | - Skenario offline read-intensive di mana data hampir tidak diperbarui setelah penyisipan dan persentase pemrosesan setiap jenis permintaan adalah: permintaan pencarian 90%, permintaan penyisipan 5%, lainnya 5%. - Skenario online write-intensive dimana data disisipkan dan dicari secara bersamaan dan persentase pemrosesan setiap jenis permintaan adalah: permintaan sisipkan 50%, permintaan pencarian 40%, lainnya 10%. | - Penyisipan data - Pembuatan indeks - Pencarian vektor |
Metrik | - Penggunaan memori - Konsumsi CPU - Latensi IO - Status pod Milvus - Waktu respons dari layanan Milvus dll. | - Throughput data selama penyisipan data - Waktu yang dibutuhkan untuk membangun indeks - Waktu respons selama pencarian vektor - Kueri per detik (QPS) - Permintaan per detik - Tingkat penarikan kembali dll. |
Uji stabilitas dan uji performa memiliki alur kerja yang sama:
Uji stabilitas dan performa
- Mengurai dan memperbarui konfigurasi, dan menentukan metrik.
server-configmap
berhubungan dengan konfigurasi Milvus standalone atau cluster, sedangkanclient-configmap
berhubungan dengan konfigurasi kasus uji. - Mengkonfigurasi server dan klien.
- Persiapan data
- Meminta interaksi antara server dan klien.
- Melaporkan dan menampilkan metrik.
Alat dan metode untuk efisiensi QA yang lebih baik
Dari bagian pengujian modul, kita dapat melihat bahwa prosedur untuk sebagian besar pengujian sebenarnya hampir sama, terutama melibatkan modifikasi konfigurasi server dan klien Milvus, dan mengoper parameter API. Ketika ada beberapa konfigurasi, semakin bervariasi kombinasi konfigurasi yang berbeda, semakin banyak skenario pengujian yang dapat dicakup oleh eksperimen dan pengujian ini. Hasilnya, penggunaan ulang kode dan prosedur menjadi semakin penting dalam proses peningkatan efisiensi pengujian.
Kerangka kerja pengujian SDK
Kerangka kerja pengujian SDK
Untuk mempercepat proses pengujian, kita dapat menambahkan pembungkus API_request
ke kerangka kerja pengujian asli, dan mengaturnya sebagai sesuatu yang mirip dengan API gateway. API gateway ini akan bertugas mengumpulkan semua permintaan API dan kemudian meneruskannya ke Milvus untuk menerima respons secara kolektif. Tanggapan ini akan diteruskan kembali ke klien setelahnya. Desain seperti ini membuat pengambilan informasi log tertentu seperti parameter, dan hasil yang dikembalikan menjadi lebih mudah. Selain itu, komponen pemeriksa dalam kerangka kerja pengujian SDK dapat memverifikasi dan memeriksa hasil dari Milvus. Dan semua metode pengecekan dapat ditentukan dalam komponen checker ini.
Dengan kerangka kerja pengujian SDK, beberapa proses inisialisasi yang krusial dapat dibungkus dalam satu fungsi. Dengan demikian, potongan besar kode yang membosankan dapat dihilangkan.
Perlu juga dicatat bahwa setiap kasus uji individu terkait dengan koleksi uniknya untuk memastikan isolasi data.
Saat menjalankan kasus uji,pytest-xdist
, ekstensi pytest, dapat dimanfaatkan untuk menjalankan semua kasus uji secara paralel, sehingga sangat meningkatkan efisiensi.
Tindakan GitHub
Tindakan GitHub
GitHub Action juga diadopsi untuk meningkatkan efisiensi QA karena karakteristiknya sebagai berikut:
- Ini adalah alat CI/CD asli yang terintegrasi secara mendalam dengan GitHub.
- Alat ini hadir dengan lingkungan mesin yang dikonfigurasi secara seragam dan alat pengembangan perangkat lunak umum yang sudah diinstal sebelumnya, termasuk Docker, Docker Compose, dll.
- Mendukung berbagai sistem operasi dan versi termasuk Ubuntu, MacOs, Windows-server, dll.
- Memiliki pasar yang menawarkan ekstensi yang kaya dan fungsi-fungsi di luar kotak.
- Matriksnya mendukung pekerjaan yang bersamaan, dan menggunakan kembali alur pengujian yang sama untuk meningkatkan efisiensi
Terlepas dari karakteristik di atas, alasan lain untuk mengadopsi GitHub Action adalah karena uji penyebaran dan uji reliabilitas membutuhkan lingkungan yang independen dan terisolasi. Dan GitHub Action sangat ideal untuk pemeriksaan inspeksi harian pada dataset berskala kecil.
Alat bantu untuk uji tolok ukur
Untuk membuat pengujian QA lebih efisien, sejumlah alat bantu digunakan.
Alat bantu QA
- Argo: seperangkat alat sumber terbuka untuk Kubernetes untuk menjalankan alur kerja dan mengelola cluster dengan menjadwalkan tugas. Alat ini juga dapat menjalankan beberapa tugas secara paralel.
- Dasbor Kubernetes: antarmuka pengguna Kubernetes berbasis web untuk memvisualisasikan
server-configmap
danclient-configmap
. - NAS: Network attached storage (NAS) adalah server penyimpanan data komputer tingkat file untuk menyimpan dataset benchmark ANN yang umum.
- InfluxDB dan MongoDB: Basis data untuk menyimpan hasil tes benchmark.
- Grafana: Solusi analitik dan pemantauan sumber terbuka untuk memantau metrik sumber daya server dan metrik kinerja klien.
- Redash: Layanan yang membantu memvisualisasikan data Anda dan membuat bagan untuk pengujian benchmark.
Tentang Seri Deep Dive
Dengan pengumuman resmi ketersediaan umum Milvus 2.0, kami menyusun seri blog Milvus Deep Dive ini untuk memberikan interpretasi mendalam tentang arsitektur dan kode sumber Milvus. Topik-topik yang dibahas dalam seri blog ini meliputi:
- Pengenalan umum terhadap sistem QA Milvus
- Modul pengujian di Milvus
- Alat dan metode untuk efisiensi QA yang lebih baik
- Tentang Seri Deep Dive
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word