Przejdź do:
Systemy informatyczne i aplikacje stanowią dziś nieodłączną część naszego życia w każdym jego obszarze – od systemów medycznych, bankowych, po produkty użytkowe jak smartfon czy samochód. Dla każdego użytkownika istotne jest, by oprogramowanie, z którego korzysta, działało prawidłowo, szybko i można było z niego korzystać w sposób intuicyjny.
Nieprawidłowe funkcjonowanie oprogramowania nie tylko przysparza użytkownikowi stresu i nerwów, ale generuje również wiele problemów dla producenta, tj. jak dodatkowe koszty czy straty wizerunkowe. By zapobiec takiemu scenariuszowi, wydawcy oprogramowania coraz częściej decydują się na wdrożenie testowania w procesie jego tworzenia. Niektóre branże nawet wymagają przeprowadzania testów, gdy na przykład od poprawnego działania programu zależy życie ludzkie.
Co to jest testowanie oprogramowania?
Testowanie to poddawanie czegoś próbie z oczekiwaniem na konkretny wynik. Test w szkole sprawdza, czy uczeń posiada określoną wiedzę z danego przedmiotu. Testy samochodu mogą sprawdzać np. wytrzymałość czy poziom bezpieczeństwa kierowcy i pasażerów podczas zderzenia z przeszkodą. Przeprowadzanie testów oprogramowania będzie sprawdzać poprawność i zgodność implementacji oprogramowania z założeniami. Będą też określać, w jakim stopniu dana aplikacja jest zrozumiała i przydatna dla przyszłego odbiorcy.
Ile razy zdarzyło ci się, że wchodząc na jakąś stronę, zauważyłeś jakieś niedociągnięcie? Coś się nie odświeżyło, a może nie udało się zarezerwować terminu u lekarza, bo na końcu rezerwacji wyskoczył błąd? A może zdenerwowałeś się, bo strona wyświetlana na ekranie smartfonu nie pokazała się w całości, co utrudniło lub nawet uniemożliwiło wyświetlenie całej jej treści? Testowanie oprogramowania ma za zadanie zapewnić najwyższą jakość produktu. Umożliwia ocenę jego jakości, ale przede wszystkim zmniejsza ryzyko awarii podczas użytkowania.
„Proces składający się ze wszystkich czynności cyklu życia, zarówno statycznych, jak i dynamicznych, skoncentrowany na planowaniu, przygotowaniu i ewaluacji oprogramowania oraz powiązanych produktów w celu określenia, czy spełniają one wyspecyfikowane wymagania, na wykazaniu, że są one dopasowane do swoich celów oraz na wykrywaniu usterek”.
Definicja testowania oprogramowania zaczerpnięta z syllabusa ISTQB
Rozmiar i złożoność oprogramowania szybko rosną. Jak wynika z definicji sylabusa ISTQB, testowanie oprogramowania to dość złożony proces towarzyszący tworzeniu produktu, jak i jego rozwojowi. Tester poza szukaniem defektów pomaga zapobiegać ich powstawaniu, raportuje wyniki swojej pracy oraz dokonuje oceny jakości przedmiotu testów.
Testowanie dynamiczne
Szukanie defektów, o jakich wspomniałam wyżej, obejmuje testowanie dynamiczne – czyli takie, które wymaga uruchomienia testowanego systemu lub jego części
Testowanie statyczne
Istnieje jeszcze technika testowania statycznego pomagająca wykryć defekty, zwiększyć spójność i wewnętrzną jakość oprogramowania – będzie to na przykład przegląd dokumentacji lub kodu systemu bez uruchamiania go.
Przeczytaj także: Quality Assurance (QA) – zapewnij jakość w twoich projektach IT
Jakie są poziomy testów oprogramowania?
Na poszczególnych etapach wytwarzania oprogramowania zakres i ilość testów określa model zwany piramidą testów. U jej podstawy będą testy szybkie do wykonania niewielkim kosztem, pozwalające wykryć defekty w początkowej fazie projektu.
Na szczycie piramidy są z kolei testy sprawdzające całą funkcjonalność oprogramowania, czasochłonne, a zatem kosztowne, wykonywane w końcowej fazie projektu.
- Testy jednostkowe (unit testy)
Wykonywane przez programistów / developerów, polegają na testowaniu pojedynczych fragmentów oprogramowania. Może to być pojedyncza klasa, metoda czy funkcja w kodzie. Skupiają się na weryfikacji, czy wymagania dla testowanej jednostki są spełnione, a także na sprawdzeniu wszystkich ścieżek w kodzie oraz wartości brzegowych. Wyłapują błędy logiczne w implementacji. Wykonuje się je szybko i nie wymagają uruchomienia całego systemu, a tylko jego odizolowanego małego fragmentu. Dzięki temu testy jednostkowe są bardzo skuteczne, a wykrycie i naprawa defektu zajmują mało czasu.
- Testy integracyjne
Testy integracyjne również są domeną programistów. Wykonuje się je po testach jednostkowych i mają na celu sprawdzić poprawność integracji pomiędzy danymi komponentami. Testy integracji wykrywają błędy w komunikacji pomiędzy współpracującymi elementami systemu (zakładając, że poszczególne elementy samodzielnie działają poprawnie). Testy integracji pomiędzy poszczególnymi modułami są bardziej zaawansowane niż testy jednostkowe, są też bardziej czasochłonne, a znalezione usterki mogą obejmować większy obszar systemu. Przykładem takich testów może być współpraca między aplikacją webową a bazą danych, jak również komunikacja pomiędzy dwiema klasami wewnątrz kodu.
- Testy End-to-End
Testy systemowe, przeprowadzane w finalnej fazie projektu na zintegrowanym systemie, wykonywane przez testerów, mają za zadanie sprawdzić działanie aplikacji jako całości. Wykonuje się je powoli, trudno je w pełni zautomatyzować, wymagają częstych modyfikacji, przez co są drogie i trudne w utrzymaniu. Testy systemu są jednak niezbędne, jako że badają zachowanie kompletnej aplikacji.
- Testy akceptacyjne
Poza piramidą jest jeszcze poziom testów akceptacyjnych, które są wykonywane w celu upewnienia się, że aplikacja spełnia oczekiwania klienta i użytkowników – i to właśnie oni są odpowiedzialni za ich wykonanie. Przykładem mogą być testy akceptacyjne (UAT – User Acceptance Tests), które wykrywają wszelkie niezgodności ze specyfikacją biznesową, oraz testy akceptacji operacyjnej OAT (Operational Acceptance Tests) sprawdzające na przykład zachowanie systemu podczas awarii.
Jakie są typy testów oprogramowania?
Testować aplikacje możemy na wiele sposobów, a wykonywane testy mogą mieć różne cele. To właśnie wspomniane cele definiują typy testów – będziemy sprawdzać funkcjonalność, wydajność systemu lub upewniać się, że po implementacji poprawek wszystko działa, jak należy.
Wyróżniamy cztery podstawowe typy testów, które z kolei dzielą się na wiele rodzajów.
Testy funkcjonalne
Testowanie funkcjonalne jest nazywane również testami czarnej skrzynki (lub też czarnoskrzynkowymi). Definiują one czynności wykonywane przez oprogramowanie. Testy funkcjonalne są zwykle opisane w specyfikacji wymagań jako przypadki użycia, a do ich wykonania nie jest konieczna znajomość wnętrza systemu. Definiuje się je jako zewnętrzne zachowanie systemu, traktując je jak czarną skrzynkę. Osoba przeprowadzająca testy jest w stanie przetestować aplikację względem wymagań funkcjonalnych zwykle bez posiadania skomplikowanej wiedzy teoretycznej.
Testy niefunkcjonalne
Określane też jako testy jakościowe, definiowane często krótkim zdaniem: „jak działa system”.
Testowanie niefunkcjonalne pozwala m.in. sprawdzić:
- użyteczność – czyli jak przydatna i intuicyjna jest aplikacja – najprościej: czy „będzie pan zadowolony”. Pod uwagę bierze się również takie aspekty jak estetyka oraz to, czy doświadczenia użytkownika w trakcie korzystania z aplikacji są pozytywne, a często także – czy aplikacja jest dostosowana do potrzeb osób z niepełnosprawnościami,
- bezpieczeństwo – czy nikt nie wykradnie naszych danych z systemu oraz na ile jest on zabezpieczony przed atakami osób trzecich. Do tego typu testów zalicza się na przykład testy penetracyjne, które symulują rzeczywisty atak, a także pozwalają dokonać oceny ryzyka – analizuje się wówczas i identyfikuje największe zagrożenia bezpieczeństwa,
- niezawodność – czy system jest w stanie działać poprawnie przez określony czas i w określonych warunkach. W tym przypadku następuje również weryfikacja tolerowania usterek przez oprogramowanie. Sprawdzamy zdolność systemu do kontynuowania działania podczas wystąpienia awarii oraz zdolność odtworzenia – odzyskania danych po awarii mierzone w czasie i stratach,
- wydajność – jak dużo system wytrzyma. Czy będzie działał stabilnie w warunkach różnego obciążenia, jak szybko będzie reagować na polecenia oraz w jakim czasie będą wykonywały się obliczenia i jak szybka będzie komunikacja z innymi systemami. Testy wydajności opierają się zwykle na określeniu profili produkcyjnych na podstawie przewidywań lub doświadczeń z podobnymi systemami,
- utrzymywalność – mierzy stopień możliwych modyfikacji systemu w przyszłości, celem minimalizacji przestojów w działaniu aplikacji niezbędnych do jej utrzymania oraz minimalizacji kosztów utrzymania. Istotne będzie tutaj utrzymanie przejrzystości kodu oraz prowadzenie dokumentacji,
- przenaszalność – określa poziom skomplikowania przenoszenia aplikacji pomiędzy różnymi środowiskami. Bada zdolności adaptacyjne systemu – na przykład czy istnieje możliwość zainstalowania go na wszystkich systemach docelowych,
- kompatybilność – sprawdza możliwość współistnienia różnych programów na tym samym środowisku oraz możliwość działania przy różnych parametrach. Przykładowo, czy oprogramowanie działa na różnych urządzeniach, systemach czy przeglądarkach internetowych tak samo.
Świadomość testów niefunkcjonalnych mocno rośnie, sprawdzają one bardzo ważne funkcje systemu. Rzeczywistość niejednokrotnie zweryfikowała już ich znaczenie. Zagrożenia, jakie niesie za sobą ich brak w procesie testowym, to wycieki poufnych danych klientów, zablokowane strony dla okupu, niedziałające płatności w sklepach internetowych czy zwyczajnie brak intuicyjności aplikacji lub zniechęcający design.
Przeczytaj także: Testy niefunkcjonalne – wszystko, co warto wiedzieć
Testy strukturalne
Inaczej nazywane testami białoskrzynkowymi. Mogą być wykonane na wszystkich poziomach testowych. Najprościej rzecz ujmując – to testowanie kodu. Wykonuje się je jako wsparcie pomiarów dokładności poprzez ocenę pokrycia kodu, która jest mierzona wykonaniem kodu przy pomocy szeregu testów, wyrażone procentowo dla pokrytych elementów.
Testy związane ze zmianami
Dzielimy je na testy regresji oraz testy potwierdzające. Oba typy mogą zostać wykonane na wszystkich poziomach testowych.
- Testy potwierdzające – to ponowne testy po naprawie defektu, wykonywane celem upewnienia się, że defekt został usunięty.
- Testowanie regresywne – ma na celu sprawdzenie, czy podczas naprawy lub zmian w aplikacji nie powstały inne defekty w danym module lub w niezmienionej części oprogramowania.
Poza wyszczególnionymi typami testów wspomnę jeszcze o takich, które przy zmianach czy naprawie oprogramowania pozwalają uniknąć marnowania czasu – mianowicie smoke i sanity. Testy dymne (smoke) sprawdzają, czy aplikację da się uruchomić i czy jej podstawowe funkcje działają, natomiast testy kondycji (sanity) weryfikują nową funkcjonalność bez sprawdzania, czy reszta działa.
Metody testowania oprogramowania
Zawód testera kryje różne specjalizacje. Możemy testować manualnie lub pisać testy automatyczne. Ta pierwsza ścieżka nie wymaga zaawansowanej wiedzy technicznej, dlatego wiele osób wybiera ją na początku kariery w testach. Tester automatyzujący z kolei powinien spełniać już wyższe wymagania, o czym poniżej.
Testowanie manualne
Tester ręcznie sprawdza wszystkie istotne w kontekście jakości i specyfikacji cechy oprogramowania, wykonuje przypadki testowe oraz opracowuje raporty testowe. Przykładem testów ręcznych są testy eksploracyjne (nie znając wcześniej aplikacji, tester uczy się jej, jednocześnie weryfikując jej funkcjonowanie) lub testy oparte o specyfikację, gdzie przypadki testowe tworzy się na podstawie wymagań funkcjonalnych.
Do testowania manualnego nie są wymagane zdolności programistyczne, ale intuicja, dociekliwość i chęci do uczenia się. Warto jednak pamiętać, że praca w IT to potrzeba ciągłego rozwoju ze względu na szybki postęp technologii.
Testowanie automatyczne
Testowanie automatyczne pozwala na wykonanie powtarzalnych zadań i testów regresji w krótkim czasie, z możliwością wielokrotnego odtworzenia. Oczywiście najpierw trzeba takie testy przygotować.
Przed testerem automatyzującym stoją już nieco wyższe wymagania. W tym przypadku należy znać język programowania, w którym będziemy tworzyć testy. W testowaniu automatycznym przypadki testowe wykonuje się z użyciem odpowiednich narzędzi / bibliotek i przygotowanych przez testera skryptów na potrzeby danego scenariusza, co pozwala zautomatyzować część scenariuszy testowych. Skrypt zwraca porównanie rzeczywistego wyniku z oczekiwanym, dzięki czemu szybko i jednoznacznie jesteśmy w stanie stwierdzić, czy oprogramowanie działa zgodnie z założeniami.
Kto może zostać testerem oprogramowania?
Zawód testera na starcie wymaga podstawowych kompetencji miękkich i zdolności technicznych. Niezależnie od tego, czy mówimy o testach manualnych, czy automatycznych tester powinien być osobą skrupulatną, dociekliwą, komunikatywną, asertywną, mieć dużo cierpliwości, potrafić pracować w zespole oraz nie bać się zgłaszać błędy.
Testowanie oprogramowania – od czego zacząć?
Zawód testera oprogramowania aktualnie znajduje się w czołówce najpopularniejszych w branży i dzięki temu chętni mają dużo większy, niż jeszcze kilka-kilkanaście lat temu, dostęp do różnego rodzaju szkoleń, kursów czy nawet bezpłatnych webinarów. Przeczytanie książki o testowaniu czy zainteresowanie się sylabusem ISTQB również będą dobre na początku testerskiej drogi. Niektóre firmy oferują również szkolenia z możliwością płatnych staży.
Tester oprogramowania ciągle się rozwija
Samo przyswojenie wiedzy o testach to nie wszystko. W zawodzie testera trzeba być mocno nastawionym na ciągłą naukę – dotyczy to nie tylko początkujących testerów oprogramowania, ale nawet tych, którzy mają doświadczenie w branży. Dzieje się tak dlatego, że technologie i oprogramowanie, z którymi pracuje tester oprogramowania, ciągle ewoluują. Osoba zajmująca się testami oprogramowania jest więc odpowiedzialna za ciągłe zdobywanie wiedzy, m.in. jak i z czego zbudowana jest aplikacja i jakie problemy mogą z tego wynikać, oraz jakie technologie i narzędzia mogą posłużyć ich namierzeniu i wyeliminowaniu.
IT to nie tylko języki programowania…
Bardzo istotną sprawą w branży IT jest też znajomość języków obcych (angielskiego, niemieckiego, francuskiego). Wielu testerów daje sobie radę bez tej umiejętności, jednak prędzej czy później, zwłaszcza w miarę rozwoju umiejętności, rynek weryfikuje kompetencje językowe. Testerzy znający język angielski na poziomie B2-C1 z powodzeniem odnajdują się w projektach międzynarodowych i mają większe możliwości znalezienia rozwiązań problemów np. w anglojęzycznych bazach wiedzy, czy na forach społeczności testerskiej. Znajomość tego języka daje też większe perspektywy na rynku pracy.
Podsumowanie
Testowanie oprogramowania jest złożonym procesem i nie polega – jak powszechnie się uważa – wyłącznie na sprawdzeniu, czy program działa, jak należy. Testowanie to również zapobieganie powstawaniu defektów w przyszłości, szukanie niepożądanych skutków zmian, raportowanie wyników swojej pracy oraz ocenie jakości przedmiotu testów.
Testy zwiększają spójność, wewnętrzną jakość i intuicyjność oprogramowania. Pomagają też zachować estetyczny wygląd aplikacji. Różne poziomy i typy testów wykonywanych na poszczególnych, a czasem na wszystkich etapach tworzenia systemu, pomagają zapewnić najwyższą jakość aplikacji. A ponieważ tych powstaje coraz więcej, nie dziwi zainteresowanie testami. Dociekliwy, cierpliwy, komunikatywny, asertywny i skrupulatny tester oprogramowania, który lubi szukać dziury w całym, to coraz częściej osoba, bez której trudno obecnie wyobrazić sobie cykl rozwoju oprogramowania.