Assurance qualité des logiciels libres - Une étude de cas de Milvus
Image de couverture
Cet article a été rédigé par Wenxing Zhu et transcrit par Angela Ni.
L'assurance qualité (AQ) est un processus systématique visant à déterminer si un produit ou un service répond à certaines exigences. Un système d'AQ est un élément indispensable du processus de R&D car, comme son nom l'indique, il garantit la qualité du produit.
Ce billet présente le cadre d'AQ adopté dans le développement de la base de données vectorielles Milvus, dans le but de fournir une ligne directrice aux développeurs et utilisateurs contributeurs pour qu'ils participent au processus. Il couvrira également les principaux modules de test de Milvus ainsi que les méthodes et outils qui peuvent être utilisés pour améliorer l'efficacité des tests d'assurance qualité.
Aller à :
- Introduction générale au système d'assurance qualité Milvus
- Modules de test dans Milvus
- Outils et méthodes pour une meilleure efficacité de l'AQ
Introduction générale au système d'assurance qualité Milvus
L'architecture du système est essentielle à la réalisation des tests d'assurance qualité. Plus un ingénieur AQ est familiarisé avec le système, plus il a de chances de proposer un plan de test raisonnable et efficace.
Architecture de Milvus
Milvus 2.0 adopte une architecture en nuage, distribuée et en couches, le SDK étant l'entrée principale pour le flux de données dans Milvus. Les utilisateurs de Milvus exploitent très fréquemment le SDK, d'où la nécessité d'effectuer des tests fonctionnels du côté du SDK. En outre, les tests fonctionnels sur le SDK peuvent aider à détecter les problèmes internes qui peuvent exister dans le système Milvus. Outre les tests fonctionnels, d'autres types de tests seront également effectués sur la base de données vectorielle, notamment des tests unitaires, des tests de déploiement, des tests de fiabilité, des tests de stabilité et des tests de performance.
Une architecture distribuée et native pour l'informatique en nuage présente à la fois des avantages et des inconvénients pour les tests d'assurance qualité. Contrairement aux systèmes déployés et exécutés localement, une instance Milvus déployée et exécutée sur un cluster Kubernetes peut garantir que les tests de logiciels sont effectués dans les mêmes circonstances que le développement de logiciels. Cependant, l'inconvénient est que la complexité de l'architecture distribuée apporte plus d'incertitudes qui peuvent rendre les tests d'assurance qualité du système encore plus difficiles et ardus. Par exemple, Milvus 2.0 utilise des microservices de différents composants, ce qui entraîne une augmentation du nombre de services et de nœuds, ainsi qu'une plus grande possibilité d'erreur du système. Par conséquent, un plan d'assurance qualité plus sophistiqué et plus complet est nécessaire pour améliorer l'efficacité des tests.
Tests AQ et gestion des problèmes
L'AQ dans Milvus implique à la fois la réalisation de tests et la gestion des problèmes apparus au cours du développement du logiciel.
Tests d'AQ
Milvus effectue différents types de tests AQ en fonction des fonctionnalités de Milvus et des besoins des utilisateurs, par ordre de priorité, comme le montre l'image ci-dessous.
Priorité des tests AQ
Les tests d'assurance qualité sont menés sur les aspects suivants dans Milvus, selon l'ordre de priorité suivant :
- Fonction: Vérifier si les fonctions et les caractéristiques fonctionnent comme elles ont été conçues à l'origine.
- Déploiement: Vérifier si un utilisateur peut déployer, réinstaller et mettre à niveau la version autonome de Mivus et le cluster Milvus avec différentes méthodes (Docker Compose, Helm, APT ou YUM, etc.).
- Performance: Tester les performances de l'insertion de données, de l'indexation, de la recherche vectorielle et de la requête dans Milvus.
- Stabilité: Vérifier si Milvus peut fonctionner de manière stable pendant 5 à 10 jours avec une charge de travail normale.
- Fiabilité: Tester si Milvus peut encore fonctionner partiellement en cas d'erreur système.
- Configuration: Vérifier si Milvus fonctionne comme prévu dans une certaine configuration.
- Compatibilité: Tester si Milvus est compatible avec différents types de matériel ou de logiciel.
Gestion des problèmes
De nombreux problèmes peuvent apparaître au cours du développement d'un logiciel. Les auteurs de ces problèmes peuvent être des ingénieurs AQ ou des utilisateurs de Milvus issus de la communauté des logiciels libres. L'équipe d'assurance qualité est chargée de résoudre les problèmes.
Flux de travail de la gestion des problèmes
Lorsqu'un problème est créé, il passe d'abord par le triage. Lors du triage, les nouveaux problèmes sont examinés afin de s'assurer qu'ils sont suffisamment détaillés. Si le problème est confirmé, il sera accepté par les développeurs qui tenteront de le résoudre. Une fois le développement terminé, l'auteur du problème doit vérifier si le problème est résolu. Si c'est le cas, le problème sera finalement clôturé.
Quand l'AQ est-elle nécessaire ?
Une idée fausse très répandue est que l'AQ et le développement sont indépendants l'un de l'autre. En réalité, pour garantir la qualité du système, des efforts sont nécessaires de la part des développeurs et des ingénieurs chargés de l'assurance qualité. C'est pourquoi l'assurance qualité doit être impliquée tout au long du cycle de vie.
Cycle de vie de l'AQ
Comme le montre la figure ci-dessus, le cycle de vie complet de la R&D d'un logiciel comprend trois étapes.
Au cours de la phase initiale, les développeurs publient la documentation relative à la conception, tandis que les ingénieurs AQ élaborent des plans de test, définissent les critères de diffusion et assignent les tâches d'AQ. Les développeurs et les ingénieurs chargés de l'assurance qualité doivent connaître à la fois la documentation de conception et le plan de test afin que les deux équipes aient une compréhension mutuelle de l'objectif de la version (en termes de fonctionnalités, de performances, de stabilité, de convergence des bogues, etc.
Pendant la R&D, les équipes de développement et d'assurance qualité interagissent fréquemment pour développer et vérifier les caractéristiques et les fonctions, et pour corriger les bogues et les problèmes signalés par la communauté des logiciels libres.
Au cours de l'étape finale, si les critères de publication sont remplis, une nouvelle image Docker de la nouvelle version de Milvus sera publiée. Une note de publication mettant l'accent sur les nouvelles fonctionnalités et les bogues corrigés ainsi qu'une étiquette de publication sont nécessaires pour la publication officielle. Ensuite, l'équipe d'assurance qualité publiera également un rapport de test sur cette version.
Modules de test dans Milvus
Il existe plusieurs modules de test dans Milvus et cette section explique chaque module en détail.
Test d'unité
Test d'unité
Les tests unitaires peuvent aider à identifier les bogues logiciels à un stade précoce et fournir un critère de vérification pour la restructuration du code. Selon les critères d'acceptation des pull requests (PR) de Milvus, la couverture des tests unitaires du code doit être de 80 %.
Test de fonction
Les tests de fonction dans Milvus sont principalement organisés autour de PyMilvus et des SDK. L'objectif principal des tests de fonction est de vérifier si les interfaces peuvent fonctionner comme prévu. Les tests de fonction ont deux facettes :
- Tester si les SDK peuvent renvoyer les résultats attendus lorsque des paramètres corrects sont transmis.
- Tester si les SDK peuvent gérer les erreurs et renvoyer des messages d'erreur raisonnables lorsque des paramètres incorrects sont transmis.
La figure ci-dessous illustre le cadre actuel des tests de fonctions, qui est basé sur le cadre général pytest. Ce cadre ajoute une enveloppe à PyMilvus et renforce les tests avec une interface de test automatisée.
Test de fonction
Considérant qu'une méthode de test partagée est nécessaire et que certaines fonctions doivent être réutilisées, le cadre de test ci-dessus est adopté, plutôt que d'utiliser directement l'interface PyMilvus. Un module "check" est également inclus dans le cadre pour faciliter la vérification des valeurs attendues et réelles.
Pas moins de 2 700 cas de test de fonction sont incorporés dans le répertoire tests/python_client/testcases
, couvrant ainsi la quasi-totalité des interfaces PyMilvus. Ces tests de fonction supervisent strictement la qualité de chaque PR.
Test de déploiement
Milvus existe en deux modes : autonome et en grappe. Et il y a deux façons principales de déployer Milvus : en utilisant Docker Compose ou Helm. Après avoir déployé Milvus, les utilisateurs peuvent également redémarrer ou mettre à niveau le service Milvus. Il existe deux catégories principales de tests de déploiement : le test de redémarrage et le test de mise à niveau.
Le test de redémarrage fait référence au processus de test de la persistance des données, c'est-à-dire à la question de savoir si les données sont toujours disponibles après un redémarrage. Le test de mise à niveau concerne le processus de test de la compatibilité des données afin d'éviter les situations où des formats de données incompatibles sont insérés dans Milvus. Les deux types de tests de déploiement partagent le même flux de travail, comme l'illustre l'image ci-dessous.
Test de déploiement
Dans un test de redémarrage, les deux déploiements utilisent la même image Docker. Cependant, dans un test de mise à niveau, le premier déploiement utilise une image Docker d'une version précédente tandis que le second déploiement utilise une image Docker d'une version ultérieure. Les résultats des tests et les données sont enregistrés dans le fichier Volumes
ou dans la revendication de volume persistant (PVC).
Lors de l'exécution du premier test, plusieurs collections sont créées et des opérations différentes sont effectuées sur chacune d'entre elles. Lors de l'exécution du deuxième test, l'objectif principal est de vérifier si les collections créées sont toujours disponibles pour les opérations CRUD et si de nouvelles collections peuvent être créées.
Test de fiabilité
Les tests de fiabilité des systèmes distribués natifs du cloud adoptent généralement une méthode d'ingénierie du chaos dont l'objectif est de tuer dans l'œuf les erreurs et les défaillances du système. En d'autres termes, dans un test d'ingénierie du chaos, nous créons délibérément des défaillances du système afin d'identifier les problèmes dans les tests de pression et de corriger les défaillances du système avant qu'elles ne commencent vraiment à poser des problèmes. Lors d'un test de chaos à Milvus, nous choisissons Chaos Mesh comme outil pour créer un chaos. Il y a plusieurs types de défaillances à créer :
- Pod kill: une simulation du scénario où les nœuds sont en panne.
- Pod failure: Tester si l'un des nœuds de travail tombe en panne et si l'ensemble du système peut continuer à fonctionner.
- Memory stress: simulation d'une forte consommation de mémoire et de ressources CPU par les nœuds de travail.
- Partition du réseau: Étant donné que Milvus sépare le stockage de l'informatique, le système repose fortement sur la communication entre les différents composants. Une simulation du scénario dans lequel la communication entre les différents pods est partitionnée est nécessaire pour tester l'interdépendance des différents composants de Milvus.
Test de fiabilité
La figure ci-dessus illustre le cadre de test de fiabilité de Milvus qui permet d'automatiser les tests de chaos. Le déroulement d'un test de fiabilité est le suivant :
- Initialiser un cluster Milvus en lisant les configurations de déploiement.
- Lorsque le cluster est prêt, exécuter
test_e2e.py
pour tester si les fonctionnalités de Milvus sont disponibles. - Exécuter
hello_milvus.py
pour tester la persistance des données. Créer une collection nommée "hello_milvus" pour l'insertion de données, la vidange, la construction d'index, la recherche vectorielle et l'interrogation. Cette collection ne sera ni libérée ni abandonnée pendant le test. - Créez un objet de surveillance qui démarrera six threads exécutant les opérations de création, d'insertion, de vidage, d'index, de recherche et d'interrogation.
checkers = {
Op.create: CreateChecker(),
Op.insert: InsertFlushChecker(),
Op.flush: InsertFlushChecker(flush=True),
Op.index: IndexChecker(),
Op.search: SearchChecker(),
Op.query: QueryChecker()
}
- Faire la première assertion - toutes les opérations sont réussies comme prévu.
- Introduire une défaillance du système dans Milvus en utilisant Chaos Mesh pour analyser le fichier yaml qui définit la défaillance. Une défaillance peut consister à tuer le nœud de requête toutes les cinq secondes, par exemple.
- Faire la deuxième affirmation lors de l'introduction d'une défaillance du système - Juger si les résultats renvoyés des opérations dans Milvus lors d'une défaillance du système correspondent aux attentes.
- Éliminer la défaillance via Chaos Mesh.
- Lorsque le service Milvus est rétabli (ce qui signifie que tous les pods sont prêts), faire la troisième affirmation - toutes les opérations sont réussies comme prévu.
- Exécuter
test_e2e.py
pour tester si les fonctionnalités Milvus sont disponibles. Certaines des opérations effectuées pendant le chaos peuvent être bloquées en raison de la troisième assertion. Et même après l'élimination du chaos, certaines opérations peuvent continuer à être bloquées, ce qui empêche la troisième affirmation d'aboutir comme prévu. Cette étape vise à faciliter la troisième assertion et sert de norme pour vérifier si le service Milvus s'est rétabli. - Exécutez
hello_milvus.py
, chargez la collection créée et effectuez des opérations CRUP sur la collection. Ensuite, vérifiez si les données existant avant la défaillance du système sont toujours disponibles après la récupération de la défaillance. - Collectez les journaux.
Test de stabilité et de performance
La figure ci-dessous décrit les objectifs, les scénarios de test et les mesures des tests de stabilité et de performance.
Test de stabilité | Test de performance | |
---|---|---|
Objectifs | - S'assurer que Milvus peut fonctionner sans problème pendant une période déterminée dans le cadre d'une charge de travail normale. - S'assurer que les ressources sont consommées de manière stable lorsque le service Milvus démarre. | - Tester les performances de toutes les interfaces Milvus. - Trouver la configuration optimale à l'aide des tests de performance. - Servir de référence pour les versions futures. - Trouver le goulot d'étranglement qui entrave l'amélioration des performances. |
Scénarios | - Scénario de lecture intensive hors ligne où les données sont à peine mises à jour après leur insertion et où le pourcentage de traitement de chaque type de demande est le suivant : demande de recherche 90 %, demande d'insertion 5 %, autres 5 %. - Scénario en ligne à forte intensité d'écriture où les données sont insérées et recherchées simultanément et où le pourcentage de traitement de chaque type de demande est : demande d'insertion 50 %, demande de recherche 40 %, autres 10 %. | - Insertion de données - Construction d'un index - Recherche vectorielle |
Métriques | - Utilisation de la mémoire - Consommation de l'unité centrale - Latence IO - Statut des pods Milvus - Temps de réponse du service Milvus etc. | - Débit de données pendant l'insertion des données - Le temps nécessaire à la construction d'un index - Temps de réponse lors d'une recherche vectorielle - Requête par seconde (QPS) - Requête par seconde - Taux de rappel etc. |
Le test de stabilité et le test de performance partagent le même ensemble de flux de travail :
Test de stabilité et de performance
- Analyse et mise à jour des configurations, et définition des mesures. Le site
server-configmap
correspond à la configuration de Milvus autonome ou en grappe, tandis que le siteclient-configmap
correspond aux configurations des cas de test. - Configurer le serveur et le client.
- Préparation des données
- Demande d'interaction entre le serveur et le client.
- Rapport et affichage des métriques.
Outils et méthodes pour une meilleure efficacité de l'assurance qualité
La section sur les tests de modules montre que la procédure pour la plupart des tests est en fait presque la même, impliquant principalement la modification des configurations du serveur et du client Milvus et le passage de paramètres API. Lorsqu'il existe plusieurs configurations, plus la combinaison des différentes configurations est variée, plus ces expériences et ces tests peuvent couvrir de scénarios de test. Par conséquent, la réutilisation des codes et des procédures est d'autant plus essentielle au processus d'amélioration de l'efficacité des tests.
Cadre de test SDK
Cadre de test SDK
Pour accélérer le processus de test, nous pouvons ajouter un wrapper API_request
au cadre de test original et le définir comme quelque chose de similaire à la passerelle API. Cette passerelle API sera chargée de collecter toutes les demandes API et de les transmettre à Milvus pour recevoir collectivement les réponses. Ces réponses seront ensuite renvoyées au client. Une telle conception facilite la capture de certaines informations de journal telles que les paramètres et les résultats renvoyés. En outre, le composant de vérification du cadre de test SDK peut vérifier et examiner les résultats de Milvus. Toutes les méthodes de vérification peuvent être définies dans ce composant de vérification.
Avec le cadre de test SDK, certains processus d'initialisation cruciaux peuvent être regroupés en une seule fonction. Ce faisant, de grandes parties de codes fastidieux peuvent être éliminées.
Il convient également de noter que chaque cas de test individuel est lié à une collection unique afin de garantir l'isolation des données.
Lors de l'exécution des cas de test,pytest-xdist
, l'extension pytest, peut être utilisée pour exécuter tous les cas de test individuels en parallèle, ce qui augmente considérablement l'efficacité.
Action GitHub
Action GitHub
GitHub Action est également adopté pour améliorer l'efficacité de l'assurance qualité en raison de ses caractéristiques suivantes :
- Il s'agit d'un outil CI/CD natif profondément intégré à GitHub.
- Il est livré avec un environnement machine configuré de manière uniforme et des outils de développement de logiciels courants préinstallés, notamment Docker, Docker Compose, etc.
- Il prend en charge plusieurs systèmes d'exploitation et versions, notamment Ubuntu, MacOs, Windows-server, etc.
- Il dispose d'une place de marché qui offre de riches extensions et des fonctions prêtes à l'emploi.
- Sa matrice prend en charge les tâches concurrentes et la réutilisation du même flux de test pour améliorer l'efficacité.
Outre les caractéristiques ci-dessus, une autre raison d'adopter GitHub Action est que les tests de déploiement et les tests de fiabilité nécessitent un environnement indépendant et isolé. Et GitHub Action est idéal pour les contrôles quotidiens sur des ensembles de données à petite échelle.
Outils pour les tests de référence
Un certain nombre d'outils sont utilisés pour rendre les tests d'assurance qualité plus efficaces.
Outils d'assurance qualité
- Argo: un ensemble d'outils open-source pour Kubernetes permettant d'exécuter des flux de travail et de gérer des clusters en planifiant des tâches. Il peut également permettre d'exécuter plusieurs tâches en parallèle.
- Tableau de bord Kubernetes: interface utilisateur Kubernetes basée sur le web pour visualiser
server-configmap
etclient-configmap
. - NAS: Le stockage en réseau (NAS) est un serveur de stockage de données informatiques au niveau des fichiers pour conserver les ensembles de données de référence ANN courants.
- InfluxDB et MongoDB: bases de données pour la sauvegarde des résultats des tests de référence.
- Grafana: Une solution open-source d'analyse et de surveillance pour surveiller les métriques de ressources du serveur et les métriques de performance du client.
- Redash: Un service qui aide à visualiser vos données et à créer des graphiques pour les tests de référence.
À propos de la série Deep Dive
Avec l'annonce officielle de la disponibilité générale de Milvus 2.0, nous avons orchestré cette série de blogs Milvus Deep Dive afin de fournir une interprétation approfondie de l'architecture et du code source de Milvus. Les sujets abordés dans cette série de blogs sont les suivants
- Introduction générale au système d'assurance qualité Milvus
- Modules de test dans Milvus
- Outils et méthodes pour une meilleure efficacité de l'assurance qualité
- À propos de la série 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