Co to jest testowanie współbieżności w testowaniu oprogramowania?
⚡ Inteligentne podsumowanie
Testowanie współbieżności pozwala wykryć defekty pojawiające się tylko wtedy, gdy wielu użytkowników korzysta z tej samej aplikacji w tym samym momencie. Ujawnia to blokady, utracone aktualizacje i problemy z blokowaniem, których nigdy nie wykrywają sekwencyjne kontrole funkcjonalne.
Co to jest testowanie współbieżności?
Testowanie współbieżności to technika testowania służąca do wykrywania defektów w aplikacji, gdy zalogowanych jest wielu użytkowników. Innymi słowy, monitoruje ona efekt jednoczesnego wykonywania tej samej czynności przez wielu użytkowników.
Testowanie współbieżności jest również nazywane testowanie wieloużytkownikoweTestowanie programu współbieżnego jest trudniejsze niż testowanie programu sekwencyjnego ze względu na problemy z nieokreślonością i synchronizacją: ten sam test może zakończyć się powodzeniem przy jednym przebiegu, a niepowodzeniem przy następnym, bez konieczności zmiany ani jednej linijki kodu.
Poniższy diagram ilustruje tę ideę — wielu użytkowników uzyskuje dostęp do tego samego zasobu aplikacji w tym samym momencie, a test sprawdza, co aplikacja robi z tym nałożeniem.
Dlaczego warto testować współbieżność
Dwa pytania uzasadniają ten wysiłek, przy czym oba są niewidoczne w przypadku uruchomień funkcjonalnych dla pojedynczego użytkownika.
- Identyfikuje skutki jednoczesnego dostępu do tych samych rekordów bazy danych, modułów lub kodu aplikacji.
- Identyfikuje i mierzy poziom blokad, stosowania kodu jednowątkowego i ograniczonego dostępu do zasobów współdzielonych.
Funkcja może być w pełni poprawna dla jednego użytkownika, ale mimo to drugi użytkownik, który dotrze do niej milisekundę później, może utracić dane, dlatego ta technika jest stosowana obok test wydajności zamiast wewnętrznych testów funkcjonalnych.
Jak przeprowadzać testy współbieżności
Testowanie współbieżności przebiega w powtarzalnej sekwencji. Poniższe kroki przechodzą od scoping do rozdzielczości.
- Krok 1) Zidentyfikuj przepływy podatne na współbieżność. Zwróć uwagę na współdzielony stan: jednoczesne logowania, rezerwacje miejsc lub zapasów, aktualizacje salda, zadania wsadowe zapisujące tę samą tabelę i każdy komponent jednowątkowy na ścieżce.
- Krok 2) Ustaw cel współbieżności. Określ, ilu użytkowników musi podjąć działanie w tym samym momencie, biorąc pod uwagę rzeczywiste szczyty wykorzystania, a nie zaokrągloną liczbę.
- Krok 3) Zaprojektuj przypadki testowe. Każdy walizka testowa łączy współdzielony zasób, konkurujące ze sobą działania i oczekiwany stan końcowy — na przykład dwie sesje wycofujące się z jednego konta nie mogą się jednocześnie powieść.
- Krok 4) Skrypt i wybór narzędzia. Wymagany jest generator obciążenia, który generuje konfigurowalnych użytkowników wirtualnych; JMeter jest powszechnym wyborem typu open source, a jego ustawienia grupy wątków są bezpośrednio odwzorowywane na scenariusze współbieżności.
- Krok 5) Ramp stopniowo. Zwiększaj liczbę jednoczesnych użytkowników etapami, a nie skokowoping do celu, dzięki czemu widoczny jest poziom, na którym rozpoczyna się rywalizacja.
- Krok 6) Monitoruj i analizuj. Obserwuj jednocześnie czas oczekiwania na blokadę, rozproszenie czasu reakcji, wskaźniki błędów i blokowanie bazy danych — defekt współbieżności często ujawnia się jako anomalia czasowa, zanim stanie się błędem.
- Krok 7) Rozwiąż i uruchom ponownie. Usuń przyczynę synchronizacji, indeksowania lub blokowania, a następnie powtórz ten sam przebieg, aby potwierdzić, że zachowanie uległo zmianie, a nie przeniesieniu.
Typowe wady współbieżności
Wady współbieżności można podzielić na kilka rozpoznawalnych klas, a poprawna nazwa klasy zazwyczaj wskazuje bezpośrednio na sposób rozwiązania problemu.
| Wada | Co się dzieje | Typowy objaw |
| Stan wyścigu | Wynik zależy od tego, która sesja zakończy się jako pierwsza | W niektórych przebiegach wyniki są poprawne, w innych błędne |
| Deadlock | Dwie sesje każda trzyma blokadę, druga potrzebuje | Transakcje zawieszają się zamiast zwracać błąd |
| Utracona aktualizacja | Drugi zapis nadpisuje pierwszy bez jego odczytywania | Zapisana zmiana znika bezgłośnie |
| Korupcja danych | Wspólna struktura jest zapisywana tylko częściowo | Rekordy w stanie, w którym nie mogła zostać utworzona żadna prawidłowa transakcja |
| Głód | Jedna sesja nigdy nie otrzymuje zasobu, na który czeka | Pojedyncza ścieżka użytkownika ulega przekroczeniu limitu czasu, podczas gdy system wydaje się być sprawny |
Ponieważ awarie te występują sporadycznie, każde uruchomienie wymaga rejestrowania dzienników i znaczników czasu; w przeciwnym razie nie można wiarygodnie zgłosić usterki za pomocą proces zarządzania defektami.
Przykład testowania współbieżności
Wyobraź sobie sklep internetowy, w którym znajduje się ostatnia sztuka produktu w magazynie. Dwóch klientów otwiera produkt w tym samym momencie i obaj naciskają Kup.
- Scenariusz: Dwie sesje odczytują stan zapasu = 1, obie przechodzą kontrolę dostępności i obie zapisują stan zapasu = 0.
- Spodziewany wynik: Jedno zamówienie zostaje potwierdzone, drugie otrzymuje komunikat o braku towaru w magazynie, a stan zapasów nigdy nie jest ujemny.
- Wskaźnik usterki: Oba zamówienia zostają potwierdzone lub zapasy osiągają wartość -1, co pokazuje, że sprawdzenie dostępności i jej zmniejszenie nie zostały wykonane jako jeden krok atomowy.
- Wariacje warte wypróbowania: Te same dwie sesje edytują jeden rekord profilu, dwie zgody na to samo żądanie i zadanie wsadowe aktualizujące tabelę podczas zapisywania przez użytkownika.
Ten sam schemat jest generalizowany: znajdź jeden zasób, dwóch autorów i nie ma gwarancji kolejności. Uruchomienie scenariusza podczas testowanie systemu, przed dodaniem obciążenia, pozwala zachować przejrzystość diagnostyki.
Zalety testowania współbieżności
- Relatywnie zmniejsza ilość pracy potrzebnej do testowania aplikacji, ograniczając zakres równoczesnych interakcji do kilku powszechnie używanych, dobrze przetestowanych komponentów.
- Hermetyzacja pozwala na analizę zachowania części programu bez konieczności przeglądania całej bazy kodu.
- Pomaga zwiększyć niezawodność i solidność programów współbieżnych.
- Wcześnie ujawnia limity blokowania, dzięki czemu decyzje dotyczące pojemności opierają się na zmierzonych różnicach, a nie na szacunkach.
Wady testowania współbieżności
Opisane poniżej wady są typowe dla testerów przeprowadzających testy współbieżności.
- Aplikację należy przetestować na wielu platformach.
- Scenariusze współbieżne wymagają bardziej intensywnych testów niż scenariusze sekwencyjne.
- Funkcje nie zwracają wyniku do wywołującego natychmiast; zamiast tego wynik może zostać dostarczony później za pomocą powiadomień, bloków, funkcji wywołania zwrotnego lub podobnych mechanizmów, co utrudnia testowanie.
- Przepływ informacji lub programu nie jest odzwierciedlany na stosie wywołań.
- Liczba ścieżek wykonywania w systemie może być niezwykle duża, ponieważ procesy w systemie współbieżnym oddziałują na siebie podczas wykonywania.
- Programy równoległe mają wyższy wskaźnik niepowodzeń niż programy sekwencyjne.
- Debugowanie programów współbieżnych jest trudne, ponieważ dołączenie debugera zmienia moment, który spowodował awarię.

