Добрый день. Пытаюсь организовать автоматизацию тестирования UI на проекте (Мобильная игра под Unity; для автоматизации исполльзую Pytest и allure + appium). При выполнении теста есть необходимость обращаться к 3 классам: appium драйверу (сделать скриншот/видео, кликнуть), сервису Appium и самописному WebSocket клиенту (получить какой-либо элемент интерфейса). Вопрос: где их хранить и инциализировать, чтобы использовать в тесте? Я лично вижу несколько вариантов:
- Использовать xUnit стиль написания, хранить их в базовом классе и использовать setup_class для инициализации:
class BaseTest:
appiumService = None
appiumDriver = None
@classmethod
def setup_class(cls):
cls.runAppiumService()
cls.runAppiumDriver()
cls.startRecordingScreen()
- Использовать фикстуры с различными скоупами
@fixture(scope='class')
def appiumDriver():
LOGGER.info('Running appium client')
appiumDriver = Remote(SETTINGS.appium.clientUrl, SETTINGS.desiredCapabilities)
LOGGER.info('Appium client process is running')
yield appiumDriver
LOGGER.info('Trying to stop appium client process')
appiumDriver.stop_client()
LOGGER.info('Appium client process is stopped')
@mark.usefixtures('appiumService', 'appiumDriver', 'recordVideo', 'makeScreenshot', 'websocket')
class TestFixture:
pass
- Создать общий класс, например Utils, который будет всё это дело инициализировать и отвечать за взаимодействие в целом
В общем-то, проблема простейшая - чем заменить init при использовании Pytest? При этом в идела хочется разместить всё компактно + сохранить работоспособность фичей IDE (автодополнение, подсветка синтаксиса и так далее).
В целом, идея следующая: есть тестовый класс (сьют), который по факту представляет собой набор методом-тесткейсов. На уровне класса происходит “глобальная” подготовка (запускается аппиум, происходит соединение с игрой, запускается игры и так далее). На уровне же методов-кейсов происходят непосредственно проверки, клики и вот это всё. Конечная цель такой структуры - минимизировать количество перезапусков игры, сервисов и так далее