W jaki sposób pracownicy kontroli jakości mogą testować logikę buforowania, której nie widzą?

33

Właśnie zaimplementowałem warstwę pamięci podręcznej w mojej aplikacji internetowej i teraz zastanawiam się, jak QA powinna to przetestować, ponieważ buforowanie jest przezroczyste dla użytkownika.

Jednym z moich pomysłów jest wprowadzenie metod wywoływania kodu wypełniającego pamięć podręczną i rejestrowanie, kiedy obiekt jest pobierany z pamięci podręcznej i kiedy wymaga odtworzenia z bazy danych, a następnie testerzy mogą przeglądać dzienniki, aby zobaczyć, czy: na przykład określony obiekt jest przeładowywany z bazy danych co 10 minut, zamiast każdego wyświetlenia strony.

Ale czy ktoś może zasugerować lepsze praktyki w tej sytuacji?

Joshua Frank
źródło
6
powiązane: Metodologia testu obciążenia
gnat
5
Cały dzień pracuję nad wydajnością i „jak QA może przetestować twoją zmianę?” to pytanie, które zadaje mi się stale.
Brandon
1
Cóż, ogólnie pamięć podręczna ma na celu przyspieszenie operacji poprzez przechowywanie wyników w pamięci, które w innym przypadku pochodziłyby z innego źródła (db, zdalny serwer, kosztownie obliczeniowa metoda itp.). Dlatego pomiar czasu, który powinien zająć po uderzeniu w pamięć podręczną, wydaje się najprostszym sposobem. Sprawdź także, czy nie występują problemy z pamięcią podręczną (aktualizacje rzeczywistych danych nie pojawiają się, ponieważ poprzednia wersja jest nadal buforowana)
GordonM

Odpowiedzi:

37

Jedno pytanie dotyczy tego, czy sama pamięć podręczna jest rzeczywiście wymogiem, który powinien zostać przetestowany przez QA. Buforowanie poprawia wydajność, aby mogli przetestować różnicę wydajności, aby upewnić się, że spełnia pewne wymagania.

Ale dobrym pomysłem jest przetestowanie pamięci podręcznej, niezależnie od tego, kto jest za nią odpowiedzialny. Użyliśmy liczników wydajności. Jeśli system pamięci podręcznej korzysta z nich, są one proste. Jeśli jest jakiś sposób, aby uzyskać liczbę z samej pamięci podręcznej, jest to inna opcja.

Używanie twojego podejścia jest również miłe. Jeśli którykolwiek z nich jest zapakowany w zautomatyzowane testy, które sprawdzają wyniki, nikt nie musi przeglądać dzienników, aby znaleźć odpowiedzi.

Andy Wiesendanger
źródło
+1 za testowanie wydajności zamiast buforowania. Jaką wartością biznesową jest samo buforowanie? (Brak.) Na pewno pracujesz nad jakimś zauważalnym wpływem na coś - dlaczego miałbyś poświęcić czas na jego wdrożenie? Przetestuj ten wpływ.
alexanderbird
74

Zaimplementowałeś pamięć podręczną (zakładam, że), ponieważ system nie działał wystarczająco dobrze. To jest coś, co jest istotne dla użytkownika. Oto rzeczy, które QA może sprawdzić:

  • System po wprowadzeniu pamięci podręcznej jest nadal poprawny. Oznacza to, że powinni próbować oszukać pamięć podręczną w celu dostarczenia nieaktualnych danych, co może zweryfikować QA i upewnić się, że nic więcej nie zostało zepsute.
  • System spełnia teraz wymagania wydajności, których nie spełniał, gdy zdecydowano się poprawić wydajność. Mogą porównać stare pomiary i porównać je z nowymi.

Pamiętaj, że użytkownicy (a przez to QA) nie dbają o to, jak rozwiązałeś problem. Troszczą się tylko o to, że problem został rozwiązany i nie tworzą nowych problemów. Dzieje się tak niezależnie od tego, czy zaimplementowałeś buforowanie, poprawiłeś parsowanie ciągów, dokonałeś aktualizacji sprzętu, czy też posypałeś magiczny czarodziejski pył na serwerze.

durron597
źródło
1
Stwierdzenie, że QA nie zależy na tym, jak rozwiązać problem, jest bardzo uproszczonym poglądem na to, czym jest zainteresowany QA. Dbają one o to, czy faktycznie poprawiłeś wydajność, wprowadziłeś dodatkowe zadłużenie techniczne, ryzyko lub usterki itp.
Eric
4
@Eric W rozwoju oprogramowania „QA” jako grupa zasadniczo nie odnosi się do programistów / inżynierów. Dług techniczny stanowi problem dewelopera / inżyniera (i problem zarządzania, ponieważ może wpływać na terminy, koszty itp.). To samo dotyczy ryzyka. Zadaniem QA jest upewnienie się, że oprogramowanie spełnia wymagania (i być może przypadkowo pomoc w procesie usuwania niejasnych wymagań). Jeśli w ogóle zależy im na wdrożeniu, powinno to stanowić jedynie sposób na znalezienie kreatywnych sposobów na przełamanie systemu.
jpmc26
3
@Eric Nic nie mylę. „QA” nie odnoszą się do testerów oprogramowania. Interpretujesz to pojęcie tak szeroko, że powinno ono obejmować całą firmę opracowującą oprogramowanie, a nawet klienta, jeśli jest to system stworzony specjalnie dla nich, ponieważ każdy ma dobrą jakość.
jpmc26
1
@Eric Proszę, nie każ mi się kłócić, jak język i semantyka działają z tobą. Wzywam cię do znalezienia 5 instancji na tej StackExchange, w których termin jest używany w ten sposób w mniej niż 30 minut. Poza tym, nawet według tej definicji, najlepszą oddzielną grupą ds. Kontroli jakości, która może rozwiązać problemy wykraczające poza sam produkt, jest nałożenie polityk na programistów, a gdy polityka i proces są wyższe niż tworzenie dobrych produktów, zwykle kończy się to na złych produktach. Mogę również zapewnić, że osoby odpowiedzialne za „kontrolę jakości”, z którymi zdecydowanie współpracuję, są testerami i nie mają wiele do powiedzenia na temat mojego procesu rozwoju.
jpmc26
4
@Eric: nic nie stoi na przeszkodzie, aby firma lub grupa osób definiujących „QA” była bardziej holistyczna. Jednak z mojego doświadczenia (w 5 bardzo różnych firmach) etap kontroli jakości, jak to się nazywa - i tych, którzy się w nim specjalizują - w rozwoju oprogramowania jest zwykle skoncentrowany na testowaniu zachowania systemu przez czarne skrzynki. Chociaż możemy również mieć „kontrolę jakości”, „Kwalitee” i inne wymyślone nazwy w celu objęcia specjalistycznych zagadnień dotyczących szerszych zagadnień dotyczących jakości.
Neil Slater,
3

Zakopanie ważnej logiki biznesowej lub stanu systemu głęboko w czarnej skrzynce utrudnia weryfikację prawidłowego zachowania systemu. Łatwiej jest wyczerpująco przetestować zachowanie pojedynczego komponentu w systemie niż całego systemu. Opowiadam się za jawnym ujawnieniem takich rzeczy za pomocą jakiegoś mechanizmu, aby można je było w znaczący sposób przetestować w jednostce / regresji / integracji / kontroli jakości.

Jedną z opcji z pamięcią podręczną byłoby odsłonięcie specjalnej strony, która podaje pewne szczegóły dotyczące pamięci podręcznej (zawartość, stan itp.). Może to pomóc w debugowaniu w fazie rozwoju i potencjalnie w produkcji. Dział kontroli jakości może również użyć tej strony do utworzenia przypadków testowych dla pamięci podręcznej, jeśli podano im szczegółowe informacje na temat oczekiwanego zachowania pamięci podręcznej. Używanie liczników wydajności i / lub plików dziennika do jawnego dokumentowania zachowania pamięci podręcznej jest kolejnym mniej widocznym, ale wykonalnym podejściem.

Należy zauważyć, że takie podejście nie zastępuje kompleksowych testów wydajności. Jest to mechanizm zapewniający prawidłowe zachowanie samej pamięci podręcznej. Testy wydajności powinny być stosowane w celu ustalenia, czy buforowanie ma zamierzony wpływ na wydajność.

Zauważ też, że zamiana komponentów systemu na nowe implementujące ten sam interfejs, jak wprowadzenie pamięci podręcznej, może być destabilizującą i zwodniczo złożoną zmianą. W przykładzie z pamięcią podręczną wprowadzasz stan, który wcześniej był bezpaństwowy, co może powodować błędy, które są trudniejsze do znalezienia lub odtworzenia. Takiej zmianie zawsze powinny towarzyszyć pełne testy regresji w celu zweryfikowania oczekiwanego zachowania systemu.

Eric
źródło
3

Testuj wydajność, jak wskazano w odpowiedzi Andy'ego.

Odkryłem, że największą przeszkodą we wdrożeniu buforowania (i wydajności) w wielu organizacjach jest posiadanie środowiska, w którym można przeprowadzać dobre testy wydajności i przeprowadzać testy różnych rzeczywistych testów obciążenia i wydajności.

Aby to zrobić, należy skonfigurować środowisko testowania wydajności, które, tak blisko, jak to możliwe, i uwzględniając koszty, odzwierciedla produkcję. Prawdopodobnie NIE będzie to twoje obecne środowisko programistyczne, które powinno być mniejsze i bardziej samodzielne, aby umożliwić szybki rozwój aplikacji. Środowiska programistyczne również zwykle używają mniej pamięci podręcznej, więc nie reprezentują dobrze produkcji do testowania wydajności.

W środowisku testowania wydajności aplikacja powinna działać w „produkcyjnym” trybie. Powinieneś mieć więcej niż jeden serwer, jeśli produkcja, pula połączeń z bazą danych i buforowanie powinny być ustawione dla środowiska produkcyjnego itp

Warto również rozważyć narzędzie, które pomoże w testowaniu obciążenia.
jmeter jest bardzo popularny, chociaż uważam, że jest dość nieprzyjazny i prymitywny w użyciu.
Inną drogą, którą wybrałem jest po prostu url curlz skryptem ruby.

Żeby było jasne

  • testowanie wydajności linii bazowej służy do testowania czasu, jaki JEDEN żąda.
  • testowanie obciążenia jest podobne do testowania wydajności, ale sprawdza odpowiedź, gdy system jest również obciążony innymi żądaniami.

Pomocne mogą być również następujące linki:

Michael Durrant
źródło
2

Pamiętaj, aby zachęcić testerów do ponownego uruchomienia serwerów i sprawdzić, czy wprowadzone przez nich dane nadal tam są. Widziałem system, który miał wiele ludzkich miesięcy testów, zawiodł, kiedy to zostało zrobione!

Najtrudniejsze do przetestowania jest to, że jednak dane są aktualizowane, nigdy nie są zwracane nieaktualne wyniki z pamięci podręcznej.

Częściowo można temu zaradzić, zawsze wykorzystując dane z pamięci podręcznej do wypełnienia strony z potwierdzeniem, którą widzi użytkownik po dokonaniu zmiany. Np. Nie używaj obiektu, którego użyto do aktualizacji bazy danych, ale zażądaj danych z pamięci podręcznej, a następnie z bazy danych. Trochę wolniej, ale znacznie częściej błędy pojawiają się szybciej.

Ian
źródło
1

Ta w rzeczywistości ma bardzo prostą odpowiedź i jest związana z poziomem buforowania. To, co zaobserwujesz, gdy buforowanie jest prawidłowe, to brak żądań w miejscu docelowym żądań. Wszystko sprowadza się więc do zhakowanej frazy „spodziewane wyniki”.

W przypadku implementacji pamięci podręcznej w warstwie sieciowej oczekiwałbym, że elementy podlegające buforowaniu pojawią się tylko raz dla każdej testowanej sesji użytkownika (w przypadku implementacji pamięci podręcznej klienta) lub raz dla wielu użytkowników (w przypadku implementacji pamięci podręcznej w stylu CDN). Jeśli implementujesz pamięć podręczną w warstwie danych dla typowych wyników, to spodziewam się, że zobaczysz wysoki współczynnik trafień w pamięci podręcznej w warstwie buforowania wraz z brakiem zapytań w dzienniku profilu dla warstwy danych.

itp...

James Pulley
źródło
0

Niektóre rzeczy są lepiej testowane przez programistę, być może tego, który napisał kod, za pomocą testów jednostkowych. Testowanie poprawności kodu pamięci podręcznej jest jedną z tych rzeczy. (Ze sposobu, w jaki zadajesz to pytanie, zakładam, że twoi pracownicy QA traktują aplikację jako „czarną skrzynkę” i testują ją przez zewnętrzny interfejs.)

Alex D.
źródło
0

Logika buforowania jest czymś, co deweloper powinien przetestować jednostkowo, ponieważ QA wykonuje głównie testy czarnej skrzynki.

Kontrola jakości będzie dbać tylko o aspekty wydajności lub jakąkolwiek poprawkę, którą zaimplementujesz, dlatego możesz zapewnić kontrolę jakości z mechanizmem włączania / wyłączania buforowania lub jakimkolwiek mechanizmem używanym do poprawy wydajności, a następnie mogą zweryfikować różnicę wydajności. Oczywiście QA może również po prostu zweryfikować starą wersję pod kątem poprawionej wydajności.

Fred Thomsen
źródło
-4

Kiedy testowałem rozwiązanie buforowania, wdrożyliśmy to, co przetestowaliśmy w zasadzie wydajność. Zrobiliśmy to rozwiązanie buforujące dla wyników XML i po buforowaniu odpowiedź zajmuje bardzo mało czasu. Sprawdziliśmy to również w dzienniku serwera, sprawdzając wpisy dziennika.

użytkownik204667
źródło
3
Nie jestem do końca pewien, czy rozumiem, co mówisz, ani co mówi twoja odpowiedź, której nie ma w siedmiu poprzednich odpowiedziach.