Podczas ostatniego webinaru (28.02.2024) „Testowanie infrastruktury sieciowej skryptami Python” Piotr Wojciechowski pokazał budowanie testów funkcjonalnych z zastosowaniem modułu aetest z biblioteki pyATS. Podczas kodowania zastosowane zostały specjalne konstrukcje w języku Python, zwane dekoratorami. W poniższym artykule przyjrzyjmy się dokładniej ich działaniu.
Czym są dekoratory w Python?
Dekoratory (ang. decorators) w Pythonie to narzędzie, które pozwala modyfikować działanie funkcji lub metod bez zmiany ich kodu źródłowego. Dekoratory są wyrażone przez znak @ i umieszczane nad definicją funkcji lub metody, którą mają modyfikować. Można je uznać za funkcje wyższego rzędu, które przyjmują funkcję jako argument i zwracają nową, dodającą do niej pewne cechy. Podstawowym zastosowaniem dekoratorów jest dodawanie funkcjonalności do istniejących funkcji lub metod w modularny i czytelny sposób. Zamiast bezpośrednio modyfikować kod funkcji, tworzy się dekorator, który „opakowuje” oryginalną funkcję, zapewniając dodatkową logikę przed lub po jej wykonaniu. To „opakowanie” odbywa się w momencie deklaracji funkcji, a nie w jej wykonaniu. Oznacza to, że modyfikacja zachowania funkcji następuje już w momencie definiowania, a nie tylko, gdy jest ona wywoływana.
Aby zrozumieć działanie dekoratorów, kluczowe jest zrozumienie, że w Pythonie funkcje są obiektami pierwszej klasy. Oznacza to, że mogą być przekazywane do innych funkcji jako argumenty, zwracane przez inne funkcje i przypisywane do zmiennych. Dekorator to po prostu funkcja, która przyjmuje funkcję jako argument i zwraca nową. Ta nowa funkcja zwykle wykonuje jakiś kod przed lub po wywołaniu pierwotnej funkcji, potencjalnie modyfikując jej argumenty, wynik, lub zachowanie w inny sposób.
Dekorator – jak działa?
Dekoratory to elementy języka Python, które należy uznać już za bardzo zaawansowane. W różnych skryptach automatyzacji praktycznie nie zdarzyło mi się nigdy tworzyć własnych dekoratorów. Co nie oznacza, że w przypadku bardzo zaawansowanych systemów tego typu konstrukcje nie są przydatne. Spójrzmy na bardzo prosty przykład definicji i działania dekoratora:
def my_decorator(func):
def wrapper():
print(„Coś jest wykonywane przed wywołaniem funkcji.”)
func()
print(„Coś jest wykonywane po wywołaniu funkcji.”)
return wrapper
@my_decorator
def my_function():
print(„Ciało funkcji.”)
my_function()
Wykonanie tej funkcji da następujący rezultat:
$ python3 1.py
Coś jest wykonywane przed wywołaniem funkcji.
Ciało funkcji.
Coś jest wykonywane po wywołaniu funkcji.
Dekorator my_decorator jest aplikowany do my_function za pomocą składni @my_decorator. Python przekazuje my_function jako argument do my_decorator, który wykonuje swoje działanie. my_decorator definiuje nową funkcję, wrapper, która wykonuje pewne działania przed i po wywołaniu my_function i zwraca tę funkcję. W wyniku aplikacji dekoratora, my_function zostaje zastąpiona funkcją wrapper, efektywnie rozszerzając jej zachowanie.
Dekoratory w pyATS
Biblioteka pyATS (Python Automated Test Systems) od Cisco jest frameworkiem przeznaczonym do testowania sieci, który umożliwia użytkownikom automatyzację testów sieciowych. Dekoratory w pyATS służą do rozszerzenia funkcjonalności testów poprzez dodawanie dodatkowej logiki bez konieczności modyfikacji samego kodu testu. Dzięki temu można łatwiej zarządzać procesem testowania, kontrolować wykonanie testów i zbierać metadane o testach. W czasie ostatniego webinaru (28.02.2024) „Testowanie infrastruktury sieciowej skryptami Python” Piotr Wojciechowski pokazał zastosowanie trzech dekoratorów do definiowania różnych sekcji w testach, takich jak setup, test cases i cleanup. Te dekoratory pomagają w organizacji testów i zapewniają frameworkowi informacje o strukturze testu:
@aetest.setup: Używany do oznaczania metody, która będzie wykonana jako konfiguracja przed głównymi przypadkami testowymi.
@aetest.test: Oznacza metodę jako przypadek testowy.
@aetest.cleanup: Używany do oznaczenia metody, która wykonuje czyszczenie po testach.
Warto też znać klika innych dekoratorów:
@aetest.skip pozwala pominąć określony przypadek testowy. Można go użyć, jeśli test nie jest już aktualny lub jeśli chcesz tymczasowo wyłączyć test z powodu znanego błędu.
@aetest.loop służy do wielokrotnego wykonania określonego przypadku testowego z różnymi parametrami. Jest to przydatne, gdy chcesz przetestować tę samą funkcjonalność pod różnymi kątami lub z różnymi zestawami danych.
Użytkownicy pyATS mogą tworzyć własne dekoratory, aby dostosować i rozszerzyć funkcjonalność frameworka zgodnie ze swoimi potrzebami. Może to obejmować dekoratory do logowania, monitorowania wykonania testów, zbierania dodatkowych metadanych o wykonaniu testu lub dowolnej innej logiki specyficznej dla danego środowiska testowego. Ograniczeniem są jedynie ograniczenia samego języka Python.
Zostaw komentarz
Musisz się zalogować lub zarejestrować aby dodać nowy komentarz.