Testowanie środowiska sieciowego ma kluczowe znaczenie z wielu powodów. Pamiętajmy, że sieć nie istnieje sama dla siebie. Jest warstwą transportową dla danych i aplikacji i musi spełniać określone parametry. Inne wymagania stawiamy sieci operatorskiej, a jeszcze inne sieci korporacyjnej, w której działa wrażliwa na opóźnienia baza danych. Inne wymagania będzie miała sieć, która służy do przesyłania dużych plików wideo podlegających obróbce, a jeszcze inne sieć przeznaczona do rozrywki i wspólnego grania online. Co więcej, jeżeli nasze przedsiębiorstwo posiada sieć testową, w której testujemy rozwiązania czy aplikacje, ważne jest, aby samo środowisko testowe jak najbardziej odzwierciedlało parametry pracy środowiska produkcyjnego. Nie porównamy ich bez przeprowadzania odpowiednich testów w obu tych środowiskach i porównania ze sobą wyników. 

Sieci komputerowe powinno się testować w sposób ciągły, zwłaszcza w dynamicznie zmieniających się środowiskach, gdzie regularnie wprowadza się zmiany w konfiguracji, oprogramowaniu lub infrastrukturze. Ciągłe testowanie sieci jest kluczowe do zapewnienia wysokiej dostępności, wydajności i bezpieczeństwa sieci. Proces ten musi być zautomatyzowany – firm nie stać na to, by powtarzalne czynności wykonywać manualnie. Użycie narzędzi do automatyzacji umożliwia regularne i systematyczne przeprowadzanie testów funkcjonalnych, testów obciążeniowych, testów bezpieczeństwa i innych, bez potrzeby ciągłego angażowania zasobów ludzkich. Integracja testów sieciowych z ciągłymi procesami integracji (CI) i dostarczania (CD) umożliwia automatyczne wykonywanie testów przy każdej zmianie kodu lub konfiguracji, co pozwala na szybką identyfikację i rozwiązywanie problemów. Ciągłe monitorowanie sieci i zbieranie danych telemetrycznych pozwalają na bieżące śledzenie wydajności i bezpieczeństwa sieci, umożliwiając szybką reakcję na wykryte problemy. 

Ciągłe testowanie sieci jest więc fundamentalne dla utrzymania ciągłości działania, wydajności i bezpieczeństwa sieciowych usług w organizacjach. Pozwala na proaktywne identyfikowanie i rozwiązywanie problemów, zanim staną się one krytyczne, co jest szczególnie ważne w kontekście rosnących wymagań dotyczących dostępności i bezpieczeństwa w świecie cyfrowym. Testy, które przeprowadzamy nie powinny być to tylko małe testy jednostkowe sprawdzające pojedynczy aspekt funkcjonalności sieci. W dzisiejszych czasach buduje się zaawansowane testy funkcjonalne, w których kompleksowo sprawdza się wiele parametrów jednocześnie. 

Testy jednostkowe, a testy funkcjonalne – różnice

Gdy przyglądamy się sieciom komputerowym, to podobnie jak w innych dziedzinach informatyki, testy jednostkowe i testy funkcjonalne odnoszą się do różnych poziomów i celów testowania. Różnice między tymi dwoma rodzajami testów wynikają głównie z zakresu, celu i metodologii testowania. 

Testy jednostkowe koncentrują się na najmniejszych, niepodzielnych częściach systemu, takich jak funkcje, metody lub moduły. W kontekście sieci komputerowych, może to oznaczać testowanie indywidualnych funkcji konfiguracyjnych, algorytmów routingu lub protokołów na poziomie bardzo szczegółowym. Głównym celem testów jednostkowych jest sprawdzenie, czy dane komponenty działają poprawnie w izolacji od reszty systemu. Chodzi o weryfikację logiki wewnętrznej i mechanizmów działania na bardzo niskim poziomie. Przykładem takiego testu jest sprawdzenie, czy wskazany interfejs ma konfigurację zgodną ze specyfikacją (na przykład czy adres IP i maska są poprawnie skonfigurowane a sam interfejs jest aktywny). Może to też być bardziej skomplikowany test polegający na sprawdzeniu algorytmu obliczającego metrykę w protokole routingu, aby upewnić się, że zwraca on poprawne wartości dla danych wejściowych. 

Testy funkcjonalne są bardziej zorientowane na wysokopoziomowe funkcje i cechy systemu, badając, jak różne części systemu współpracują ze sobą i czy całość spełnia określone wymagania funkcjonalne. W sieciach komputerowych, testy te mogą obejmować całe scenariusze użytkowania, takie jak przepływ danych przez sieć, działanie systemów bezpieczeństwa czy wydajność sieci przy różnym obciążeniu. Celem testów funkcjonalnych jest sprawdzenie czy system jako całość spełnia oczekiwania i wymagania użytkownika końcowego. Nie koncentrują się one na szczegółach implementacyjnych, ale na zachowaniu i wynikach działania systemu. Przykładami testów funkcjonalnych jest sprawdzenie czy sieć VPN poprawnie umożliwia zdalny dostęp do zasobów sieciowych dla użytkowników zewnętrznych, albo testowanie całego procesu przekierowania ruchu w przypadku awarii jednego z głównych routerów w sieci, aby upewnić się, że mechanizmy redundancji działają zgodnie z oczekiwaniami. 

Biblioteki do testów funkcjonalnych

Biblioteki takie jak pyATS (Python Automated Test Systems) [https://pubhub.devnetcloud.com/media/pyats/docs/getting_started/index.html] i Robot Framework [https://robotframework.org/] są narzędziami służącymi do automatyzacji testów funkcjonalnych. Pozwalają one różnym zespołom na efektywne projektowanie, realizację i zarządzanie testami, co jest szczególnie ważne w dużych i złożonych systemach informatycznych. PyATS jest platformą testową opracowaną przez Cisco, która początkowo była używana wewnętrznie, ale później została udostępniona publicznie. PyATS jest szczególnie mocny w testowaniu sieci, oferując wszechstronne narzędzia do automatyzacji testów dla różnych urządzeń i protokołów sieciowych. Biblioteka umożliwia tworzenie skomplikowanych scenariuszy testowych, które mogą symulować realistyczne środowiska sieciowe i sprawdzać, jak system zachowa się w różnych warunkach. Robot Framework jest ogólniejszym narzędziem do automatyzacji testów akceptacyjnych i ATDD (Acceptance Test-Driven Development). Posiada łatwą w użyciu składnię, która umożliwia tworzenie czytelnych scenariuszy testowych. Robot Framework jest niezależny od platformy i może być używany do testowania aplikacji webowych, mobilnych, desktopowych oraz interfejsów API. Jego elastyczność sprawia, że jest popularnym wyborem w wielu różnych kontekstach projektowych, w tym także w sieciach komputerowych. 

Połączenie pyATS i Robot Framework umożliwia skorzystanie z zaawansowanych możliwości testowania sieci pyATS oraz z łatwości użytkowania i elastyczności Robot Framework. Programiści mogą wykorzystać Robot Framework do tworzenia przypadków testowych w czytelnej formie, a następnie użyć pyATS w tle do wykonania tych testów na sprzęcie sieciowym. Pozwala to na łatwe pisanie scenariuszy testowych i zarządzanie nimi przy jednoczesnym korzystaniu z potężnych narzędzi testowych pyATS. Używając Robot Framework do integracji z różnymi systemami (np. systemami CI/CD, narzędziami do zarządzania testami) można łatwo włączyć testy sieciowe realizowane przez pyATS do szerszych procesów testowych i rozwojowych. Można łączyć testy sieci realizowane przez pyATS z testami interfejsu użytkownika, API i innymi, realizowanymi przez Robot Framework, tworząc kompleksowe scenariusze testowe, które odzwierciedlają rzeczywiste użycie systemu. Przykładów kompleksowego zastosowania obu produktów jest tyle, ile potrzeb wykonywania testów we współczesnych sieciach. 

Jak pisać testy funkcjonalne?

Przede wszystkim metodą małych kroków. Nie od razu Rzym zbudowano i nie od razu stworzymy w pełni działające kompleksowe narzędzie do testowania infrastruktury czy aplikacji. Ważne jest abyśmy tworzyli nasze testy jako rozwijający się stale projekt do którego będziemy dokładać kolejne elementy. Każdy z tych elementów, każdy z testów jednostkowych, które dalej będą tworzyły kompleksowy test funkcjonalny, powinniśmy najpierw testować osobno, a dopiero potem włączać w cały scenariusz złożonego testu funkcjonalnego. 

Jeżeli do budowy testów funkcjonalnych chcemy wykorzystywać pyATS, to zacznijmy od zapoznania się z dokumentacją pyATS, aby zrozumieć jego architekturę, podstawowe koncepty (np. testbed, test cases, tasks) i jak framework może być wykorzystany do spełnienia naszych potrzeb testowych. Zanim zaczniemy pisać testy, dokładnie musimy zrozumieć wymagania systemu i określ, które funkcje wymagają testowania. Same testy powinny być zaprojektowane w sposób modularny, czyli podzielone na mniejsze, zarządzalne funkcje, które można łatwo testować. Pozwala to na łatwiejsze zarządzanie kodem testowym i ponowne użycie testów. Używajmy też parametryzacji do przeprowadzania tych samych testów z różnymi zestawami danych. PyATS wspiera parametryzację, co umożliwia łatwe dostosowanie testów do różnych scenariuszy. Kodując testy korzystajmy z dostępnych bibliotek i modułów (np. Genie) do interakcji z urządzeniami sieciowymi. Te biblioteki oferują funkcje do konfiguracji urządzeń, zbierania danych i analizy stanu sieci. Nie zapomnijmy oczywiście o obsłudze błędów i wyjątków oraz stworzenia mechanizmu logowania i raportowania.