Błąd bazy danych WordPressa: [Illegal argument to a regular expression.]
SELECT DISTINCT SQL_CALC_FOUND_ROWS wp_users.ID,wp_users.display_name,wp_users.user_login FROM wp_users INNER JOIN wp_usermeta ON ( wp_users.ID = wp_usermeta.user_id ) WHERE 1=1 AND ( ( wp_usermeta.meta_key = 'first_name' AND wp_usermeta.meta_value RLIKE '^my_decorator($|\\s)' ) OR ( wp_usermeta.meta_key = 'first_name' AND wp_usermeta.meta_value RLIKE '^my_decorator($|\\s)' ) OR ( wp_usermeta.meta_key = 'first_name' AND wp_usermeta.meta_value RLIKE '^aetest($|\\s)' ) OR ( wp_usermeta.meta_key = 'first_name' AND wp_usermeta.meta_value RLIKE '^aetest($|\\s)' ) OR ( wp_usermeta.meta_key = 'first_name' AND wp_usermeta.meta_value RLIKE '^aetest($|\\s)' ) OR ( wp_usermeta.meta_key = 'first_name' AND wp_usermeta.meta_value RLIKE '^aetest($|\\s)' ) OR ( wp_usermeta.meta_key = 'first_name' AND wp_usermeta.meta_value RLIKE '^aetest($|\\s)' ) ) OR (wp_users.ID LIKE '' OR wp_users.ID RLIKE '') OR (wp_users.user_email LIKE '' OR wp_users.user_email RLIKE '') OR (wp_users.user_url LIKE '' OR wp_users.user_url RLIKE '') OR (wp_users.display_name LIKE '' OR wp_users.display_name RLIKE '') OR (wp_users.user_login LIKE '' OR wp_users.user_login RLIKE '') OR (wp_users.user_nicename LIKE '' OR wp_users.user_nicename RLIKE '') OR (wp_usermeta.meta_key = 'nickname' AND (wp_usermeta.meta_value LIKE '' OR wp_usermeta.meta_value RLIKE '')) OR (wp_usermeta.meta_key = 'first_name' AND (wp_usermeta.meta_value LIKE '' OR wp_usermeta.meta_value RLIKE '')) OR (wp_usermeta.meta_key = 'last_name' AND (wp_usermeta.meta_value LIKE '' OR wp_usermeta.meta_value RLIKE '')) ORDER BY user_registered ASC LIMIT 0, 7

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.