Qualitätssicherung für Open-Source-Software (OSS) - eine Fallstudie von Milvus
Titelbild
Dieser Artikel wurde von Wenxing Zhu geschrieben und von Angela Ni umgeschrieben.
Qualitätssicherung (QS) ist ein systematischer Prozess, mit dem festgestellt wird, ob ein Produkt oder eine Dienstleistung bestimmte Anforderungen erfüllt. Ein QS-System ist ein unverzichtbarer Bestandteil des F&E-Prozesses, da es, wie der Name schon sagt, die Qualität des Produkts sicherstellt.
In diesem Beitrag wird der QS-Rahmen vorgestellt, der bei der Entwicklung der Vektordatenbank Milvus angewandt wurde, um Entwicklern und Benutzern einen Leitfaden für die Teilnahme an diesem Prozess zu bieten. Außerdem werden die wichtigsten Testmodule in Milvus sowie Methoden und Werkzeuge vorgestellt, die zur Verbesserung der Effizienz von QA-Tests eingesetzt werden können.
Springen Sie zu:
- Eine allgemeine Einführung in das Milvus QA-System
- Testmodule in Milvus
- Werkzeuge und Methoden für eine bessere QA-Effizienz
Eine allgemeine Einführung in das Milvus QA System
Die Systemarchitektur ist entscheidend für die Durchführung von QA-Tests. Je besser ein QA-Ingenieur mit dem System vertraut ist, desto eher wird er oder sie einen vernünftigen und effizienten Testplan erstellen.
Milvus-Architektur
Milvus 2.0 verwendet eine cloud-native, verteilte und mehrschichtige Architektur, wobei das SDK der Haupteingang für den Datenfluss in Milvus ist. Die Milvus-Benutzer nutzen das SDK sehr häufig, daher sind Funktionstests auf der SDK-Seite sehr wichtig. Außerdem können Funktionstests für das SDK dabei helfen, interne Probleme zu erkennen, die innerhalb des Milvus-Systems auftreten könnten. Neben den Funktionstests werden auch andere Arten von Tests für die Vektordatenbank durchgeführt, darunter Unit-Tests, Deployment-Tests, Zuverlässigkeitstests, Stabilitätstests und Leistungstests.
Eine Cloud-native und verteilte Architektur bringt sowohl Vorteile als auch Herausforderungen für QA-Tests mit sich. Im Gegensatz zu Systemen, die lokal bereitgestellt und ausgeführt werden, kann eine Milvus-Instanz, die auf einem Kubernetes-Cluster bereitgestellt und ausgeführt wird, sicherstellen, dass Softwaretests unter den gleichen Bedingungen wie die Softwareentwicklung durchgeführt werden. Der Nachteil ist jedoch, dass die Komplexität der verteilten Architektur mehr Unwägbarkeiten mit sich bringt, die das QA-Testen des Systems noch schwieriger und anstrengender machen können. Milvus 2.0 verwendet zum Beispiel Microservices aus verschiedenen Komponenten, was zu einer größeren Anzahl von Diensten und Knoten führt und die Möglichkeit eines Systemfehlers erhöht. Folglich ist ein ausgefeilterer und umfassenderer QA-Plan für eine bessere Testeffizienz erforderlich.
QA-Tests und Problemmanagement
Die Qualitätssicherung in Milvus umfasst sowohl die Durchführung von Tests als auch die Verwaltung von Problemen, die während der Softwareentwicklung auftreten.
QA-Prüfungen
Milvus führt verschiedene Arten von QA-Tests durch, je nach den Funktionen von Milvus und den Bedürfnissen der Benutzer in der Reihenfolge ihrer Priorität, wie in der folgenden Abbildung dargestellt.
Priorität der QA-Tests
QA-Tests werden in Milvus zu den folgenden Aspekten mit der folgenden Priorität durchgeführt:
- Funktion: Überprüfen, ob die Funktionen und Merkmale wie ursprünglich geplant funktionieren.
- Einsatz: Prüfen, ob ein Benutzer sowohl die Mivus-Standalone-Version als auch den Milvus-Cluster mit verschiedenen Methoden (Docker Compose, Helm, APT oder YUM usw.) bereitstellen, neu installieren und aktualisieren kann.
- Leistung: Testen Sie die Leistung von Dateneinfügung, Indexierung, Vektorsuche und Abfrage in Milvus.
- Stabilität: Prüfen Sie, ob Milvus bei normaler Arbeitslast 5-10 Tage lang stabil läuft.
- Verlässlichkeit: Testen Sie, ob Milvus bei bestimmten Systemfehlern noch teilweise funktionieren kann.
- Konfiguration: Überprüfen Sie, ob Milvus unter einer bestimmten Konfiguration wie erwartet funktioniert.
- Kompatibilität: Testen Sie, ob Milvus mit verschiedenen Arten von Hardware oder Software kompatibel ist.
Problembehandlung
Während der Softwareentwicklung können viele Probleme auftauchen. Der Autor dieser Probleme kann ein QA-Ingenieur oder ein Milvus-Benutzer aus der Open-Source-Community sein. Das QA-Team ist für die Behebung der Probleme verantwortlich.
Arbeitsablauf der Problemverwaltung
Wenn ein Issue erstellt wird, durchläuft es zunächst die Triage. Während der Triage werden neue Probleme untersucht, um sicherzustellen, dass ausreichende Details zu den Problemen bereitgestellt werden. Wenn das Problem bestätigt wird, wird es von den Entwicklern akzeptiert, die dann versuchen, das Problem zu beheben. Sobald die Entwicklung abgeschlossen ist, muss der Problemautor überprüfen, ob das Problem behoben ist. Wenn ja, wird das Problem endgültig geschlossen.
Wann wird QA benötigt?
Ein weit verbreiteter Irrglaube ist, dass QA und Entwicklung unabhängig voneinander sind. Die Wahrheit ist jedoch, dass die Qualität des Systems nur dann gewährleistet werden kann, wenn sowohl die Entwickler als auch die QA-Ingenieure daran mitarbeiten. Daher muss die Qualitätssicherung während des gesamten Lebenszyklus einbezogen werden.
QA-Lebenszyklus
Wie in der obigen Abbildung dargestellt, umfasst ein vollständiger Software-F&E-Lebenszyklus drei Phasen.
In der Anfangsphase veröffentlichen die Entwickler die Entwurfsdokumentation, während die QS-Ingenieure Testpläne ausarbeiten, Freigabekriterien festlegen und QS-Aufgaben zuweisen. Entwickler und QS-Ingenieure müssen sowohl mit der Entwurfsdokumentation als auch mit dem Testplan vertraut sein, damit beide Teams ein gemeinsames Verständnis vom Ziel der Veröffentlichung (in Bezug auf Funktionen, Leistung, Stabilität, Fehlerkonvergenz usw.) haben.
Während der Forschungs- und Entwicklungsphase arbeiten Entwicklung und Qualitätssicherung häufig zusammen, um Funktionen und Merkmale zu entwickeln und zu überprüfen sowie Fehler und Probleme zu beheben, die von der Open-Source-Gemeinschaft gemeldet werden.
In der letzten Phase wird, wenn die Freigabekriterien erfüllt sind, ein neues Docker-Image der neuen Milvus-Version freigegeben. Für die offizielle Freigabe sind eine Release-Note mit den neuen Funktionen und behobenen Fehlern sowie ein Release-Tag erforderlich. Dann wird das QA-Team auch einen Testbericht zu dieser Version veröffentlichen.
Testmodule in Milvus
Es gibt mehrere Testmodule in Milvus und dieser Abschnitt wird jedes Modul im Detail erklären.
Einzeltest
Einzeltest
Unit-Tests können dabei helfen, Softwarefehler in einem frühen Stadium zu identifizieren und ein Prüfkriterium für die Umstrukturierung des Codes zu liefern. Gemäß den Milvus-Pull-Request (PR)-Akzeptanzkriterien sollte der Abdeckungsgrad von Code-Unit-Tests 80% betragen.
Funktionstest
Funktionstests in Milvus sind hauptsächlich um PyMilvus und SDKs herum organisiert. Der Hauptzweck von Funktionstests besteht darin, zu überprüfen, ob die Schnittstellen wie vorgesehen funktionieren. Funktionstests haben zwei Facetten:
- Testen, ob SDKs die erwarteten Ergebnisse zurückgeben können, wenn die richtigen Parameter übergeben werden.
- Testen, ob SDKs mit Fehlern umgehen können und angemessene Fehlermeldungen zurückgeben, wenn falsche Parameter übergeben werden.
Die Abbildung unten zeigt das aktuelle Framework für Funktionstests, das auf dem Mainstream-Framework pytest basiert. Dieses Framework fügt einen Wrapper zu PyMilvus hinzu und ermöglicht das Testen mit einer automatisierten Testschnittstelle.
Funktionstest
In Anbetracht der Tatsache, dass eine gemeinsame Testmethode benötigt wird und einige Funktionen wiederverwendet werden müssen, wird das obige Test-Framework übernommen, anstatt die PyMilvus-Schnittstelle direkt zu verwenden. Ein "Check"-Modul ist ebenfalls in das Framework integriert, um die Überprüfung der erwarteten und tatsächlichen Werte zu erleichtern.
Im Verzeichnis tests/python_client/testcases
sind 2.700 Funktionstests enthalten, die fast alle PyMilvus-Schnittstellen vollständig abdecken. Diese Funktionstests überwachen streng die Qualität jedes PR.
Einsatztest
Milvus gibt es in zwei Modi: Standalone und Cluster. Und es gibt zwei Hauptwege, Milvus einzusetzen: mit Docker Compose oder Helm. Nach der Bereitstellung von Milvus können Benutzer den Milvus-Dienst auch neu starten oder aktualisieren. Es gibt zwei Hauptkategorien von Bereitstellungstests: Neustarttest und Upgrade-Test.
Der Neustarttest bezieht sich auf den Prozess des Testens der Datenpersistenz, d.h. ob die Daten nach einem Neustart noch verfügbar sind. Der Upgrade-Test bezieht sich auf die Prüfung der Datenkompatibilität, um zu verhindern, dass inkompatible Datenformate in Milvus eingefügt werden. Die beiden Arten von Deployment-Tests haben den gleichen Arbeitsablauf, wie in der folgenden Abbildung dargestellt.
Bereitstellungstest
Bei einem Neustarttest verwenden die beiden Deployments das gleiche Docker-Image. Bei einem Upgrade-Test hingegen verwendet die erste Bereitstellung ein Docker-Image einer früheren Version, während die zweite Bereitstellung ein Docker-Image einer späteren Version verwendet. Die Testergebnisse und Daten werden in der Datei Volumes
oder im Persistent Volume Claim (PVC) gespeichert.
Bei der Durchführung des ersten Tests werden mehrere Sammlungen erstellt und für jede Sammlung werden unterschiedliche Operationen durchgeführt. Beim zweiten Test wird vor allem geprüft, ob die erstellten Sammlungen noch für CRUD-Operationen zur Verfügung stehen und ob neue Sammlungen erstellt werden können.
Zuverlässigkeitsüberprüfung
Bei Tests zur Zuverlässigkeit von Cloud-nativen verteilten Systemen wird in der Regel eine Chaos-Engineering-Methode angewandt, die darauf abzielt, Fehler und Systemausfälle im Keim zu ersticken. Mit anderen Worten: Bei einem Chaos-Engineering-Test werden gezielt Systemausfälle erzeugt, um Probleme bei Drucktests zu erkennen und Systemausfälle zu beheben, bevor sie wirklich Schaden anrichten. Bei einem Chaostest in Milvus wählen wir Chaos Mesh als Werkzeug, um ein Chaos zu erzeugen. Es gibt verschiedene Arten von Ausfällen, die erstellt werden müssen:
- Pod-Kill: eine Simulation des Szenarios, bei dem die Knoten ausfallen.
- Pod-Ausfall: Test, ob bei einem Ausfall eines Arbeiterknoten-Pods das gesamte System noch weiterarbeiten kann.
- Speicherstress: eine Simulation des hohen Verbrauchs von Speicher- und CPU-Ressourcen durch die Arbeitsknoten.
- Netzwerk-Partition: Da Milvus die Speicherung von der Datenverarbeitung trennt, hängt das System stark von der Kommunikation zwischen den verschiedenen Komponenten ab. Eine Simulation des Szenarios, bei dem die Kommunikation zwischen verschiedenen Pods partitioniert wird, ist erforderlich, um die Abhängigkeit der verschiedenen Milvus-Komponenten voneinander zu testen.
Zuverlässigkeitstest
Die obige Abbildung zeigt das Framework für Zuverlässigkeitstests in Milvus, mit dem Chaostests automatisiert werden können. Der Arbeitsablauf eines Zuverlässigkeitstests sieht wie folgt aus:
- Initialisieren eines Milvus-Clusters durch Einlesen der Deployment-Konfigurationen.
- Wenn der Cluster bereit ist, führen Sie
test_e2e.py
aus, um zu testen, ob die Milvus-Funktionen verfügbar sind. - Führen Sie
hello_milvus.py
aus, um die Datenpersistenz zu testen. Erstellen Sie eine Sammlung mit dem Namen "hello_milvus" für Dateneinfügung, Flush, Indexaufbau, Vektorsuche und Abfrage. Diese Sammlung wird während des Tests nicht freigegeben oder gelöscht. - Erstellen Sie ein Überwachungsobjekt, das sechs Threads startet, die die Operationen create, insert, flush, index, search und query ausführen.
checkers = {
Op.create: CreateChecker(),
Op.insert: InsertFlushChecker(),
Op.flush: InsertFlushChecker(flush=True),
Op.index: IndexChecker(),
Op.search: SearchChecker(),
Op.query: QueryChecker()
}
- Machen Sie die erste Behauptung - alle Operationen sind wie erwartet erfolgreich.
- Führen Sie einen Systemfehler in Milvus ein, indem Sie Chaos Mesh verwenden, um die yaml-Datei zu parsen, die den Fehler definiert. Ein Fehler kann z.B. das Beenden des Abfrageknotens alle fünf Sekunden sein.
- Machen Sie die zweite Behauptung während der Einführung eines Systemfehlers - Beurteilen Sie, ob die zurückgegebenen Ergebnisse der Operationen in Milvus während eines Systemfehlers den Erwartungen entsprechen.
- Beseitigen Sie den Ausfall über Chaos Mesh.
- Wenn der Milvus-Dienst wiederhergestellt ist (d.h. alle Pods sind bereit), machen Sie die dritte Behauptung - alle Operationen sind wie erwartet erfolgreich.
- Führen Sie
test_e2e.py
aus, um zu testen, ob die Milvus-Funktionen verfügbar sind. Einige der Operationen während des Chaos könnten aufgrund der dritten Behauptung blockiert sein. Und selbst nachdem das Chaos beseitigt ist, könnten einige Vorgänge weiterhin blockiert sein, was den erwarteten Erfolg der dritten Behauptung behindert. Dieser Schritt soll die dritte Behauptung erleichtern und dient als Standard für die Überprüfung, ob sich der Milvus-Dienst erholt hat. - Führen Sie
hello_milvus.py
aus, laden Sie die erstellte Sammlung und führen Sie CRUP-Operationen mit der Sammlung durch. Prüfen Sie dann, ob die Daten, die vor dem Systemausfall vorhanden waren, nach der Wiederherstellung noch verfügbar sind. - Sammeln Sie Protokolle.
Stabilitäts- und Leistungstest
Die folgende Abbildung beschreibt den Zweck, die Testszenarien und die Metriken des Stabilitäts- und Leistungstests.
Stabilitätsprüfung | Leistungstest | |
---|---|---|
Zielsetzung | - Sicherstellen, dass Milvus über einen bestimmten Zeitraum unter normaler Arbeitslast reibungslos funktioniert. - Sicherstellen, dass die Ressourcen beim Starten des Milvus-Dienstes stabil verbraucht werden. | - Testen Sie die Leistung aller Milvus-Schnittstellen. - Finden Sie die optimale Konfiguration mit Hilfe von Leistungstests. - Dienen Sie als Benchmark für zukünftige Versionen. - Finden Sie den Engpass, der eine bessere Leistung behindert. |
Szenarien | - Offline-leseintensives Szenario, bei dem die Daten nach dem Einfügen kaum aktualisiert werden und der Prozentsatz der Verarbeitung jeder Anfrageart wie folgt ist: Suchanfrage 90 %, Einfügeanfrage 5 %, andere 5 %. - Online-Szenario mit hoher Schreibintensität, bei dem Daten gleichzeitig eingefügt und gesucht werden und der Prozentsatz der Verarbeitung jeder Anfrageart wie folgt ist: Einfügeanfrage 50%, Suchanfrage 40%, andere 10%. | - Einfügen von Daten - Indexaufbau - Vektorsuche |
Metriken | - Speicherverbrauch - CPU-Verbrauch - IO-Latenz - Der Status der Milvus-Pods - Antwortzeit des Milvus-Dienstes usw. | - Datendurchsatz beim Einfügen von Daten - Die Zeit, die für den Aufbau eines Index benötigt wird - Antwortzeit während einer Vektorsuche - Abfrage pro Sekunde (QPS) - Abfrage pro Sekunde - Abrufrate usw. |
Für Stabilitäts- und Leistungstests gelten die gleichen Arbeitsabläufe:
Stabilitäts- und Leistungstest
- Parsen und Aktualisieren von Konfigurationen und Definieren von Metriken.
server-configmap
entspricht der Konfiguration von Milvus standalone oder cluster, währendclient-configmap
den Konfigurationen der Testfälle entspricht. - Konfigurieren Sie den Server und den Client.
- Vorbereitung der Daten
- Interaktion zwischen dem Server und dem Client anfordern.
- Bericht und Anzeige von Metriken.
Werkzeuge und Methoden für eine bessere QA-Effizienz
Aus dem Abschnitt über Modultests geht hervor, dass das Verfahren für die meisten Tests nahezu identisch ist und hauptsächlich die Änderung der Milvus-Server- und Client-Konfigurationen sowie die Übergabe von API-Parametern umfasst. Wenn es mehrere Konfigurationen gibt, können diese Experimente und Tests umso mehr Testszenarien abdecken, je vielfältiger die Kombination der verschiedenen Konfigurationen ist. Folglich ist die Wiederverwendung von Codes und Prozeduren umso wichtiger, um die Testeffizienz zu steigern.
SDK-Test-Framework
SDK-Test-Framework
Um den Testprozess zu beschleunigen, können wir dem ursprünglichen Test-Framework einen API_request
Wrapper hinzufügen und ihn als etwas Ähnliches wie das API-Gateway einrichten. Dieses API-Gateway ist für das Sammeln aller API-Anfragen zuständig und leitet sie dann an Milvus weiter, um Antworten zu erhalten. Diese Antworten werden anschließend an den Client zurückgegeben. Ein solches Design macht das Erfassen bestimmter Protokollinformationen wie Parameter und zurückgegebene Ergebnisse viel einfacher. Darüber hinaus kann die Prüfkomponente im SDK-Testframework die Ergebnisse von Milvus verifizieren und untersuchen. Und alle Prüfmethoden können innerhalb dieser Prüfkomponente definiert werden.
Mit dem SDK-Testframework können einige wichtige Initialisierungsprozesse in eine einzige Funktion verpackt werden. Auf diese Weise können große Teile des mühsamen Codes eliminiert werden.
Bemerkenswert ist auch, dass jeder einzelne Testfall mit einer eigenen Sammlung verknüpft ist, um die Datenisolierung zu gewährleisten.
Bei der Ausführung von Testfällen kann die pytest-Erweiterungpytest-xdist
genutzt werden, um alle einzelnen Testfälle parallel auszuführen, was die Effizienz erheblich steigert.
GitHub-Aktion
GitHub-Aktion
GitHub Action wird ebenfalls zur Verbesserung der QA-Effizienz eingesetzt, und zwar aufgrund seiner folgenden Eigenschaften:
- Es ist ein natives CI/CD-Tool, das tief mit GitHub integriert ist.
- Es verfügt über eine einheitlich konfigurierte Maschinenumgebung und vorinstallierte gängige Softwareentwicklungswerkzeuge wie Docker, Docker Compose usw.
- Es unterstützt mehrere Betriebssysteme und Versionen, darunter Ubuntu, MacOs, Windows-Server usw.
- Es verfügt über einen Marktplatz, der umfangreiche Erweiterungen und Out-of-Box-Funktionen bietet.
- Seine Matrix unterstützt gleichzeitige Aufträge und die Wiederverwendung desselben Testablaufs zur Steigerung der Effizienz.
Abgesehen von den oben genannten Eigenschaften ist ein weiterer Grund für den Einsatz von GitHub Action, dass Deployment-Tests und Zuverlässigkeitstests eine unabhängige und isolierte Umgebung erfordern. Und GitHub Action ist ideal für tägliche Inspektionstests auf kleinen Datensätzen.
Tools für Benchmark-Tests
Um QA-Tests effizienter zu gestalten, wird eine Reihe von Tools eingesetzt.
QA-Werkzeuge
- Argo: eine Reihe von Open-Source-Tools für Kubernetes zur Ausführung von Workflows und zur Verwaltung von Clustern durch die Planung von Aufgaben. Es kann auch die parallele Ausführung mehrerer Aufgaben ermöglichen.
- Kubernetes-Dashboard: eine webbasierte Kubernetes-Benutzeroberfläche zur Visualisierung von
server-configmap
undclient-configmap
. - NAS: Network Attached Storage (NAS) ist ein Computer-Datenspeicher auf Dateiebene zur Aufbewahrung gängiger ANN-Benchmark-Datensätze.
- InfluxDB und MongoDB: Datenbanken zur Speicherung der Ergebnisse von Benchmark-Tests.
- Grafana: Eine Open-Source-Analyse- und Überwachungslösung zur Überwachung von Server-Ressourcenmetriken und Client-Leistungsmetriken.
- Redash: Ein Dienst, der bei der Visualisierung Ihrer Daten und der Erstellung von Diagrammen für Benchmark-Tests hilft.
Über die Deep Dive-Serie
Mit der offiziellen Ankündigung der allgemeinen Verfügbarkeit von Milvus 2.0 haben wir diese Milvus-Deep-Dive-Blogserie ins Leben gerufen, um eine tiefgehende Interpretation der Milvus-Architektur und des Quellcodes zu bieten. Die Themen dieser Blogserie umfassen:
- Eine allgemeine Einführung in das Milvus QA System
- Testmodule in Milvus
- Werkzeuge und Methoden für eine bessere QA-Effizienz
- Über die Deep Dive-Serie
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