Wat is gelijktijdigheidstesten bij het testen van software?

โšก Slimme samenvatting

Gelijktijdigheidstesten detecteren defecten die pas aan het licht komen wanneer meerdere gebruikers tegelijkertijd met dezelfde applicatie werken. Hierdoor worden deadlocks, gemiste updates en vergrendelingsproblemen blootgelegd die sequentiรซle functionele controles nooit aan het licht brengen.

  • ๐Ÿ‘ฅ Ook wel genoemd: Testen met meerdere gebruikers, omdat de trigger gelijktijdige toegang is en niet alleen een hoog volume.
  • ๐ŸŽฏ Doelgroep: Gedeelde databasegegevens, gedeelde modules en gedeelde applicatiecode die door meer dan รฉรฉn sessie worden benaderd.
  • ๐Ÿ”’ Wat het meet: Niveaus van deadlock, vergrendeling, single-threaded code en beperkte toegang tot gedeelde resources.
  • ๐Ÿงญ Hoe het werkt: Identificeer processen die gevoelig zijn voor gelijktijdigheid, stel een doel voor gelijktijdigheid in, programmeer de daadwerkelijke acties en laat gebruikers vervolgens stapsgewijs meer taken uitvoeren.
  • ๐Ÿž Defectcategorieรซn: Racecondities, deadlocks, verloren updates, gegevenscorruptie en thread-starvation.
  • โš ๏ธ Eerlijke grenzen: Niet-determinisme, asynchrone callbacks en een onduidelijke aanroepstack maken het moeilijk om fouten te reproduceren.

Wat is gelijktijdigheidstesten bij softwaretesten met meerdere gelijktijdige gebruikers?

Wat is gelijktijdigheidstesten?

Gelijktijdigheidstesten Dit is een testtechniek die wordt gebruikt om defecten in een applicatie te detecteren wanneer meerdere gebruikers zijn ingelogd. Met andere woorden, het monitort het effect wanneer meerdere gebruikers tegelijkertijd dezelfde actie uitvoeren.

Concurrency testing wordt ook wel aangeduid als testen met meerdere gebruikersHet testen van een parallel programma is lastiger dan het testen van een sequentieel programma, vanwege niet-determinisme en synchronisatieproblemen: dezelfde test kan bij de ene uitvoering slagen en bij de volgende mislukken zonder dat er ook maar รฉรฉn regel code is gewijzigd.

Het onderstaande diagram illustreert het idee: meerdere gebruikers hebben op hetzelfde moment toegang tot dezelfde applicatiebron, en de test observeert wat de applicatie met deze overlapping doet.

Diagram voor gelijktijdigheidstesten, waarin meerdere gebruikers tegelijkertijd toegang hebben tot dezelfde applicatiebron.

Waarom gelijktijdigheidstesten?

Twee vragen rechtvaardigen de inspanning, en beide zijn onzichtbaar bij functionele tests door รฉรฉn gebruiker.

  • Het identificeert de effecten van gelijktijdige toegang tot dezelfde databasegegevens, modules of applicatiecode.
  • Het identificeert en meet de mate van deadlocking, vergrendeling, het gebruik van single-threaded code en beperkte toegang tot gedeelde resources.

Een functie kan voor de ene gebruiker volledig correct zijn, maar toch gegevens missen voor de tweede gebruiker die een milliseconde later arriveert. Daarom wordt deze techniek naast andere technieken gebruikt. prestatie testen in plaats van binnen functionele tests.

Hoe voer je gelijktijdigheidstesten uit?

Gelijktijdigheidstesten volgen een herhaalbare volgorde. De onderstaande stappen gaan van begin tot eind.ping tot resolutie.

  • Stap 1) Identificeer processen die gevoelig zijn voor gelijktijdige toegang. Zoek naar gedeelde statusinformatie: gelijktijdige aanmeldingen, stoel- of aandelenreserveringen, saldo-updates, batchtaken die naar dezelfde tabel schrijven en elk component in het pad dat slechts รฉรฉn thread gebruikt.
  • Stap 2) Stel een gelijktijdigheidsdoel in. Bepaal hoeveel gebruikers tegelijkertijd moeten handelen, gebaseerd op werkelijke pieken in het gebruik in plaats van een rond getal.
  • Stap 3) Ontwerp de testgevallen. Elke testcase koppelt de gedeelde bron, de concurrerende acties en de verwachte eindtoestand aan elkaar โ€” bijvoorbeeld, twee sessies die geld opnemen van รฉรฉn rekening mogen niet allebei succesvol zijn.
  • Stap 4) Script en selecteer het gereedschap. Een loadgenerator die configureerbare virtuele gebruikers aanmaakt is vereist; JMeter is de meest gangbare open-source keuze, en de instellingen voor threadgroepen sluiten direct aan op gelijktijdigheidsscenario's.
  • Stap 5) Ramp stapsgewijs. Verhoog het aantal gelijktijdige gebruikers stapsgewijs in plaats van in รฉรฉn keer.ping naar het doel, zodat het niveau waarop de strijd begint zichtbaar is.
  • Stap 6) Monitoren en analyseren. Houd de wachttijden voor vergrendelingen, de spreiding van de responstijd, de foutpercentages en de blokkering van de database in de gaten โ€” een gelijktijdigheidsprobleem uit zich vaak eerst als een timingafwijking voordat het als een fout zichtbaar wordt.
  • Stap 7) Los het probleem op en voer het opnieuw uit. Los de synchronisatie-, indexerings- of vergrendelingsfout op en herhaal dezelfde test om te bevestigen dat het gedrag is veranderd in plaats van verplaatst.

Veelvoorkomende gelijktijdigheidsfouten

Gelijktijdigheidsfouten vallen in een klein aantal herkenbare categorieรซn, en het correct benoemen van de categorie wijst meestal direct naar de oplossing.

Defect Wat gebeurt Typisch symptoom
Raceconditie Het resultaat hangt af van welke sessie als eerste is afgerond. De totalen kloppen bij sommige runs, bij andere niet.
impasse Twee sessies houden elk een slot vast dat de ander nodig heeft. Transacties blijven hangen in plaats van een foutmelding te geven.
Verloren update Een tweede schrijfbewerking overschrijft de eerste zonder deze te lezen. Een opgeslagen wijziging verdwijnt geruisloos.
Data corruptie Een gedeelde structuur is slechts gedeeltelijk geschreven. Records in een staat waarin geen geldige transactie kon worden aangemaakt.
uithongering Een sessie krijgt nooit de bron waarop ze wacht. Een enkel gebruikerspad loopt vast door een time-out, terwijl het systeem er ogenschijnlijk goed uitziet.

Omdat deze storingen zich af en toe voordoen, moeten bij elke uitvoering logbestanden en tijdstempels worden vastgelegd; anders kan het defect niet op een geloofwaardige manier worden gemeld. defectbeheerproces.

Voorbeeld van gelijktijdigheidstesten

Stel je voor dat een webwinkel het laatste exemplaar van een product op voorraad heeft. Twee klanten openen het product op hetzelfde moment en drukken allebei op de knop om af te rekenen. Kopen.

  • Scenario: Twee sessies lezen voorraad = 1, beide slagen voor de beschikbaarheidscontrole en beide schrijven voorraad = 0.
  • Verwacht resultaat: De ene bestelling wordt bevestigd, de andere ontvangt een melding dat het product niet op voorraad is, en de voorraad raakt nooit onder nul.
  • Defectindicator: Beide orders worden bevestigd, of de voorraad komt uit op -1, wat aantoont dat de beschikbaarheidscontrole en de afname niet als รฉรฉn atomische stap worden uitgevoerd.
  • Variaties die de moeite waard zijn om uit te proberen: Dezelfde twee sessies bewerken รฉรฉn profielrecord, twee goedkeuringen van hetzelfde verzoek en een batchtaak die de tabel bijwerkt terwijl een gebruiker opslaat.

Hetzelfde patroon is in het algemeen van toepassing: vind รฉรฉn bron, twee schrijvers en geen garantie voor de volgorde. Het scenario uitvoeren tijdens systeem testenDit zorgt ervoor dat de diagnose schoon blijft voordat er belasting wordt toegevoegd.

Voordelen van gelijktijdigheidstesten

  • Het vermindert de benodigde inspanning voor het testen van een applicatie aanzienlijk door de reikwijdte van gelijktijdige interacties te beperken tot een paar veelgebruikte, goed geteste componenten.
  • Encapsulatie maakt het mogelijk om het gedrag van een deel van een programma te analyseren zonder de volledige codebase te hoeven bekijken.
  • Het helpt de betrouwbaarheid en robuustheid van gelijktijdige programma's te verbeteren.
  • Het brengt de vergrendelings- en blokkeringslimieten vroegtijdig aan het licht, waardoor capaciteitsbeslissingen gebaseerd zijn op gemeten concurrentie in plaats van op schattingen.

Nadelen van gelijktijdigheidstesten

De onderstaande nadelen worden doorgaans ondervonden door testers tijdens het uitvoeren van gelijktijdigheidstesten.

  • De applicatie moet op meerdere platformen worden getest.
  • Scenario's met gelijktijdige uitvoering vereisen intensievere tests dan scenario's met sequentiรซle uitvoering.
  • Functies geven hun resultaat niet direct terug aan de aanroeper; in plaats daarvan kan het resultaat later worden geleverd via notificaties, codeblokken, callbackfuncties of vergelijkbare mechanismen, wat het testen lastiger maakt.
  • De informatie- of programmastroom wordt niet weerspiegeld in de call-stack.
  • Het aantal uitvoeringspaden in het systeem kan extreem groot zijn, omdat de processen in een gelijktijdig systeem met elkaar interageren tijdens hun uitvoering.
  • Gelijktijdige programma's hebben een hoger faalpercentage dan sequentiรซle programma's.
  • Het debuggen van gelijktijdige programma's is lastig, omdat het koppelen van een debugger de timing verandert die de fout veroorzaakte.

Veelgestelde vragen

Nee. Load testen Het meet gedrag onder de verwachte belasting over tijd. Gelijktijdigheidstesten richten zich op hetzelfde moment, waardoor een defect kan optreden als slechts twee gebruikers hetzelfde gedeelde record bewerken.

De multithread-helft van draadtesten Het overlapt ermee. Thread-testen onderzoeken of een bepaald bedrijfspad de integratie overleeft; gelijktijdigheidstesten onderzoeken wat er gebeurt bij gelijktijdige toegang zodra dat pad al functioneert.

Leid het getal af van het waargenomen piekgebruik, niet van een afgerond getal. Begin met twee sessies om te bewijzen dat de logica atomair is, en bouw het vervolgens op naar de gemeten piek en een marge daarboven.

Machine learning-modellen rangschikken modules op basis van hun eerdere defectgeschiedenis en de complexiteit van gedeelde statussen, waardoor testers worden gewezen op de processen die het meest waarschijnlijk zullen falen bij overlapping. Logclustering over herhaalde uitvoeringen isoleert vervolgens de verweving die aan elke fout voorafging.

GitHub-copiloot Hiermee kunnen snel scripts voor virtuele gebruikers, barriรจres en assertiehulpmiddelen worden opgesteld. De tester bepaalt echter nog steeds welke bron wordt gedeeld en wat de juiste eindtoestand is, aangezien gegenereerde tests zelden een daadwerkelijke overlapping afdwingen.

Het isolatieniveau, de time-out voor vergrendelingen, de grootte van de verbindingspool en de indexering hebben allemaal invloed op hoe concurrentie zich manifesteert. Noteer deze waarden bij elke uitvoering, omdat een resultaat verkregen onder รฉรฉn isolatieniveau niets zegt over een ander niveau.

Herhaal hetzelfde scenario vele malen vanuit een schone datatoestand, houd logboeken bij met tijdstempels en verklein de tijdspanne tussen de twee concurrerende acties. Het koppelen van een debugger maskeert de fout vaak door de timing te veranderen.

Ja, voor volumegevoelige conflicten. Kleine tabellen zorgen ervoor dat de database alles in het geheugen kan bewaren en slechts kortstondig vergrendelt, waardoor blokkeringen die in productie optreden onzichtbaar blijven. Stem het aantal rijen en de indexgroottes zo goed mogelijk op elkaar af, rekening houdend met de omgeving.

Vat dit bericht samen met: