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.
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.
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.

