Testy w programowaniu

POZIOMY I TYPY TESTÓW OPROGRAMOWANIA

Istnieje wiele różnych typów testów, które mogą zostać wykorzystane w procesie tworzenia oprogramowania w celu upewnienia się, że wszystkie wprowadzane zmiany w kodzie działają zgodnie z zamierzeniami i oczekiwaniami. Nie wszystkie testy opierają się jednak na tych samych założeniach. Poniższy artykuł przedstawia różnice pomiędzy różnymi typami testów stosowanych w procesie tworzenia oprogramowania.

                                          Typy i poziomy testów

Testy ręczne i automatyczne

W pierwszej kolejności musimy dokonać podstawowego rozróżnienia między testami ręcznymi i automatycznymi. Testy ręczne, określane w niektórych źródłach mianem „testów manualnych” są wykonywane osobiście przez testerów przeklikujących się przez kolejne elementy aplikacji lub korzystających z odpowiednich narzędzi w celu interakcji z oprogramowaniem i interfejsami API. Tego typu testy są bardzo kosztowne, ponieważ wymagają one zatrudnienia testerów, skonfigurowania środowiska i przeprowadzenia odpowiednich testów, dodatkowo mogą być także podatne na błędy ludzkie z racji tego, że testerzy mogą na przykład popełniać literówki lub pomijać niektóre kroki ujęte w skrypcie testowym.

Testy automatyczne są natomiast wykonywane przez maszynę, która realizuje założenia uprzednio przygotowanego skryptu testowego. Testy tego typu mogą w znacznym stopniu różnić się od siebie złożonością, obejmując zarówno bardzo proste testy polegające na weryfikacji działania pojedynczej metody w danej klasie, jak i testy sprawdzające czy wykonanie sekwencji złożonych czynności w interfejsie użytkownika będzie każdorazowo prowadziło do uzyskania takich samych rezultatów. Automatyczne testowanie oprogramowania przebiega dużo sprawniej i jest dużo bardziej niezawodne w porównaniu z testowaniem manualnym, jednak jakość testów automatycznych zależy bezpośrednio od jakości opracowanych skryptów testowych.

Testy automatyczne stanowią kluczowy element praktyk takich jak ciągła integracja oraz ciągłe dostarczanie. Są także doskonałym sposobem na skalowanie procesu zapewnienia jakości w miarę dodawania nowych funkcji do aplikacji. Pomimo tego, w dalszym ciągu warto jednak przeprowadzać testy manualne korzystając z praktyki tak zwanego testowania eksploracyjnego, która została opisana w dalszej części naszego przewodnika.

Poziomy testów

Testy jednostkowe

Testy jednostkowe są przeprowadzane na bardzo niskim poziomie aplikacji, bardzo zbliżonym do kodu źródłowego oprogramowania i polegają na testowaniu poszczególnych metod i funkcji klas, komponentów lub modułów wykorzystywanych w programie. Automatyzacja testów jednostkowych jest z reguły dość tania, a dodatkowo mogą one być bardzo szybko przeprowadzane przez serwer ciągłej integracji.

Testy integracyjne

Testy integracyjne sprawdzają, czy różne moduły lub usługi wykorzystywane przez oprogramowanie dobrze ze sobą współpracują. Tego poziomu testy mogą być stosowane na przykład w celu sprawdzania interakcji aplikacji z bazą danych lub upewnienia się, że mikro-usługi działają zgodnie z postawionymi wymaganiami i oczekiwaniami. Wykonywanie tego poziomu testów jest droższe, ponieważ wymagają one uruchomienia wielu elementów aplikacji.

Testy poziomu end-to-end

Testy poziomu end-to-end symulują zachowanie użytkownika korzystającego z oprogramowania w pełnym środowisku aplikacji. Tego poziomu testy sprawdzają czy wszystkie elementy aplikacji działają zgodnie z założeniami. W związku z tym niektóre spośród nich mogą być niezwykle proste i polegać na załadowaniu strony internetowej lub zalogowaniu się, podczas gdy bardziej złożone scenariusze mogą obejmować między innymi sprawdzanie poprawności działania powiadomień e-mail, płatności online i wielu innych elementów.

Testy end-to-end są bardzo przydatne, jednak ich realizacja jest kosztowna, a co więcej, mogą być także trudne w utrzymaniu w przypadku ich automatyzacji. Z tego powodu zaleca się przeprowadzanie wyłącznie kilku kluczowych testów typu end-to-end i poleganie w większym stopniu na testach niskopoziomowych (jednostkowych i integracyjnych) w celu szybkiej identyfikacji błędów w aplikacji.

Testy akceptacyjne

Testy akceptacyjne są formalnymi testami oprogramowania przeprowadzanymi w celu sprawdzenia, czy dany system spełnia stawiane przed nim wymagania biznesowe. Wymagają one uruchomienia i poprawnego działania całości aplikacji i polegają na replikowaniu zachowań użytkowników. Tego poziomu testy mogą także obejmować nieco szerszy zakres, w który może wejść między innymi pomiar wydajności systemu oraz odrzucenie zmian w przypadku, gdy nie pozwalają one na osiągnięcie postawionych celów i wymagań.

Typy testów oprogramowania

Testy funkcjonalne

Testy funkcjonalne koncentrują się na wymaganiach biznesowych, które ma spełniać dana aplikacja. Tego typu testy skupiają się wyłącznie na sprawdzeniu wyników operacji, całkowicie pomijając stany pośrednie systemu podczas ich wykonywania.

Czasem testy integracyjne i funkcjonalne są ze sobą mylone, ponieważ oba ich rodzaje wymagają interakcji wielu części składowych aplikacji. Różnica pomiędzy tymi rodzajami testów polega na tym, że test integracyjny może po prostu polegać na sprawdzeniu, czy aplikacja jest w stanie wysłać zapytanie do bazy danych, podczas gdy celem testu funkcjonalnego jest uzyskanie określonej wartości z bazy danych, zgodnie z wymaganiami produktu.

Testy wydajności

Testy wydajności sprawdzają działanie systemu pod dużym obciążeniem. Tego typu testy są zaliczane do grupy testów niefunkcjonalnych i mogą być przeprowadzane w różny sposób, aby dokładnie zbadać i sprawdzić niezawodność, stabilność i dostępność platformy. Za przykład testu wydajności może posłużyć mierzenie czasu odpowiedzi podczas wykonywania dużej liczby zapytań lub obserwacja zachowania i działania systemu w przypadku pracy z dużą ilością danych.

Wdrażanie i przeprowadzanie testów wydajności jest z natury dość kosztowne, jednak mimo to dzięki nim możliwe jest sprawdzenie czy nowe zmiany spowodują pogorszenie działania systemu.

Testy dymne

Testy dymne to podstawowe testy sprawdzające najważniejsze funkcje i działanie aplikacji. Podstawową zaletą tego typu testów jest ich szybka realizacja, a ich głównym celem jest zapewnienie, że najważniejsze funkcje i elementy systemu działają zgodnie z oczekiwaniami.

Testy dymne najczęściej stosuje się po dostarczeniu kolejnej wersji kodu w celu sprawdzenia czy przeprowadzenie dalszych testów jest w ogóle możliwe, a także na przykład bezpośrednio po wdrożeniu, aby upewnić się, że aplikacja działa poprawnie w nowym środowisku.

Testy eksploracyjne

Wraz ze wzrostem liczby funkcji i usprawnień w kodzie rośnie liczba testów, które należy przeprowadzić, aby upewnić się, że system działa poprawnie. Dodatkowo warto także sprawdzić, czy raz naprawione błędy nie pojawiają się w kolejnych wersjach aplikacji. Kluczem do osiągnięcia tego celu jest automatyzacja testów, a ich tworzenie prędzej czy później stanie się częścią procesu tworzenia oprogramowania.

Niektórzy zapytają w tym momencie, czy w związku z tym w dalszym ciągu warto przeprowadzać testy manualne? Krótka odpowiedź na to pytanie brzmi „tak, warto”,  jednak testowanie manualne powinno koncentrować się przede wszystkim na testach eksploracyjnych, których celem będzie wykrycie nieoczywistych błędów.

Sesja testów eksploracyjnych nie powinna trwać dłużej niż dwie godziny i musi mieć określony wyraźny zakres pozwalający testerom skupić się na konkretnych elementach oprogramowania. Po wprowadzeniu, zadaniem testerów jest wypróbowanie i sprawdzenie różnych działań w celu weryfikacji zachowania i odpowiedzi systemu. Tego typu testy są kosztowne, jednak są jednocześnie bardzo pomocne w wykrywaniu różnorodnych problemów z interfejsem użytkownika lub weryfikacji złożonych procesów pracy użytkowników. Warto je przeprowadzać w szczególności po dodawaniu nowych funkcji do aplikacji, ponieważ oferują one możliwość sprawdzenia, jak zachowa się ona w skrajnych przypadkach.

Uwaga na temat testów

Chcielibyśmy zakończyć ten przewodnik po testach krótką uwagą na temat samego celu przeprowadzania testów oprogramowania. Pomimo tego, że ważne jest sprawdzenie czy użytkownicy mogą korzystać z aplikacji (czy mogą się zalogować lub zapisać dany obiekt), równie ważne jest upewnienie się, czy cały system nie ulegnie awarii w przypadku wprowadzenia błędnych danych lub w sytuacji, gdy użytkownik zrobi coś niespodziewanego. Warto przewidzieć co się stanie, gdy użytkownik popełni literówkę, spróbuje przesłać formularz, który nie został wypełniony do końca lub użyje niewłaściwego API. Warto także sprawdzić, czy niepowołane osoby mogą uzyskać w łatwy sposób dostęp do danych lub zasobów, do których nie powinny mieć dostępu. Dobry pakiet testów powinien obejmować także próby zepsucia aplikacji, dzięki którym będzie możliwe zrozumienie jej ograniczeń.

Dodatkowo trzeba także mieć na uwadze to, że testy również stanowią kod! Należy zatem pamiętać o nich podczas przeglądu kodu, ponieważ to właśnie one mogą być ostatnim krokiem przed wdrożeniem aplikacji w środowisku produkcyjnym.

Leave a Comment

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *