Co je testování souběžnosti v testování softwaru?

⚡ Chytré shrnutí

Souběžné testování detekuje chyby, které se objevují pouze tehdy, když několik uživatelů pracuje na stejné aplikaci současně, a odhaluje tak zablokování, ztracené aktualizace a problémy se zamykáním, které sekvenční funkční kontroly nikdy neodhalí.

  • 👥 Také zvaný: Víceuživatelské testování, protože spouštěčem je simultánní přístup, nikoli pouze velký objem dat.
  • 🎯 Na co se zaměřuje: Sdílené databázové záznamy, sdílené moduly a sdílený aplikační kód, ke kterým se dostalo více než jednou relací.
  • 🔒 Co měří: Úrovně deadlockingu, zamykání, jednovláknového kódu a omezeného přístupu ke sdíleným zdrojům.
  • 🧭 Jak to funguje: Identifikujte toky náchylné k souběžnosti, nastavte cíl souběžnosti, napište skript pro skutečné akce a poté postupně zvyšujte počet uživatelů.
  • 🐞 Třídy vad: Soubojové podmínky, zablokování, ztracené aktualizace, poškození dat a nedostatek vláken.
  • ⚠️ Poctivá omezení: Nedeterminismus, asynchronní zpětná volání a neinformativní zásobník volání ztěžují reprodukci selhání.

Co je testování souběžnosti při testování softwaru s více simultánními uživateli?

Co je testování souběžnosti?

Testování souběžnosti je testovací technika používaná k detekci chyb v aplikaci, když je přihlášeno více uživatelů. Jinými slovy, monitoruje efekt, když více uživatelů provádí stejnou akci současně.

Testování souběžnosti se také označuje jako víceuživatelské testováníTestování souběžného programu je náročnější než testování sekvenčního programu kvůli problémům s nedeterminismem a synchronizací: stejný test může v jednom spuštění projít a v dalším selhat, aniž by se změnil jediný řádek kódu.

Níže uvedený diagram ilustruje tuto myšlenku – několik uživatelů se ve stejném okamžiku dostane ke stejnému aplikačnímu zdroji a test sleduje, co aplikace s tímto překrytím dělá.

Diagram testování souběžnosti znázorňující více uživatelů, kteří současně přistupují ke stejnému aplikačnímu prostředku

Proč testování souběžnosti

Dvě otázky ospravedlňují úsilí a obě jsou pro funkční běhy jednoho uživatele neviditelné.

  • Identifikuje důsledky přístupu ke stejným databázovým záznamům, modulům nebo aplikačnímu kódu současně.
  • Identifikuje a měří úroveň deadlockingu, zamykání, použití jednovláknového kódu a omezeného přístupu ke sdíleným zdrojům.

Funkce může být pro jednoho uživatele plně správná a pro druhého uživatele, který se objeví o milisekundu později, se data stále ztrácejí, a proto je tato technika součástí... testování výkonu spíše než uvnitř funkčního testování.

Jak provádět testování souběžnosti

Testování souběžnosti probíhá v opakovatelné sekvenci. Níže uvedené kroky přecházejí od testování sco.ping k rozlišení.

  • Krok 1) Identifikujte toky náchylné k souběžnosti. Hledejte sdílený stav: simultánní přihlášení, rezervace místa nebo zásob, aktualizace zůstatku, dávkové úlohy zapisující stejnou tabulku a jakoukoli jednovláknovou komponentu v cestě.
  • Krok 2) Stanovte cíl souběžnosti. Rozhodněte, kolik uživatelů musí jednat ve stejném okamžiku, a to na základě skutečných špiček využití, nikoli na základě zaokrouhleného čísla.
  • Krok 3) Navrhněte testovací případy. Každý modelový případ páruje sdílený zdroj, konkurenční akce a očekávaný konečný stav – například dvě relace odebírající z jednoho účtu nesmí obě uspět.
  • Krok 4) Napište skript a vyberte nástroj. Je vyžadován generátor zátěže, který vytváří konfigurovatelné virtuální uživatele; JMeter je běžnou volbou open-source a jeho nastavení skupin vláken se přímo mapují na scénáře souběžnosti.
  • Krok 5) Ramp postupně. Zvyšujte počet souběžných uživatelů postupně, nikoli skokověping k cíli, takže je viditelná úroveň, na které začíná soupeření.
  • Krok 6) Monitorování a analýza. Sledujte čekání na uzamčení, rozptyl doby odezvy, míru chyb a blokování databáze společně – chyba souběžnosti se často projeví jako anomálie načasování dříve, než se projeví jako chyba.
  • Krok 7) Vyřešte problém a spusťte znovu. Opravte příčinu synchronizace, indexování nebo zamykání a poté opakujte stejný běh, abyste potvrdili, že se chování změnilo, nikoli přesunulo.

Běžné chyby souběžnosti

Vady souběžnosti spadají do malého počtu rozpoznatelných tříd a správné pojmenování třídy obvykle přímo ukazuje na opravu.

Přeběhnout Co se stane, Typický příznak
Podmínka závodu Výsledek závisí na tom, která relace skončila jako první Správné součty u některých běhů, špatné u jiných
Zablokování Dvě sezení drží zámek, který ostatní potřebují Transakce se zaseknou místo vrácení chyby.
Ztracená aktualizace Druhý zápis přepíše první bez přečtení. Uložená změna tiše zmizí
Zkorumpování dat Sdílená struktura je zapsána pouze částečně Záznamy ve stavu, který nemohla vytvořit žádná platná transakce
Hladovění Jedna relace nikdy nezíská zdroj, na který čeká. Časový limit cesty jednoho uživatele vyprší, i když systém vypadá v pořádku.

Protože se tyto chyby vyskytují občas, je nutné při každém spuštění zaznamenávat protokoly a časová razítka, jinak nelze závadu důvěryhodně nahlásit prostřednictvím proces správy vad.

Příklad testování souběžnosti

Představte si internetový obchod, který má skladem poslední kus produktu. Dva nakupující otevřou položku ve stejnou chvíli a oba stisknou tlačítko Koupit.

  • Scénář: Dvě relace čtou stock = 1, obě projdou kontrolou dostupnosti a obě zapíší stock = 0.
  • Očekávaný výsledek: Jedna objednávka je potvrzena, druhá obdrží zprávu o vyprodaném zboží a zásoby nikdy neklesnou do záporných hodnot.
  • Indikátor závady: Obě objednávky potvrzují, nebo zásoby dosáhnou hodnoty -1, což ukazuje, že kontrola dostupnosti a snížení zásob nebyly provedeny jako jeden atomický krok.
  • Varianty, které stojí za to vyzkoušet: Stejné dvě relace upravující jeden záznam profilu, dvě schválení stejného požadavku a dávková úloha aktualizující tabulku, zatímco uživatel ukládá.

Stejný vzorec se zobecňuje: najít jeden zdroj, dva autory a žádnou záruku objednávání. Spuštění scénáře během testování systému, před přidáním zátěže, udržuje diagnózu čistou.

Výhody testování souběžnosti

  • Relativně snižuje množství úsilí potřebného k testování aplikace omezením rozsahu souběžných interakcí na několik široce používaných a dobře otestovaných komponent.
  • Zapouzdření umožňuje analyzovat chování části programu bez nutnosti procházet celou kódovou základnu.
  • Pomáhá zlepšit spolehlivost a robustnost souběžných programů.
  • Včas odhaluje limity zamykání a blokování, takže rozhodnutí o kapacitě se opírají spíše o naměřené soupeření než o odhady.

Nevýhody testování souběžnosti

S níže uvedenými nevýhodami se testeři obvykle setkávají při provádění testování souběžnosti.

  • Aplikaci je nutné otestovat na více platformách.
  • Souběžné scénáře vyžadují intenzivnější testy než sekvenční.
  • Funkce nevrací výsledek volajícímu okamžitě; výsledek může být doručen později prostřednictvím oznámení, bloků, callback funkcí nebo podobných mechanismů, což testování ztěžuje.
  • Tok informací nebo programu se neodráží v zásobníku volání.
  • Počet cest provádění v systému může být extrémně velký, protože procesy v souběžném systému během svého provádění vzájemně interagují.
  • Souběžné programy mají vyšší míru selhání než sekvenční programy.
  • Ladění souběžných programů je obtížné, protože připojení ladicího programu mění načasování, které způsobilo selhání.

Nejčastější dotazy

Ne. Zátěžové testování měří chování při očekávaném objemu v čase. Testování souběžnosti se zaměřuje na stejný okamžik, takže k chybě může dojít pouze u dvou uživatelů, pokud se oba dotknou jednoho sdíleného záznamu.

Vícevláknová polovina testování vláken překrývá se s ním. Testování vláken se ptá, zda jedna obchodní cesta přežije integraci; testování souběžnosti se ptá, co dělá simultánní přístup, jakmile tato cesta již funguje.

Odvozte číslo z pozorovaného špičkového využití, ne ze zaokrouhleného čísla. Začněte se dvěma sezeními, abyste dokázali, že logika je atomická, a poté postupně zvyšujte k naměřenému vrcholu a s určitou rezervou nad ním.

Modely strojového učení řadí moduly podle historie minulých chyb a složitosti sdíleného stavu, čímž testerům ukazují na toky, které s největší pravděpodobností selžou při překrývání. Shlukování protokolů napříč opakovanými běhy pak izoluje prokládání, které předcházelo každému selhání.

GitHub Copilot Rychle navrhuje skripty, bariéry a pomocné prvky pro assertion. Tester stále definuje, který zdroj je sdílen a jaký je správný konečný stav, protože generované testy jen zřídka vynucují skutečné překrývání.

Úroveň izolace, časový limit zámku, velikost fondu připojení a indexování – to vše mění způsob, jakým se kolize zobrazují. Zaznamenávejte je při každém spuštění, protože výsledek získaný na jedné úrovni izolace neříká nic o jiné.

Opakujte stejný scénář mnohokrát z čistého stavu dat, uchovávejte protokoly s časovým razítkem a zúžte okno mezi dvěma konkurenčními akcemi. Připojení ladicího programu často skryje chybu změnou načasování.

Ano, pro soupeření citlivá na objem. Malé tabulky umožňují databázi uchovávat vše v paměti a krátkodobě se uzamknout, takže blokování, které se objeví v produkčním prostředí, zůstává neviditelné. Počty řádků a velikosti indexů by měly být co nejpřesnější, jak to prostředí dovolí.

Shrňte tento příspěvek takto: