Ответ
Декораторы @staticmethod и @classmethod используются для создания методов, связанных с классом, а не с экземпляром. В автотестах они помогают в организации утилит и фабрик.
@staticmethod — статический метод:
- Не получает ни ссылки на экземпляр (
self), ни на класс (cls). - Это обычная функция, помещенная в пространство имен класса для логической группировки.
- Применение в тестах: Вспомогательные, чистые функции (утилиты), не зависящие от состояния класса или экземпляра.
@classmethod — метод класса:
- Получает ссылку на сам класс (
cls) в качестве первого аргумента. - Может обращаться к атрибутам класса и изменять их.
- Применение в тестах: Фабричные методы для создания экземпляров с предопределенной конфигурацией, альтернативные конструкторы.
Практический пример в фреймворке тестирования:
class TestDataFactory:
DEFAULT_ENV = "staging"
@staticmethod
def generate_random_email():
"""Утилита, не зависящая от класса."""
import uuid
return f"user_{uuid.uuid4().hex[:8]}@test.com"
@classmethod
def get_base_url(cls, environment=None):
"""Метод, использующий атрибут класса DEFAULT_ENV."""
env = environment or cls.DEFAULT_ENV
urls = {"staging": "https://stage.api.com", "prod": "https://api.com"}
return urls.get(env)
@classmethod
def for_production(cls):
"""Фабричный метод, возвращающий сконфигурированный объект."""
cls.DEFAULT_ENV = "prod" # Меняем состояние класса
return cls()
# Использование
email = TestDataFactory.generate_random_email() # Вызов staticmethod
url = TestDataFactory.get_base_url() # Вызов classmethod
prod_factory = TestDataFactory.for_production() # Создание фабрики для prod
Итог: Используйте @staticmethod для независимых утилит, @classmethod для методов, работающих с состоянием класса или выступающих в роли фабрик.