Ответ
В Python-фреймворках для тестирования (например, unittest или pytest с классами) наследование активно используется для переиспользования кода. От родительского тест-класса наследуется:
-
Методы: Все обычные, статические (
@staticmethod) и классовые (@classmethod) методы.class BaseTest: @classmethod def setUpClass(cls): cls.driver = webdriver.Chrome() # Инициализация драйвера для всех тестов cls.base_url = "https://example.com" def login(self, user): # Общий метод логина self.driver.get(f"{self.base_url}/login") # ... действия по логину class TestUserDashboard(BaseTest): # Наследуется от BaseTest def test_dashboard_loads(self): # Метод setUpClass уже выполнен, driver доступен self.login("test_user") self.driver.get(f"{self.base_url}/dashboard") assert "Dashboard" in self.driver.title -
Атрибуты класса: Переменные, объявленные на уровне класса.
class BaseTest: timeout = 10 # Таймаут по умолчанию class TestSearch(BaseTest): def test_slow_search(self): # Использует унаследованный timeout element = WebDriverWait(self.driver, self.timeout).until(...) -
Декораторы и свойства (
@property): Если они объявлены в родительском классе.
Что НЕ наследуется автоматически в контексте тестов:
- Атрибуты экземпляра (
self.var): Они инициализируются в__init__илиsetUpметоде. Если дочерний класс переопределяет__init__, он должен явно вызватьsuper().__init__(). - Фикстуры
pytest: Вpytestлогика переиспользования строится скорее на фикстурах (@pytest.fixture), чем на классическом наследовании, хотя наследование классов тоже работает.
Практика в тестировании: Я создаю базовый класс BaseTest, где выношу общую логику (инициализация драйвера, авторизация, утилитные методы), а затем от него наследую все конкретные тест-сьюты. Это устраняет дублирование кода и упрощает поддержку.