status-desktop/test/e2e/conftest.py

96 lines
2.7 KiB
Python

import logging
import configs
import os
import allure
import pytest
import shortuuid
from tests import test_data
from PIL import ImageGrab
from configs.system import get_platform
from fixtures.path import generate_test_info
from scripts.utils.system_path import SystemPath
# Send logs to pytest.log as well
handler = logging.FileHandler(filename=configs.PYTEST_LOG)
logging.basicConfig(
level=os.getenv('LOG_LEVEL', 'INFO'),
format='[%(asctime)s] (%(filename)18s:%(lineno)-3s) [%(levelname)-7s] --- %(message)s',
handlers=[handler],
)
LOG = logging.getLogger(__name__)
pytest_plugins = [
'fixtures.aut',
'fixtures.path',
'fixtures.squish',
'fixtures.testrail',
]
@pytest.fixture(scope='session', autouse=True)
def setup_session_scope(
init_testrail_api,
prepare_test_directory,
start_squish_server,
close_apps_before_start
):
LOG.info('Session startup...')
yield
@pytest.fixture(autouse=True)
def setup_function_scope(
caplog,
generate_test_data,
check_result,
application_logs,
keycard_controller
):
# FIXME: broken due to KeyError: <_pytest.stash.StashKey object at 0x7fd1ba6d78c0>
# caplog.set_level(configs.LOG_LEVEL)
yield
def pytest_runtest_setup(item):
test_data.test_name = item.name
test_data.error = []
test_data.steps = []
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
outcome = yield
rep = outcome.get_result()
setattr(item, 'rep_' + rep.when, rep)
if rep.when == 'call':
if rep.failed:
test_data.error = rep.longreprtext
elif rep.outcome == 'passed':
if test_data.error:
rep.outcome = 'failed'
error_text = str()
for line in test_data.error:
error_text += f"{line}; \n ---- soft assert ---- \n\n"
rep.longrepr = error_text
elif rep.failed:
test_data.error = rep.longreprtext
def pytest_exception_interact(node):
test_path, test_name, test_params = generate_test_info(node)
node_dir: SystemPath = configs.testpath.RUN / test_path / test_name / test_params
node_dir.mkdir(parents=True, exist_ok=True)
screenshot = node_dir / f'screenshot_{shortuuid.ShortUUID().random(length=10)}.png'
try:
ImageGrab.grab(xdisplay=configs.system.DISPLAY if get_platform() == "Linux" else None).save(screenshot)
allure.attach(
name='Screenshot on fail',
body=screenshot.read_bytes(),
attachment_type=allure.attachment_type.PNG
)
except FileNotFoundError:
print("Screenshot was not generated or saved")