Velvet Star Monitor

Standout celebrity highlights with iconic style.

updates

How to pass fixture object to pytest_runtest_makereport?

Writer Matthew Harrington

We use the pytest library for automation test. We need to take screen shots for fail case. I want to use mydriver variable in pytest_runtest_makereport method to take screen shots with this variable for fail case. How can I do this?

Additional: We don't use the conftest.py file. Can we use the pytest_runtest_makereport method without conftest.py? We use just a sampleTest.py file.

sampleTest.py:

import time
from appium import webdriver
import pytest
@pytest.yield_fixture(scope="function")
def driver(): """Setup for the test""" desired_caps = {} desired_caps['platformName'] = 'Android' desired_caps['platformVersion'] = '11.0' desired_caps['deviceName'] = 'Samsung Galaxy A70' # Since the app is already installed launching it using package and activity name desired_caps['appPackage'] = 'com.example.mapkitbaseline' desired_caps['appActivity'] = 'com.example.mapkitbaseline.ui.CreationMapActivity' mydriver = webdriver.Remote(' desired_caps) yield mydriver mydriver.quit()
@pytest.mark.usefixtures("driver")
def test_func1(driver): """"Testing the HMS MapKit demo app""" driver.implicitly_wait(30) time.sleep(5) # Assert that MapKit->.ui.CreationMapActivity->btnMapCreation4 button text is equal to "suuportfragmentx" elmnt = driver.find_element_by_id('com.example.mapkitbaseline:id/btnMapCreation4') assert elmnt.get_attribute('text').lower() == "supportmapfragmentfffffffffx" print(elmnt.get_attribute('text'))
@pytest.mark.hookwrapper
def pytest_runtest_makereport(item, call): pytest_html = item.config.pluginmanager.getplugin('html') outcome = yield report = outcome.get_result() extra = getattr(report, 'extra', []) if report.when == "call": xfail = hasattr(report, 'wasxfail') if (report.skipped and xfail) or (report.failed and not xfail): # I need to use mydriver variable this here. This code doesn't work. screenshot = mydriver.get_screenshot_as_base64() extra.append(pytest_html.extras.image(screenshot, '')) # extra.append(pytest_html.extras.html('<style> #results-table{ position: relative; position:absolute !important;top:300px !important; left:100px !important; width: 50% !important; z-index: -1 !important;}</style>')) report.extra = extra

1 Answer

You can access fixtures in item.funcargs.

if 'driver' in item.fixturenames: # Wrap in this mydriver = item.funcargs['driver'] # Add this screenshot = mydriver.get_screenshot_as_base64() extra.append(pytest_html.extras.image(screenshot, ''))

Reference:


Use pytest_runtest_makereport without conftest.py

It's possible, but you probably shouldn't do it.

# @pytest.mark.hookwrapper # Replace this
@pytest.hookimpl(hookwrapper=True) # with this
def pytest_runtest_makereport(item, call): # ...
import gc
import sys
from pluggy.hooks import HookImpl
from _pytest.config import Config
config = next(o for o in gc.get_objects() if isinstance(o, Config))
hookimpl = HookImpl(sys.modules[__name__], __file__, pytest_runtest_makereport, pytest_runtest_makereport.pytest_impl)
config.hook.pytest_runtest_makereport._add_hookimpl(hookimpl)
0

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.