Testowanie aplikacji i systemów - Różne typy testów

1. Typy testów określają znaczenie jasnego zdefiniowania celu pewnego poziomu programu lub projektu. Typ testy jest skoncentrowany na konkretnym celu testu, który może testować np.:
  • funkcję, wykonywaną przez moduł lub system,
  • niefunkcjonalne cechy jakościowe, takie jak niezawodność i użyteczność,
  • strukturę lub architekturę komponentu lub systemu itd.
Istnieją trzy rodzaje testów oprogramowania:
  • Testowanie funkcjonalne 
  • Testowanie niefunkcjonalne 
  • Testowanie strukturalne 
2. Testy funkcjonalne dotyczą oceny zgodności systemu z określonymi wymaganiami poprzez weryfikację określonych działań lub funkcji kodu. Są one opisane w specyfikacji wymagań lub funkcjonalnej i skupiają się na zewnętrznym zachowaniu oprogramowania. Techniki stosowane do testów funkcjonalnych mogą obejmować Smoke testy, testy białoskrzynkowe, czarnoskrzynkowe, jednostkowe oraz testy akceptacyjne użytkownika.

3. Testowanie funkcjonalne można podzielić na dwa typy: 
  • testowanie oparte na wymaganiach - testy są priorytetowane na podstawie ryzyka
  • testowanie oparte na procesie biznesowym, które skupia się na codziennych zastosowaniach biznesowych systemu
4. Testy funkcjonalne obejmują następujące rodzaje testów:
  • Testowanie jednostkowe (ang. Unit Testing)
  • Testowanie typu smoke (ang. Smoke Testing)
  • Testowanie typu sanity (ang. Sanity Testing)
  • Testowanie integracyjne (ang. Integration Testing)
  • Testowanie regresywne (ang. Regression Testing)
  • Testowanie akceptacji użytkownika (ang. User Acceptance Testing)
5. Smoke testing, znany również jako Build Verification Testing, to rodzaj testowania oprogramowania, które składa się z niepełnego zestawu testów mających na celu zapewnienie, że najważniejsze funkcje działają. Jest wykorzystywany do określenia, czy system jest wystarczająco stabilny, aby przejść do dalszych testów. Pomaga ono ujawnić problemy integracyjne na wczesnym etapie rozwoju i może być prowadzone ręcznie lub za pomocą automatycznych narzędzi.

6. Testowanie typu sanity odkrywa problemy na początku i zapewnia pewien poziom zaufania, że zmiany w oprogramowaniu nie naruszą głównych obszarów, które obejmują smoke testowanie. Smoke testowanie jest używane na wszystkich etapach testowania, w tym testach integracyjnych, systemowych i akceptacyjnych. Sanity test jest przeprowadzany po otrzymaniu kompilacji oprogramowania z drobnymi poprawkami, aby sprawdzić, czy błędy zgłoszone w poprzednich kompilacjach zostały naprawione i czy wprowadzone poprawki nie naruszają wcześniejszych funkcjonalności. Jest to alternatywa dla pełnego testowania regresyjnego. Testy Sanity pozwalają uniknąć straty czasu i kosztów związanych z testami, jeżeli budowa nie powiodła się, i zazwyczaj odbywają się pod koniec cyklu życia rozwoju systemu.

7. Najważniejsze cechy Sanity testów:
  • Szczegółowo testuje pewne ograniczone funkcje
  • Zwykle nie używa skryptów
  • Jest podzbiorem testów regresywnych (ang. Regression Testing)
  • Jest pobieżnym testowaniem, aby udowodnić, że aplikacja działa zgodnie ze specyfikacją i spełnia potrzeby użytkowników
  • Jest stosowany do weryfikacji wymagań końcowych użytkowników
  • Jest wykonywany, aby sprawdzić, czy po drobnym poprawkach mały fragment kodu lub funkcjonalność działa zgodnie z oczekiwaniami i nie łamie powiązanej funkcjonalności
8. Testowanie Smoke to szerokie podejście do testowania wszystkich obszarów aplikacji bez głębokiego sprawdzenia, które odbywa się po kompilacji oprogramowania, aby upewnić się, że krytyczne funkcje działają poprawnie. Może używać skryptów lub automatycznych testów.

Testowanie Sanity to wąski test regresji, który koncentruje się na jednym lub kilku obszarach funkcjonalności. Jest przeprowadzane, gdy pobieżne testowanie jest wystarczające, aby udowodnić, że aplikacja nadal działa zgodnie z przeznaczeniem po drobnych zmianach. Zazwyczaj nie używa skryptów.

9. Testowanie regresywne, nazywane również testowaniem weryfikacji, to proces sprawdzania istniejących aplikacji po wprowadzeniu zmian lub modyfikacji, aby upewnić się, że nadal spełniają one określone wymagania i że niezmieniony kod nie został naruszony. Celem jest wykrycie błędów, które mogły zostać przypadkowo wprowadzone w nowych kompilacjach, oraz zapewnienie, że wcześniej naprawione błędy nadal pozostały naprawione. Testy regresywne, które mogą obejmować testy funkcjonalne, testy jednostkowe, testy integracyjne i testy weryfikacji, są przeprowadzane po każdej modyfikacji kodu źródłowego, aby upewnić się, że wszystko nadal działa poprawnie. Mogą być wykonywane ręcznie w małych projektach, ale zwykle są automatyzowane ze względu na czasochłonność. Są one cenione w zwinnym wytwarzaniu oprogramowania, takim jak XP, RUP czy Scrum, jako istotny aspekt wspierający dynamiczny i iteracyjny rozwój produktów.

10. Testy niefunkcjonalne oceniają cechy jakościowe komponentu lub systemu, skupiając się na aspektach oprogramowania, które nie są bezpośrednio związane z funkcją lub działaniem użytkownika, takie jak skalowalność i bezpieczeństwo. Pokazują one, jak dobrze produkt się zachowuje i są wykonywane na wszystkich poziomach, podobnie jak testy funkcjonalne.

11. Testy niefunkcjonalne obejmują następujące rodzaje testów m.in.:
  • Testowanie dostępności
  • Testowanie bazowe
  • Testowanie zdolności
  • Testowanie zgodności
  • Testowanie zgodności z wymaganiami
  • Testowanie konfiguracji
  • Testowanie dokumentacji
  • Testowanie efektywności
  • Testowanie wytrzymałości
  • Testowanie funkcjonalności
  • Testowanie współdziałania
  • Testowanie instalacji
  • Testowanie obciążenia
  • Testowanie lokalizacji oraz internacjonalizacji
12. Testowanie dostępności to systemowe testowanie aplikacji przeciwko jej operacyjnym wymaganiom dotyczącym dostępności. Sprawdza stabilność aplikacji i wymagany czas przestoju do celów serwisowych. Rozpoczyna się, gdy wymagania dostępności są określone i w pełni wdrożone, odpowiednie komponenty oprogramowania przeszły testy jednostkowe, testowanie integracyjne oprogramowania zostało rozpoczęte, odpowiednie elementy systemu przeszły testy integracji systemu, a środowisko testowe jest gotowe. Kończy się, gdy istnieje co najmniej jeden przypadek testowy dla każdego wymagania dostępności operacyjnej lub gdy zestawy testów dla każdego planowanego wymagania dostępności operacyjnej zostały wykonane skutecznie.

13. Testowanie bazowe to rodzaj testów niefunkcjonalnych, które polegają na weryfikacji dokumentów i specyfikacji, na podstawie których zostaną zaprojektowane przypadki testowe. Jest to kluczowy element metodologii testowania wydajności, który pozwala na identyfikację i rozwiązanie 85% problemów z wydajnością, jeśli jest prawidłowo przeprowadzony. Główną zaletą jest oszczędność czasu, ponieważ system będzie już działać poprawnie, gdy rozpocznie się faktyczne testowanie obciążenia.

14. Testowanie zdolności to proces, który określa, ile użytkowników lub transakcji system może obsłużyć w jednostce czasu, spełniając jednocześnie warunki SLA (Service Level Agreements). Jest to korzystne dla planowania popytu i zdolności oraz ustalania priorytetów kosztów zasobów. Testy te zapewniają, że wydajność i bezpieczeństwo systemu nie są zagrożone podczas testowania aplikacji pod dużym obciążeniem. W przeciwieństwie do testów stresowych, gdzie system jest przeciążony do punktu "złamania", testy zdolności obciążają system tylko do momentu spełnienia warunków SLA. Testy zdolności są zatrzymywane, gdy osiągnięty zostanie punkt SLA. Pojemność testu zdolności, obliczana jako liczba jednoczesnych użytkowników, jest zazwyczaj mniejsza niż pojemność odpowiedniego testu stresowego.

15. Testowanie zgodności to proces sprawdzania, czy system, aplikacja lub strona internetowa jest zgodna z różnymi elementami, takimi jak przeglądarki internetowe, platformy sprzętowe, użytkownicy czy systemy operacyjne. Testy te oceniają, jak dobrze system działa w określonym środowisku i czy zapewnia satysfakcję klienta. Są one kluczowe dla oceny wpływu różnych wersji, rozdzielczości, prędkości Internetu na działanie aplikacji. Podczas testu sprawdza się również, czy aplikacja lub oprogramowanie jest kompatybilne ze sprzętem, systemem operacyjnym, bazą danych lub innym oprogramowaniem systemowym.

Rodzaje testów kompatybilności oprogramowania:
  • testowanie zgodności przeglądarki
  • sprzętu komputerowego
  • sieci
  • systemu operacyjnego
  • wersje
16. Testowanie konfiguracji to rodzaj testów niefunkcjonalnych, które polegają na testowaniu systemu na komputerach z różnymi kombinacjami sprzętu i oprogramowania. Ze względu na ogromną liczbę możliwych konfiguracji, nie jest możliwe przetestowanie wszystkich. Dlatego kluczowe jest dokładne planowanie, które platformy będą obsługiwane. Jeśli liczba kombinacji sprzętu i oprogramowania jest zbyt duża do dokładnego przetestowania, priorytetem powinno być testowanie różnych konfiguracji na podstawie takich czynników jak wielkość bazy, ryzyko związane z nieodkrytym błędem w konkretnej konfiguracji itp.

17. Testowanie dokumentacji to rodzaj testów niefunkcjonalnych, które polegają na analizie informacji opisujących, definiujących, określających, raportujących lub zaświadczających czynności, wymagania, procedury lub wyniki. Dokumentacja jest równie ważna dla sukcesu produktu jak sam produkt. Ułatwia proces testowania, oszczędza czas i pieniądze, a także umożliwia klientom łatwe przeglądanie procesów oprogramowania. Dobrze wykonana dokumentacja może zaoszczędzić czas, wysiłek i pieniądze organizacji. Dla większych firm, takich jak Microsoft, Adobe, Oracle, Apple, produkt lub oprogramowanie jest wytwarzane z odpowiednią dokumentacją, która pomaga każdemu użytkownikowi łatwo zrozumieć produkt. Dlatego prawidłowa dokumentacja jest kluczowa dla rozwoju oprogramowania.

18. Testowanie efektywności to rodzaj testów niefunkcjonalnych, które oceniają objętość kodu i zasoby potrzebne do wykonania określonej funkcji programu. Efektywność testowania oprogramowania polega na testowaniu przypadków testowych podzielonych na jednostki czasu w procesie wykonania. W organizacji dotyczy to ilości zużytych i wykorzystanych zasobów. Skuteczność testów oprogramowania obejmuje trzy aspekty: spełnienie wymagań klienta przez system/aplikację, osiągnięcie specyfikacji klienta przez system/aplikację oraz ilość wysiłku włożonego w rozwój systemu.

19. Testowanie wytrzymałości to rodzaj testów niefunkcjonalnych, które oceniają stabilność i wydajność systemu pod obciążeniem przez dłuższy okres czasu. Celem jest sprawdzenie, jak system działa podczas trwałego użytkowania - czy przepustowość i/lub czas reakcji po długim okresie przedłużonej aktywności są dobre lub lepsze niż na początku testowania. Testy te głównie identyfikują problemy z wyciekami pamięci, które mogą doprowadzić do awarii aplikacji lub systemu operacyjnego, ale również sprawdzają wykorzystanie zasobów, np. bazy danych.

20. Podczas testowania funkcjonalności, następujące elementy powinny być sprawdzone:
  • Proces instalacji i konfiguracji na lokalnych maszynach z różnymi systemami operacyjnymi,
  • Wprowadzanie tekstu, w tym użycie znaków specjalnych i alfabetów innych niż łaciński,
  • Główne funkcje aplikacji,
  • Podstawowe funkcje menu,
  • Obsługa ciągów znaków, tekstu i danych, szczególnie w kontekście interakcji z aplikacjami lub modułami nieobsługującymi Unicode,
  • Domyślne ustawienia regionalne,
  • Manipulacja tekstem (takie jak kopiowanie, wklejanie i edycja) zawierającym rozszerzone znaki, specjalne czcionki i alfabetów innych niż łaciński,
  • Precyzyjne skróty klawiszowe bez powielania.
21. Testowanie współdziałania to rodzaj testów niefunkcjonalnych, które oceniają zdolność oprogramowania do współpracy z innymi systemami lub komponentami oprogramowania. Jest to kluczowe, ponieważ wiele technologii jest wbudowanych w architekturę i składa się z wielu różnych części, które muszą działać jednolicie. Testy te obejmują zgodność formatu składni i danych, metody połączenia fizycznego i logicznego modułów systemu oraz cechy użytkowe. Oprogramowanie nie powinno powodować problemów operacyjnych, utraty danych lub funkcjonalności. Każdy składnik oprogramowania musi rozpoznawać dane przychodzące z innych programów, radzić sobie ze stresem swojej roli w architekturze i dostarczać dostępne, użyteczne wyniki.

22. Testowanie instalacji, również znane jako "Testowanie implementacji", to rodzaj testów niefunkcjonalnych, które sprawdzają, czy oprogramowanie zostało pomyślnie zainstalowane i działa prawidłowo po instalacji. Przed przeprowadzeniem tego typu testów, należy sprawdzić szereg czynników, takich jak: możliwość instalacji w domyślnej lokalizacji i zmiany tej lokalizacji, różne metody instalacji (np. z sieci, online, z płyty CD), możliwość instalacji bez uprawnień administracyjnych, poprawne działanie instalatora, kompatybilność z różnymi platformami, prawidłowe wyświetlanie interfejsu użytkownika podczas instalacji oraz spełnienie potrzeb użytkownika po zakończeniu instalacji. Testy te obejmują również "cichą instalację", gdzie wiadomości procesu instalacji nie są wyświetlane na interfejsie użytkownika, a wszystkie wiadomości są rejestrowane w plikach logów. Po usunięciu oprogramowania, wszystkie wcześniej zainstalowane pliki i wpisy rejestru powinny zostać usunięte, a użytkownik powinien mieć możliwość łatwego usunięcia lub naprawy aplikacji.

23. Testowanie obciążenia to rodzaj testów niefunkcjonalnych, które mają na celu zrozumienie zachowania aplikacji pod określonym oczekiwanym obciążeniem. Testy te oceniają działanie systemu w warunkach normalnych i krytycznych, pomagając określić maksymalną zdolność operacyjną aplikacji lub systemu, jak również wszelkie ograniczenia i elementy powodujące degradację. Testy obciążenia mogą być przeprowadzane w kontrolowanych warunkach laboratoryjnych, aby porównać możliwości różnych systemów lub dokładnie zmierzyć możliwości jednego systemu. W przeciwieństwie do testów stresowych, które przeciążają elementy systemu do momentu awarii, testy obciążenia sprawdzają, czy dana funkcja, program lub system może obsłużyć to, co zostało zaprojektowane.

24. Testy obciążeniowe pozwalają mierzyć czas odpowiedzi, szybkość przepustowości, poziom wykorzystania zasobów i identyfikować punkt załamania w testowanej aplikacji. Testy te mogą wykryć opóźnienia systemu, problemy z ładowaniem danych i obciążeniem zasobów. Testy obciążeniowe oprogramowania są przeprowadzane pod koniec cyklu produkcyjnego, kiedy można dokładnie symulować i testować rzeczywiste zaangażowanie użytkowników i wydajność systemu. Aby być dobrym testerem obciążenia, potrzebna jest nie tylko wiedza z inżynierii oprogramowania i testowania, ale także dobre zrozumienie psychologii użytkownika, jego ograniczeń percepcyjnych i preferencji.

25. Testowanie lokalizacji i internacjonalizacji to rodzaj testów niefunkcjonalnych. Internacjonalizacja to proces projektowania oprogramowania w taki sposób, aby można było dostosować je do różnych języków i regionów bez konieczności wprowadzania znacznych zmian w kodzie systemu/aplikacji. Lokalizacja natomiast to proces dostosowywania zinternacjonalizowanego oprogramowania do konkretnego regionu lub języka poprzez dodanie specyficznych elementów lokalnych i tłumaczenie tekstu. Kluczowa różnica polega na tym, że internacjonalizacja jest procesem dostosowywania produktów do potencjalnego użycia praktycznie wszędzie, podczas gdy lokalizacja polega na dodaniu specjalnych funkcji do użytku w konkretnej lokalizacji. Internacjonalizacja odbywa się raz na produkcie, a lokalizacja jest wykonywana raz dla każdej kombinacji produktu i lokalizacji. Oba procesy są komplementarne i muszą być połączone, aby osiągnąć cel, jakim jest aplikacja/system działający na całym świecie i w różnych językach.

26. Testowanie utrzymywalności to rodzaj testów niefunkcjonalnych, które oceniają, jak łatwo jest utrzymać, analizować, modyfikować i testować aplikację lub produkt. Testy te stosują model wymagań utrzymywalności oprogramowania/systemu i są określane pod względem wysiłku potrzebnego do wprowadzenia zmian w czterech kategoriach: naprawa, ulepszenia, adaptacja do zmian w środowisku i utrzymanie prewencyjne. Testowanie utrzymywalności obejmuje sprawdzenie norm rozwojowych, podział przetwarzania danych na podtransakcje, oddzielne realizowanie wejścia, przetwarzania i wyjścia, parametryzację programów, rozpowszechnianie systemu oraz optymalizację algorytmów.

27. Testowanie utrzymywalności to rodzaj testów niefunkcjonalnych, które oceniają różne aspekty systemu lub aplikacji, takie jak:
  • Kopiowanie zapasowe bazy danych: sprawdza, czy baza danych jest poprawnie kopiowana bez utraty danych.
  • Odzyskiwanie danych: przeprowadza się, gdy istnieje ryzyko utraty danych, sprawdza zdolność systemu do odzyskiwania i prawidłowego przywracania danych.
  • Instalacja i konfiguracja oprogramowania: sprawdza, czy oprogramowanie jest poprawnie instalowane i konfigurowane.
  • Wycofywanie: przeprowadza się, gdy nowe wdrożenie aplikacji nie działa zgodnie z oczekiwaniami, sprawdza zdolność systemu do powrotu do ostatniej działającej konfiguracji.
  • Praca awaryjna: weryfikuje, że aplikacja działa poprawnie, gdy zbędne komponenty nie działają.
28. Testowanie wydajnościowe to rodzaj testów niefunkcjonalnych, które oceniają szybkość wykonywania określonych aspektów systemu pod danym obciążeniem. Testy te mogą sprawdzić, czy system spełnia wymagania producenta lub dostawcy, porównać wydajność dwóch lub więcej programów lub systemów, lub zidentyfikować, które elementy systemu lub obciążenia powodują spadek wydajności. Testowanie wydajnościowe może również służyć do diagnozowania i lokalizowania wąskich gardeł w systemie. Proces ten może obejmować testowanie ilościowe, takie jak pomiar czasu reakcji lub liczby MIPS (milionów instrukcji na sekundę). Testowanie wydajnościowe jest często przeprowadzane w połączeniu z testami stresowymi.

29. Testowanie wydajnościowe to rodzaj testów niefunkcjonalnych, które oceniają szybkość działania systemu pod określonym obciążeniem. Istnieje wiele typów testów wydajnościowych, w tym:
  • Testy typu baseline: badają, jak system działa pod przewidywanym lub normalnym obciążeniem i tworzą punkt odniesienia dla innych testów.
  • Testy pojemnościowe: określają, ile użytkowników aplikacja może obsłużyć zanim wydajność lub stabilność zaczną się pogarszać.
  • Testy obciążenia: sprawdzają, jak system zachowuje się pod większym obciążeniem.
  • Testy stresu: sprawdzają, przy jakim obciążeniu system zaczyna się "załamywać".
  • Testy typu soak: są przeprowadzane przez długi okres czasu i sprawdzają niestabilności systemu, które pojawiają się z czasem.
  • Testy komponentów: testują konkretny, dyskretny element aplikacji lub systemu.
  • Testy skalowalności: są podobne do testów obciążenia, ale zamiast zwiększać liczbę żądań do systemu, zwiększają wielkość lub złożoność wysyłanych żądań.
  • Testy typu smoke: są przeprowadzane przy bardzo niskim obciążeniu i pokazują, że aplikacja działa zgodnie z oczekiwaniami. 
30. Testowanie przenośności to rodzaj testów niefunkcjonalnych, które oceniają, jak łatwo komponent oprogramowania lub aplikacja może być przeniesiona z jednego środowiska do drugiego. Testy te mierzą, jak system działa pod przewidywanym obciążeniem i tworzą punkt odniesienia dla innych testów. Testy przenośności obejmują testy na instalowalność, współistnienie lub kompatybilność, zdolność adaptacji i zastępowalność. Celem tych testów jest określenie, czy system spełnia wymagania producenta lub dostawcy, identyfikacja przyczyn awarii dotyczących wymagań przenoszenia, które pomagają określić defekty, które nie są skutecznie wykryte podczas testowania integracyjnego i jednostkowego, zgłoszenie tych awarii w celu ich naprawienia oraz określenie, w jakim stopniu system jest gotowy do uruchomienia.

31. Testowanie odzyskiwania to rodzaj testów niefunkcjonalnych, które oceniają, jak szybko aplikacja lub system może odzyskać pełną funkcjonalność po awarii lub innym zdarzeniu. Testy te polegają na wymuszaniu awarii oprogramowania różnymi metodami, aby sprawdzić, czy i jak poprawnie odzyskuje ono swoje funkcje. 

32. Testowanie wiarogodności i niezawodności to rodzaj testów niefunkcjonalnych, które mają na celu określenie niezawodności aplikacji/systemu i sprawdzenie, czy spełnia on wymogi wiarygodności klienta. Testowanie jest uznawane za rzetelne, jeżeli wielokrotnie uzyskuje ten sam wynik. Testowanie niezawodności ma na celu odkrycie najbardziej prawdopodobnych awarii podczas rzeczywistej eksploatacji.

Niezawodność oprogramowania, zdefiniowana przez ANSI, to prawdopodobieństwo bezawaryjnej pracy oprogramowania w określonym okresie czasu w określonym środowisku. Niezawodność oprogramowania nie jest bezpośrednią funkcją czasu, ponieważ oprogramowanie nie rdzewieje ani się nie niszczy.

Testowanie niezawodności oprogramowania można podzielić na trzy części: modelowanie, pomiar i poprawa. Modelowanie polega na zastosowaniu odpowiednich modeli do danego problemu. Pomiar niezawodności oprogramowania jest trudny, ponieważ nie można go bezpośrednio zmierzyć, więc mierzy się inne powiązane czynniki do oszacowania niezawodności oprogramowania. Poprawa niezawodności oprogramowania jest trudna z powodu ograniczeń czasowych i budżetowych.

33. Testowanie odporności to rodzaj testów niefunkcjonalnych, które mają na celu zapewnienie, że system nie posiada pojedynczych punktów awarii i pozostaje dostępny, czyli w stanie działania, nawet podczas pracy w warunkach błędu. Przykładowo, aplikacja powinna nadal funkcjonować w przypadku awarii sieci czy bazy danych. W takich sytuacjach powinny pojawiać się odpowiednie komunikaty o błędach tam, gdzie jest to wymagane.

34. Testy bezpieczeństwa to rodzaj testów niefunkcjonalnych, które mają na celu wykrycie błędów w mechanizmach bezpieczeństwa systemu informatycznego. Chociaż przeprowadzenie tych testów nie gwarantuje braku wad, pomaga w ochronie danych i utrzymaniu funkcjonalności systemu. Testy te obejmują elementy takie jak poufność, integralność, dostępność, uwierzytelnianie, autoryzację i niezaprzeczalność. Są one przeprowadzane w celu sprawdzenia, czy nie doszło do wycieku informacji, na przykład poprzez szyfrowanie aplikacji lub użycie oprogramowania i sprzętu zabezpieczającego. Testy bezpieczeństwa mogą być przeprowadzane na wiele różnych sposobów, w zależności od specyficznych wymagań bezpieczeństwa systemu.

35. Testowanie skalowalności to rodzaj testów niefunkcjonalnych, które oceniają zdolność systemu, sieci lub procesu do efektywnego działania podczas zmiany wielkości i możliwości przetwarzania w celu spełnienia rosnącego zapotrzebowania. Testy te mierzą zdolność aplikacji do skalowania w zakresie jej niefunkcjonalnych zdolności, takich jak obsługa obciążenia, liczba transakcji, ilość równoczesnych użytkowników, wielkość danych itp. Celem jest zrozumienie, w którym momencie aplikacja przestaje skalować się i zidentyfikowanie przyczyn tego zjawiska.

36. Testowanie typu Stress to rodzaj testów niefunkcjonalnych, które mają na celu sprawdzenie, jak system radzi sobie poza normalnymi warunkami operacyjnymi, często aż do punktu załamania. Testy te są wykorzystywane do określenia stabilności systemu, szczególnie pod dużym obciążeniem, a nie w normalnych warunkach. Celem jest zapewnienie, że oprogramowanie nie ulegnie awarii w warunkach niewystarczających zasobów obliczeniowych, takich jak brak pamięci czy miejsca na dysku. 

Podczas testów stresowych celowo tworzy się i utrzymuje niekorzystne środowisko, które jest stopniowo pogarszane, aż poziom wydajności spadnie poniżej określonego minimum lub system całkowicie przestanie działać. Testy te pozwalają na identyfikację konkretnych słabości i luk w systemie. 

Po awarii spowodowanej procesem testowania, końcowym etapem testów stresowych jest określenie, jak dobrze i jak szybko system może się odzyskać po niekorzystnym zdarzeniu. Testy stresowe są często przeprowadzane w połączeniu z bardziej ogólnym procesem testowania wydajności.

37. Testowanie typu Spike to rodzaj testów niefunkcjonalnych, które polegają na niespodziewanym obciążeniu systemu danymi, a następnie jego rozładowaniu. Celem jest obserwacja reakcji systemu na nieoczekiwane, krytyczne zmiany w aktywności, takie jak gwałtowny wzrost i spadek. Testy te są przeprowadzane w różnych okresach czasu, podczas których aplikacja jest poddawana niezwykle intensywnej, jednoczesnej aktywności użytkowników. Głównym celem testowania typu Spike jest sprawdzenie, czy system jest w stanie utrzymać dramatyczne zmiany w obciążeniu i jak wpływają one na jego wydajność.

38. Testowanie użyteczności to rodzaj testów niefunkcjonalnych, które oceniają łatwość użycia interfejsów użytkownika i sprawdzają, czy aplikacja lub system jest przyjazny dla użytkownika. Testy te skupiają się na nawigacji, układzie, szybkości i treści, a także na porównaniu z wcześniejszymi lub podobnymi aplikacjami lub systemami.

Testy użyteczności obejmują pięć kluczowych elementów:

  • Przyswajanie - jak łatwo nowi użytkownicy mogą wykonać podstawowe zadania?
  • Wydajność - jak szybko doświadczeni użytkownicy mogą zrealizować zadania?
  • Zapamiętywalność - czy użytkownik jest w stanie po długiej przerwie efektywnie korzystać z aplikacji/systemu, czy musi na nowo uczyć się wszystkiego?
  • Błędy - ile błędów użytkownicy popełniają, jak poważne są te błędy i jak łatwo można się z nich otrząsnąć?
  • Satysfakcja - jak bardzo system podoba się użytkownikowi?

Celem tych testów jest zapewnienie, że system jest nie tylko funkcjonalny, ale także łatwy i przyjemny w użyciu.

39. Testy użyteczności przynoszą korzyści zarówno dla użytkowników końcowych, jak i dla procesu testowania. Dla użytkowników końcowych oznaczają one lepszą jakość oprogramowania, łatwość użycia, akceptację oprogramowania i skrócony czas nauki dla nowych użytkowników. 

Z punktu widzenia procesu testowania, testy użyteczności mogą być modyfikowane do pokrycia wielu innych rodzajów testów, są ekonomiczne, skuteczne i korzystne, jeśli są odpowiednio planowane. Mogą pomóc w wykrywaniu potencjalnych błędów i luk w systemie, które mogą nie być widoczne dla twórców lub innych typów testów. 

Osoby zaangażowane w testy użyteczności muszą posiadać umiejętności takie jak cierpliwość, umiejętność słuchania sugestii, otwartość na przyjęcie nowych pojęć i dobre umiejętności obserwacji, aby wykryć i naprawić problemy.

40. Testy objętości to rodzaj testów niefunkcjonalnych, które polegają na testowaniu aplikacji lub systemu z określoną ilością danych. Celem tych testów jest sprawdzenie, jak system radzi sobie z dużą ilością danych, na przykład poprzez rozszerzenie bazy danych do określonego rozmiaru i testowanie działania aplikacji na tym zbiorze danych.

Testy objętości mają na celu określenie wydajności systemu wraz ze wzrostem ilości danych w bazie danych. Sprawdzają, czy nie dochodzi do utraty danych, jak długi jest czas reakcji systemu i czy dane są przechowywane prawidłowo. W przeciwieństwie do testów obciążenia, które skupiają się na przewidywanych poziomach obciążenia, testy objętości koncentrują się na dużej ilości danych w bazie danych.

41. Testowanie strukturalne to podejście, które polega na testowaniu wewnętrznej struktury oprogramowania. Testerzy muszą mieć wiedzę o wewnętrznej implementacji kodu i sposobie działania oprogramowania.

Testy strukturalne mogą być stosowane na każdym poziomie testowania, od testowania komponentów po testowanie integracji komponentów, testowanie systemu i testowanie akceptacyjne. W zależności od poziomu, struktury testowane mogą być różne, na przykład zakres opcji menu lub główne operacje biznesowe mogą być elementem strukturalnym w testowaniu systemu i testowaniu akceptacyjnym.

42. Testowanie strukturalne obejmuje następujące techniki:
  • Pokrycie wypowiedzi - polega na wykonaniu wszystkich instrukcji programowania przy minimalnej liczbie testów.
  • Pokrycie gałęzi - inicjuje serię testów, aby zapewnić, że wszystkie gałęzie przetwarzania aplikacji/systemu są sprawdzane co najmniej raz.
  • Pokrycie ścieżki - polega na testowaniu wszystkich możliwych ścieżek, co oznacza, że każda instrukcja i gałąź są sprawdzane podczas testu.