Sobes.tech
Middle

Какво е декоратор в контекста на програмирането?

sobes.tech AI

Отговор от AI

Декораторът е структурен шаблон за дизайн, който позволява динамично добавяне на нови отговорности към обекти, като ги обвива в специални декораторски обекти. Той предлага по-гъвкава алтернатива на наследяването за разширяване на функционалността.

Основни идеи:

  • Обвиване: Декораторът съдържа препратка към обвивания обект.
  • Делегиране: Декораторът делегира извикванията на методи към обвивания обект и може да изпълнява допълнителна логика преди или след извикването.
  • Разширяване на функционалността: Позволява добавяне на поведение към обекти без да се променя тяхната структура или използване на подкласове.

Приложение в QA автоматизация:

  • Логване на действия: Добавяне на логване към методите за взаимодействие с елементи на страницата.
  • Обработка на изключения: Добавяне на универсална обработка на изключения към извикванията на функции.
  • Повторни опити: Реализиране на механизъм за повторни опити за изпълнение на flaky тестове или действия.
  • Внедряване на преди/след условия: Изпълнение на определени действия преди или след основната стъпка на теста.

Пример на Python:

def log_method_call(func):
    # Декоратор, който логва извикването на функция
    def wrapper(*args, **kwargs):
        print(f"Обаждане към функция: {func.__name__} с args: {args}, kwargs: {kwargs}")
        result = func(*args, **kwargs)
        print(f"Функцията {func.__name__} върна: {result}")
        return result
    return wrapper

class PageObject:
    def __init__(self, driver):
        self.driver = driver

    @log_method_call
    def click_button(self, locator):
        # Метод, който използва декоратор
        print(f"Кликане на елемент, локализиран от: {locator}")
        # Симулация на действие на драйвера
        # self.driver.find_element(*locator).click()
        return "Бутонът е натиснат"

# Използване
# driver = ... # Инициализация на драйвера
# page = PageObject(driver)
# page.click_button(("ID", "submit_button"))