Was ist Parallelitätstest beim Softwaretest?

⚡ Intelligente Zusammenfassung

Durch Parallelitätstests werden Fehler aufgedeckt, die nur dann auftreten, wenn mehrere Benutzer gleichzeitig auf dieselbe Anwendung zugreifen. Dadurch werden Deadlocks, verlorene Aktualisierungen und Sperrprobleme sichtbar, die bei sequenziellen Funktionsprüfungen nie erkannt werden.

  • 👥 Auch genannt: Tests mit mehreren Benutzern, da der Auslöser der gleichzeitige Zugriff und nicht nur ein hohes Datenvolumen ist.
  • 🎯 Was es anstrebt: Gemeinsam genutzte Datenbankeinträge, gemeinsam genutzte Module und gemeinsam genutzter Anwendungscode, auf die von mehr als einer Sitzung zugegriffen wird.
  • 🔒 Was es misst: Stufen von Deadlocks, Sperren, Single-Thread-Code und eingeschränktem Zugriff auf gemeinsam genutzte Ressourcen.
  • 🧭 Und so läuft es: Identifizieren Sie Datenflüsse, die zu gleichzeitigen Zugriffen führen können, legen Sie ein Ziel für die gleichzeitige Nutzung fest, skripten Sie konkrete Aktionen und erhöhen Sie dann die Anzahl der Benutzer schrittweise.
  • 🐞 Fehlerklassen: Wettlaufsituationen, Deadlocks, verlorene Aktualisierungen, Datenbeschädigung und Thread-Starving.
  • ⚠️ Ehrliche Grenzen: Nichtdeterministisches Verhalten, asynchrone Rückruffunktionen und ein nichtssagender Aufrufstapel erschweren die Reproduktion von Fehlern.

Was versteht man unter Parallelitätstests bei Softwaretests mit mehreren gleichzeitigen Benutzern?

Was ist Parallelitätstest?

Parallelitätstests ist eine Testmethode, die dazu dient, Fehler in einer Anwendung zu erkennen, wenn mehrere Benutzer gleichzeitig angemeldet sind. Anders ausgedrückt: Sie überwacht die Auswirkungen, während mehrere Benutzer dieselbe Aktion gleichzeitig ausführen.

Parallelitätstests werden auch als MehrbenutzertestsDas Testen eines nebenläufigen Programms ist aufgrund von Nichtdeterminismus und Synchronisationsproblemen anspruchsvoller als das Testen eines sequenziellen Programms: Derselbe Test kann bei einem Durchlauf erfolgreich sein und beim nächsten fehlschlagen, ohne dass sich eine einzige Codezeile geändert hat.

Das folgende Diagramm veranschaulicht die Idee – mehrere Benutzer greifen gleichzeitig auf dieselbe Anwendungsressource zu, und der Test beobachtet, wie die Anwendung mit der Überschneidung umgeht.

Diagramm zum Testen der Parallelität, das zeigt, wie mehrere Benutzer gleichzeitig auf dieselbe Anwendungsressource zugreifen.

Warum Parallelitätstests

Zwei Fragen rechtfertigen den Aufwand, und beide sind für Einzelbenutzer-Funktionsläufe unsichtbar.

  • Es ermittelt die Auswirkungen des gleichzeitigen Zugriffs auf dieselben Datenbankeinträge, Module oder denselben Anwendungscode.
  • Es identifiziert und misst das Ausmaß von Deadlocks, Sperren, der Verwendung von Single-Thread-Code und des eingeschränkten Zugriffs auf gemeinsam genutzte Ressourcen.

Eine Funktion kann für einen Benutzer vollständig korrekt funktionieren und dennoch Daten für den zweiten Benutzer verlieren, der eine Millisekunde später eintrifft. Aus diesem Grund wird diese Technik neben anderen Verfahren eingesetzt. Leistungstest anstatt innerhalb von Funktionstests.

Wie man Parallelitätstests durchführt

Parallelitätstests folgen einer wiederholbaren Abfolge. Die folgenden Schritte bewegen sich von scoping zur Auflösung.

  • Schritt 1) ​​Identifizieren Sie Datenflüsse, die anfällig für Parallelität sind. Achten Sie auf gemeinsame Status: gleichzeitige Anmeldungen, Sitz- oder Aktienreservierungen, Aktualisierungen des Kontostands, Batch-Jobs, die in dieselbe Tabelle schreiben, und alle Single-Thread-Komponenten im Pfad.
  • Schritt 2) Legen Sie ein Ziel für die Parallelität fest. Entscheiden Sie, wie viele Nutzer gleichzeitig aktiv werden müssen, und zwar anhand realer Nutzungsspitzen anstatt einer gerundeten Zahl.
  • Schritt 3) Entwerfen Sie die Testfälle. . Der Testfall Verknüpft die gemeinsame Ressource, die konkurrierenden Aktionen und den erwarteten Endzustand – zum Beispiel dürfen nicht beide Sitzungen erfolgreich sein, die von einem Konto abheben.
  • Schritt 4) Skript erstellen und das Werkzeug auswählen. Es wird ein Lastgenerator benötigt, der konfigurierbare virtuelle Benutzer erzeugt; JMeter ist die gängige Open-Source-Wahl, und ihre Thread-Gruppeneinstellungen lassen sich direkt auf Parallelitätsszenarien abbilden.
  • Schritt 5) Ramp schrittweise. Erhöhen Sie die Anzahl gleichzeitiger Nutzer schrittweise anstatt sprunghaft.ping zum Ziel, sodass die Ebene, auf der die Auseinandersetzung beginnt, sichtbar ist.
  • Schritt 6) Überwachen und analysieren. Achten Sie auf Wartezeiten bei Sperren, Streuung der Antwortzeiten, Fehlerraten und Datenbankblockierungen gleichzeitig – ein Fehler in der Parallelverarbeitung zeigt sich oft zuerst als Zeitanomalie, bevor er sich als Fehler bemerkbar macht.
  • Schritt 7) Beheben und erneut ausführen. Beheben Sie die Ursache für ein Problem mit der Synchronisierung, der Indizierung oder der Sperrung und wiederholen Sie dann den gleichen Durchlauf, um zu bestätigen, dass sich das Verhalten geändert und nicht nur verschoben hat.

Häufige Fehler bei der Parallelverarbeitung

Fehler in der Parallelverarbeitung lassen sich in eine kleine Anzahl erkennbarer Klassen einteilen, und die korrekte Benennung der Klasse führt in der Regel direkt zur Lösung.

Defekt Was ist loss Typisches Symptom
Race Bedingung Das Ergebnis hängt davon ab, welche Sitzung zuerst beendet wurde. Bei einigen Läufen stimmen die Summen, bei anderen nicht.
Deadlock Zwei Sitzungen halten jeweils ein Schloss, das die andere benötigt Transaktionen hängen sich auf, anstatt einen Fehler zurückzugeben.
Verlorenes Update Ein zweiter Schreibvorgang überschreibt den ersten, ohne ihn zu lesen. Gespeichertes Wechselgeld verschwindet stillschweigend.
Datenkorruption Eine gemeinsame Struktur wird nur teilweise geschrieben Datensätze in einem Zustand, der keine gültige Transaktion erstellen konnte
Verhungern Eine Sitzung erhält niemals die Ressource, auf die sie wartet. Ein einzelner Benutzerpfad ist aufgrund eines Timeouts ausgefallen, obwohl das System scheinbar einwandfrei funktioniert.

Da diese Fehler nur sporadisch auftreten, müssen bei jedem Lauf Protokolle und Zeitstempel erfasst werden; andernfalls kann der Fehler nicht glaubwürdig gemeldet werden. Fehlermanagementprozess.

Beispiel für Parallelitätstests

Stellen Sie sich einen Online-Shop vor, der das letzte Exemplar eines Produkts auf Lager hat. Zwei Kunden öffnen den Artikel gleichzeitig und drücken beide auf „Klicken“. Kaufen.

  • Szenario: Zwei Sitzungen lesen den Lagerbestand = 1, beide bestehen die Verfügbarkeitsprüfung und schreiben den Lagerbestand auf 0.
  • Erwartetes Ergebnis: Eine Bestellung wird bestätigt, die andere erhält eine Meldung, dass der Artikel nicht vorrätig ist, und der Lagerbestand wird niemals negativ.
  • Fehlerindikator: Beide Aufträge werden bestätigt, oder der Lagerbestand landet bei -1, was zeigt, dass die Verfügbarkeitsprüfung und die Dekrementierung nicht als ein einziger atomarer Schritt ausgeführt werden.
  • Varianten, die es wert sind, ausprobiert zu werden: In zwei Sitzungen wird ein Profildatensatz bearbeitet, dieselbe Anfrage wird zweimal genehmigt, und während ein Benutzer speichert, aktualisiert ein Batch-Job die Tabelle.

Das gleiche Muster lässt sich verallgemeinern: Es wird eine Ressource und zwei Autoren gefunden, ohne Garantie auf die Reihenfolge. Das Szenario wird ausgeführt während Systemtests, bevor Last hinzugefügt wird, hält die Diagnose sauber.

Vorteile von Parallelitätstests

  • Dadurch wird der Aufwand für das Testen einer Anwendung relativ reduziert, indem der Umfang der gleichzeitigen Interaktionen auf wenige, weit verbreitete und gut getestete Komponenten beschränkt wird.
  • Durch die Kapselung kann das Verhalten eines Teils eines Programms analysiert werden, ohne die gesamte Codebasis überprüfen zu müssen.
  • Es trägt zur Verbesserung der Zuverlässigkeit und Robustheit paralleler Programme bei.
  • Es deckt Sperr- und Blockierungsgrenzen frühzeitig auf, sodass Kapazitätsentscheidungen auf gemessener Auslastung und nicht auf Schätzungen beruhen.

Nachteile von Parallelitätstests

Die folgenden Nachteile treten typischerweise bei Testern während der Durchführung von Parallelitätstests auf.

  • Die Anwendung muss auf mehreren Plattformen getestet werden.
  • Parallelverarbeitungsszenarien erfordern intensivere Tests als sequentielle Szenarien.
  • Funktionen geben ihr Ergebnis nicht sofort an den Aufrufer zurück; stattdessen kann das Ergebnis später über Benachrichtigungen, Blöcke, Rückruffunktionen oder ähnliche Mechanismen übermittelt werden, was das Testen erschwert.
  • Der Informations- oder Programmfluss wird nicht im Aufrufstapel widergespiegelt.
  • Die Anzahl der Ausführungspfade im System kann extrem groß sein, da die Prozesse in einem nebenläufigen System während ihrer Ausführung miteinander interagieren.
  • Parallele Programme weisen eine höhere Ausfallrate auf als sequentielle Programme.
  • Das Debuggen von parallelen Programmen ist schwierig, da das Anhängen eines Debuggers den Zeitpunkt verändert, der den Fehler verursacht hat.

Häufig gestellte Fragen

Nein. Lastprüfung Das Testen misst das Verhalten unter erwarteter Last über einen bestimmten Zeitraum. Da Parallelitätstests auf denselben Zeitpunkt abzielen, kann ein Fehler bereits bei zwei Benutzern auftreten, wenn beide auf denselben Datensatz zugreifen.

Die Multithread-Hälfte von Thread-Test Überschneidet sich damit. Thread-Tests prüfen, ob ein Geschäftsprozess die Integration übersteht; Parallelitätstests prüfen, was der gleichzeitige Zugriff bewirkt, sobald dieser Prozess bereits funktioniert.

Ermitteln Sie den Wert anhand der beobachteten Spitzennutzung, nicht anhand eines gerundeten Wertes. Beginnen Sie mit zwei Sitzungen, um die Atomarität der Logik zu beweisen, und steigern Sie die Nutzung dann bis zum gemessenen Spitzenwert und einem Sicherheitsabstand darüber hinaus.

Maschinelle Lernmodelle ordnen Module anhand ihrer Fehlerhistorie und der Komplexität gemeinsam genutzter Zustände und weisen Tester so auf die Abläufe hin, die bei Überlappungen am ehesten zu Fehlern führen. Durch Log-Clustering über wiederholte Testläufe hinweg wird anschließend die Verschachtelung isoliert, die jedem Fehler vorausging.

GitHub-Copilot Erstellt schnell Entwürfe für virtuelle Benutzerskripte, Barrieren und Assertionshilfsfunktionen. Der Tester definiert weiterhin, welche Ressource gemeinsam genutzt wird und wie der korrekte Endzustand aussieht, da generierte Tests selten eine echte Überschneidung erzwingen.

Isolationsstufe, Sperrzeitlimit, Verbindungspoolgröße und Indizierung beeinflussen das Auftreten von Konflikten. Protokollieren Sie diese Werte bei jedem Durchlauf, da ein Ergebnis unter einer Isolationsstufe keine Aussagekraft über eine andere hat.

Wiederholen Sie das gleiche Szenario mehrmals mit sauberen Daten, protokollieren Sie die Vorgänge mit Zeitstempel und verringern Sie das Zeitfenster zwischen den beiden konkurrierenden Aktionen. Das Hinzufügen eines Debuggers kann den Fehler oft verschleiern, indem es das Timing verändert.

Ja, bei volumenabhängigen Konflikten. Kleine Tabellen ermöglichen es der Datenbank, alle Daten im Arbeitsspeicher zu halten und kurzzeitig zu sperren, sodass Blockierungen im Produktivbetrieb unbemerkt bleiben. Die Zeilenanzahl und Indexgröße sollten so genau wie möglich an die Umgebung angepasst werden.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: