Hvad er samtidighedstest i softwaretest?

⚡ Smart opsummering

Samtidighedstestning registrerer fejl, der kun opstår, når flere brugere agerer på den samme applikation på samme tid. Dette afslører fastlåste situationer, mistede opdateringer og låseproblemer, som sekventielle funktionstjek aldrig afslører.

  • 👥 Også kaldet: Flerbrugertestning, fordi udløseren er samtidig adgang i stedet for kun stor volumen.
  • 🎯 Hvad den er rettet mod: Delte databaseposter, delte moduler og delt applikationskode, der nås af mere end én session.
  • 🔒 Hvad det måler: Niveauer af deadlocking, låsning, enkelttrådet kode og begrænset adgang til delte ressourcer.
  • 🧭 Sådan kører det: Identificer flows, der er tilbøjelige til samtidighed, angiv et mål for samtidighed, skript reelle handlinger, og forøg derefter brugerne trinvist.
  • 🐞 Defektklasser: Race conditions, fastlåste situationer, mistede opdateringer, datakorruption og trådmangel.
  • ⚠️ Ærlige grænser: Ikke-determinisme, asynkrone callbacks og en uinformativ kaldstak gør det vanskeligt at reproducere fejl.

Hvad er samtidighedstestning i softwaretestning med flere samtidige brugere

Hvad er samtidighedstestning?

Samtidighedstestning er en testteknik, der bruges til at opdage fejl i en applikation, når flere brugere er logget ind. Med andre ord overvåger den effekten, mens flere brugere udfører den samme handling på samme tid.

Samtidighedstestning kaldes også for flerbrugertestningDet er mere udfordrende at teste et samtidig program end et sekventielt program på grund af problemer med ikke-determinisme og synkronisering: den samme test kan bestå i én kørsel og fejle i den næste uden at en eneste kodelinje ændres.

Diagrammet nedenfor illustrerer ideen – flere brugere når den samme applikationsressource på samme tidspunkt, og testen observerer, hvad applikationen gør med overlapningen.

Diagram over samtidighedstestning, der viser flere brugere, der tilgår den samme applikationsressource samtidigt

Hvorfor samtidighedstestning

To spørgsmål retfærdiggør indsatsen, og begge er usynlige for funktionelle kørsel med én bruger.

  • Den identificerer virkningerne af at tilgå de samme databaseposter, moduler eller applikationskode på samme tid.
  • Den identificerer og måler niveauet af deadlocking, locking, brug af single-threaded kode og begrænset adgang til delte ressourcer.

En funktion kan være fuldt ud korrekt for én bruger og stadig miste data for den anden bruger, der ankommer et millisekund senere, hvilket er grunden til, at denne teknik bruges sideløbende test af ydeevne snarere end intern funktionel testning.

Sådan udfører du samtidighedstestning

Samtidighedstestning følger en gentagelig sekvens. Trinene nedenfor går fra scoping til opløsning.

  • Trin 1) Identificer samtidighedstilbøjelige flows. Se efter delt tilstand: samtidige logins, plads- eller lagerreservation, saldoopdateringer, batchjob, der skriver den samme tabel, og enhver enkelttrådet komponent i stien.
  • Trin 2) Angiv et samtidighedsmål. Bestem, hvor mange brugere der skal handle på samme tid, ud fra reelle brugstoppe i stedet for et rundt tal.
  • Trin 3) Design testcasesene. Hver test sag parrer den delte ressource, de konkurrerende handlinger og den forventede sluttilstand — for eksempel må to sessioner med udbetalinger fra én konto ikke begge lykkes.
  • Trin 4) Lav et script, og vælg værktøjet. En loadgenerator, der genererer konfigurerbare virtuelle brugere, er påkrævet; JMeter er det almindelige open source-valg, og dets trådgruppeindstillinger er knyttet direkte til samtidighedsscenarier.
  • Trin 5) Ramp trinvis. Øg antallet af samtidige brugere i etaper i stedet for hoppendeping til målet, så det niveau, hvor konflikten starter, er synligt.
  • Trin 6) Overvåg og analyser. Se ventetider, spredning i svartid, fejlrater og databaseblokering sammen – en samtidighedsfejl viser sig ofte som en timing-anomali, før den viser sig som en fejl.
  • Trin 7) Løs og kør igen. Ret årsagen til synkronisering, indeksering eller låsning, og gentag derefter den samme kørsel for at bekræfte, at adfærden er ændret i stedet for flyttet.

Almindelige samtidighedsfejl

Samtidighedsdefekter falder i et lille antal genkendelige klasser, og korrekt navngivning af klassen peger normalt direkte på løsningen.

Defekt Hvad sker Typisk symptom
Raceforhold Resultatet afhænger af, hvilken session der sluttede først Korrekte totaler på nogle løb, forkerte på andre
deadlock To sessioner har hver en lås, som den anden har brug for Transaktioner hænger i stedet for at returnere en fejl
Mistet opdatering En anden skrivning overskriver den første uden at læse den En gemt ændring forsvinder lydløst
Data korruption En delt struktur er kun delvist skrevet Poster i en tilstand, hvor ingen gyldig transaktion kunne oprettes
Sult En session får aldrig den ressource, den venter på En enkelt brugersti får timeout, mens systemet ser ud til at være i orden

Da disse fejl er intermitterende, skal der registreres logfiler og tidsstempler for hver kørsel; ellers kan fejlen ikke påvises troværdigt via proces til håndtering af fejl.

Eksempel på samtidighedstestning

Forestil dig en onlinebutik, der har den sidste enhed af et produkt på lager. To kunder åbner varen på samme tidspunkt, og begge trykker på KØB.

  • Scenario: To sessioner læser lager = 1, begge består tilgængelighedskontrollen, og begge skriver lager = 0.
  • Forventet resultat: Én ordre bekræftes, den anden modtager en besked om, at lagerbeholdningen er udsolgt, og lagerbeholdningen bliver aldrig negativ.
  • Fejlindikator: Begge ordrer bekræfter, eller lagerbeholdningen lander på -1, hvilket viser, at tilgængelighedskontrollen og reduktionen ikke udføres som ét atomart trin.
  • Variationer der er værd at køre: De samme to sessioner, der redigerer én profilpost, to godkendelser af den samme anmodning og et batchjob, der opdaterer tabellen, mens en bruger gemmer.

Det samme mønster generaliserer: find én ressource, to forfattere og ingen bestillingsgaranti. Kør scenariet under system test, før belastning tilføjes, holder diagnosen ren.

Fordele ved samtidighedstestning

  • Det reducerer relativt den nødvendige indsats for at teste en applikation ved at begrænse omfanget af samtidige interaktioner til et par udbredte, velafprøvede komponenter.
  • Indkapsling gør det muligt at analysere en del af et programs opførsel uden at gennemgå hele kodebasen.
  • Det hjælper med at forbedre pålideligheden og robustheden af ​​samtidige programmer.
  • Det afdækker låsnings- og blokeringsgrænser tidligt, så kapacitetsbeslutninger hviler på målt konkurrence snarere end på estimater.

Ulemper ved samtidighedstestning

Nedenstående ulemper støder testere typisk på, når de udfører samtidighedstest.

  • Applikationen skal testes på flere platforme.
  • Samtidighedsscenarier kræver mere intensive tests end sekventielle.
  • Funktioner returnerer ikke deres resultat til den, der kalder det, med det samme; i stedet kan resultatet leveres senere via notifikationer, blokke, callback-funktioner eller lignende mekanismer, hvilket gør testning vanskeligere.
  • Informationen eller programflowet afspejles ikke i opkaldsstakken.
  • Antallet af udførelsesstier i systemet kan være ekstremt stort, da processerne i et samtidig system interagerer med hinanden, mens de udføres.
  • Samtidige programmer har en højere fejlrate end sekventielle programmer.
  • Det er vanskeligt at fejlfinde samtidige programmer, fordi tilknytning af en fejlfinder ændrer timingen, der forårsagede fejlen.

Ofte Stillede Spørgsmål

Nej. Belastningstest måler adfærd under forventet volumen over tid. Samtidighedstestning er rettet mod det samme øjeblik, så en defekt kan kun opstå med to brugere, hvis begge berører én delt post.

Den flertrådede halvdel af gevindtestning overlapper med det. Trådtestning spørger, om én forretningssti overlever integration; samtidighedstestning spørger, hvad samtidig adgang gør, når den sti allerede fungerer.

Udled tallet fra den observerede peak-forbrug, ikke fra et rundt tal. Start med to sessioner for at bevise, at logikken er atomar, og fortsæt derefter mod den målte peak og en margin over den.

Maskinlæringsmodeller rangerer moduler efter tidligere fejlhistorik og kompleksitet i delte tilstande, hvilket peger testere på de flows, der har størst sandsynlighed for at afbryde under overlap. Logklynger på tværs af gentagne kørsler isolerer derefter den interleaving, der gik forud for hver fejl.

GitHub Copilot udarbejder hurtigt virtuelle brugerscripts, barrierer og assertion-hjælpere. Testeren definerer stadig, hvilken ressource der deles, og hvad den korrekte sluttilstand er, da genererede tests sjældent fremtvinger en ægte overlapning.

Isolationsniveau, låsetimeout, størrelsen på forbindelsespuljen og indeksering ændrer alle, hvordan konkurrencen vises. Registrer dem ved hver kørsel, fordi et resultat opnået under ét isolationsniveau ikke siger noget om et andet.

Gentag det identiske scenarie mange gange fra en ren datatilstand, behold tidsstemplede logfiler, og indsnævre vinduet mellem de to konkurrerende handlinger. Ved at tilføje en debugger skjules ofte fejlen ved at ændre timingen.

Ja, til volumenafhængig konflikt. Små tabeller lader databasen gemme alt i hukommelsen og låse kortvarigt, så blokering, der vises i produktion, forbliver usynlig. Match rækkeantal og indeksstørrelser så tæt som miljøet tillader.

Opsummer dette indlæg med: