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.

  • 🠄¥ Nazywany również: Testowanie wielodostępne, ponieważ czynnikiem wyzwalającym jest jednoczesny dostęp, a nie tylko duża objętość.
  • 🎯 Jakie są jego cele: Wspólne rekordy bazy danych, wspólne moduły i wspólny kod aplikacji dostępne dla więcej niż jednej sesji.
  • 🔒 Co mierzy: Poziomy blokowania, blokowania, kodu jednowątkowego i ograniczonego dostępu do współdzielonych zasobów.
  • 🧭 Jak to działa: Zidentyfikuj przepływy wymagające współbieżności, ustaw cel współbieżności, zapisz rzeczywiste działania, a następnie stopniowo zwiększaj liczbę użytkowników.
  • 🐞 Klasy defektów: Wyścigi, blokady, utrata aktualizacji, uszkodzenie danych i ograniczenie liczby wątków.
  • ⚠️ Uczciwe granice: Brak determinizmu, asynchroniczne wywołania zwrotne i nieinformatywny stos wywołań sprawiają, że awarie są trudne do odtworzenia.

Czym jest testowanie współbieżności w testowaniu oprogramowania z wieloma użytkownikami jednocześnie?

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.

Diagram testowania współbieżności pokazujący wielu użytkowników uzyskujących jednocześnie dostęp do tego samego zasobu aplikacji

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

FAQ

Nie. Testowanie obciążenia Mierzy zachowanie przy oczekiwanej objętości w czasie. Testowanie współbieżności ma na celu ten sam moment, więc defekt może wystąpić tylko u dwóch użytkowników, jeśli obaj korzystają z jednego współdzielonego rekordu.

Wielowątkowa połowa testowanie wątków nakłada się na nią. Testowanie wątków sprawdza, czy jedna ścieżka biznesowa przetrwa integrację; testowanie współbieżności sprawdza, co dzieje się z dostępem jednoczesnym, gdy ta ścieżka już działa.

Wyprowadź liczbę z obserwowanego szczytowego zużycia, a nie z zaokrąglonej wartości. Zacznij od dwóch sesji, aby udowodnić, że logika jest atomowa, a następnie stopniowo zbliżaj się do zmierzonego szczytu i marginesu powyżej niego.

Modele uczenia maszynowego klasyfikują moduły według historii defektów i złożoności stanu współdzielonego, wskazując testerom przepływy, które najprawdopodobniej ulegną awarii w wyniku nakładania się. Rejestrowanie klastrów w powtarzanych przebiegach izoluje następnie przeplot poprzedzający każdą awarię.

Drugi pilot GitHub Szybko tworzy skrypty dla użytkowników wirtualnych, bariery i pomoce asercji. Tester nadal definiuje, który zasób jest współdzielony i jaki jest poprawny stan końcowy, ponieważ generowane testy rzadko wymuszają rzeczywiste nakładanie się.

Poziom izolacji, limit czasu blokady, rozmiar puli połączeń i indeksowanie – wszystkie te czynniki wpływają na sposób pojawiania się rywalizacji. Rejestruj je przy każdym uruchomieniu, ponieważ wynik uzyskany na jednym poziomie izolacji nic nie mówi o innym.

Powtarzaj ten sam scenariusz wielokrotnie, zaczynając od stanu czystych danych, prowadź dzienniki ze znacznikami czasu i zawężaj okno czasowe między dwoma konkurującymi działaniami. Podłączenie debugera często ukrywa błąd poprzez zmianę czasu.

Tak, w przypadku konfliktów zależnych od objętości. Małe tabele pozwalają bazie danych przechowywać wszystko w pamięci i blokować na krótko, dzięki czemu blokowanie pojawiające się w środowisku produkcyjnym pozostaje niewidoczne. Dopasuj liczbę wierszy i rozmiary indeksów tak dokładnie, jak pozwala na to środowisko.

Podsumuj ten post następująco: