Make logging improvements to the sb pytest fixture
This commit is contained in:
parent
b07e065864
commit
3baf9fe064
|
@ -37,24 +37,41 @@ def log_test_failure_data(test, test_logpath, driver, browser, url=None):
|
||||||
data_to_save.append("Last Page: %s" % last_page)
|
data_to_save.append("Last Page: %s" % last_page)
|
||||||
data_to_save.append(" Browser: %s" % browser)
|
data_to_save.append(" Browser: %s" % browser)
|
||||||
data_to_save.append("Timestamp: %s" % int(time.time()))
|
data_to_save.append("Timestamp: %s" % int(time.time()))
|
||||||
if sys.version_info[0] >= 3 and hasattr(test, '_outcome'):
|
if sys.version_info[0] >= 3 and hasattr(test, '_outcome') and (
|
||||||
if test._outcome.errors:
|
hasattr(test._outcome, 'errors') and test._outcome.errors):
|
||||||
try:
|
try:
|
||||||
exc_message = test._outcome.errors[0][1][1]
|
exc_message = test._outcome.errors[0][1][1]
|
||||||
traceback_address = test._outcome.errors[0][1][2]
|
traceback_address = test._outcome.errors[0][1][2]
|
||||||
traceback_list = traceback.format_list(
|
traceback_list = traceback.format_list(
|
||||||
traceback.extract_tb(traceback_address)[1:])
|
traceback.extract_tb(traceback_address)[1:])
|
||||||
traceback_message = ''.join(traceback_list).strip()
|
traceback_message = ''.join(traceback_list).strip()
|
||||||
except Exception:
|
except Exception:
|
||||||
exc_message = "(Unknown Exception)"
|
exc_message = "(Unknown Exception)"
|
||||||
traceback_message = "(Unknown Traceback)"
|
traceback_message = "(Unknown Traceback)"
|
||||||
data_to_save.append("Traceback: " + traceback_message)
|
data_to_save.append("Traceback: " + traceback_message)
|
||||||
data_to_save.append("Exception: " + str(exc_message))
|
data_to_save.append("Exception: " + str(exc_message))
|
||||||
else:
|
else:
|
||||||
data_to_save.append("Traceback: " + ''.join(
|
the_traceback = None
|
||||||
|
the_traceback = ''.join(
|
||||||
traceback.format_exception(sys.exc_info()[0],
|
traceback.format_exception(sys.exc_info()[0],
|
||||||
sys.exc_info()[1],
|
sys.exc_info()[1],
|
||||||
sys.exc_info()[2])))
|
sys.exc_info()[2]))
|
||||||
|
if not the_traceback or len(str(the_traceback)) < 30 or (
|
||||||
|
the_traceback.endswith("StopIteration\n")):
|
||||||
|
good_stack = []
|
||||||
|
the_stacks = traceback.format_list(
|
||||||
|
traceback.extract_tb(sys.last_traceback))
|
||||||
|
for stack in the_stacks:
|
||||||
|
if "/site-packages/pluggy/" not in stack:
|
||||||
|
if "/site-packages/_pytest/" not in stack:
|
||||||
|
good_stack.append(stack)
|
||||||
|
the_traceback = ''.join(good_stack)
|
||||||
|
data_to_save.append("Traceback: " + the_traceback)
|
||||||
|
last_value = sys.last_value
|
||||||
|
if last_value:
|
||||||
|
data_to_save.append("Exception: " + str(last_value))
|
||||||
|
else:
|
||||||
|
data_to_save.append("Traceback: " + the_traceback)
|
||||||
log_file.writelines("\r\n".join(data_to_save))
|
log_file.writelines("\r\n".join(data_to_save))
|
||||||
log_file.close()
|
log_file.close()
|
||||||
|
|
||||||
|
|
|
@ -84,6 +84,7 @@ class BaseCase(unittest.TestCase):
|
||||||
self._language = "English"
|
self._language = "English"
|
||||||
self._presentation_slides = {}
|
self._presentation_slides = {}
|
||||||
self._presentation_transition = {}
|
self._presentation_transition = {}
|
||||||
|
self._sb_test_identifier = None
|
||||||
self._html_report_extra = [] # (Used by pytest_plugin.py)
|
self._html_report_extra = [] # (Used by pytest_plugin.py)
|
||||||
self._default_driver = None
|
self._default_driver = None
|
||||||
self._drivers_list = []
|
self._drivers_list = []
|
||||||
|
@ -6315,7 +6316,9 @@ class BaseCase(unittest.TestCase):
|
||||||
|
|
||||||
def __has_exception(self):
|
def __has_exception(self):
|
||||||
has_exception = False
|
has_exception = False
|
||||||
if sys.version_info[0] >= 3 and hasattr(self, '_outcome'):
|
if hasattr(sys, 'last_traceback') and sys.last_traceback is not None:
|
||||||
|
has_exception = True
|
||||||
|
elif sys.version_info[0] >= 3 and hasattr(self, '_outcome'):
|
||||||
if hasattr(self._outcome, 'errors') and self._outcome.errors:
|
if hasattr(self._outcome, 'errors') and self._outcome.errors:
|
||||||
has_exception = True
|
has_exception = True
|
||||||
else:
|
else:
|
||||||
|
@ -6326,6 +6329,8 @@ class BaseCase(unittest.TestCase):
|
||||||
test_id = "%s.%s.%s" % (self.__class__.__module__,
|
test_id = "%s.%s.%s" % (self.__class__.__module__,
|
||||||
self.__class__.__name__,
|
self.__class__.__name__,
|
||||||
self._testMethodName)
|
self._testMethodName)
|
||||||
|
if self._sb_test_identifier and len(str(self._sb_test_identifier)) > 6:
|
||||||
|
test_id = self._sb_test_identifier
|
||||||
return test_id
|
return test_id
|
||||||
|
|
||||||
def __create_log_path_as_needed(self, test_logpath):
|
def __create_log_path_as_needed(self, test_logpath):
|
||||||
|
|
|
@ -520,6 +520,7 @@ def pytest_configure(config):
|
||||||
sb_config.visual_baseline = config.getoption('visual_baseline')
|
sb_config.visual_baseline = config.getoption('visual_baseline')
|
||||||
sb_config.timeout_multiplier = config.getoption('timeout_multiplier')
|
sb_config.timeout_multiplier = config.getoption('timeout_multiplier')
|
||||||
sb_config.pytest_html_report = config.getoption('htmlpath') # --html=FILE
|
sb_config.pytest_html_report = config.getoption('htmlpath') # --html=FILE
|
||||||
|
sb_config._sb_node = {} # sb node dictionary (Used with the sb fixture)
|
||||||
|
|
||||||
if sb_config.reuse_session:
|
if sb_config.reuse_session:
|
||||||
arg_join = " ".join(sys.argv)
|
arg_join = " ".join(sys.argv)
|
||||||
|
@ -592,19 +593,35 @@ def sb(request):
|
||||||
from seleniumbase import BaseCase
|
from seleniumbase import BaseCase
|
||||||
|
|
||||||
class BaseClass(BaseCase):
|
class BaseClass(BaseCase):
|
||||||
def base_method():
|
|
||||||
|
def setUp(self):
|
||||||
|
super(BaseClass, self).setUp()
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
self.save_teardown_screenshot()
|
||||||
|
super(BaseClass, self).tearDown()
|
||||||
|
|
||||||
|
def base_method(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
if request.cls:
|
if request.cls:
|
||||||
request.cls.sb = BaseClass("base_method")
|
request.cls.sb = BaseClass("base_method")
|
||||||
request.cls.sb.setUp()
|
request.cls.sb.setUp()
|
||||||
|
request.cls.sb._needs_tearDown = True
|
||||||
|
sb_config._sb_node[request.node.nodeid] = request.cls.sb
|
||||||
yield request.cls.sb
|
yield request.cls.sb
|
||||||
request.cls.sb.tearDown()
|
if request.cls.sb._needs_tearDown:
|
||||||
|
request.cls.sb.tearDown()
|
||||||
|
request.cls.sb._needs_tearDown = False
|
||||||
else:
|
else:
|
||||||
sb = BaseClass("base_method")
|
sb = BaseClass("base_method")
|
||||||
sb.setUp()
|
sb.setUp()
|
||||||
|
sb._needs_tearDown = True
|
||||||
|
sb_config._sb_node[request.node.nodeid] = sb
|
||||||
yield sb
|
yield sb
|
||||||
sb.tearDown()
|
if sb._needs_tearDown:
|
||||||
|
sb.tearDown()
|
||||||
|
sb._needs_tearDown = False
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.hookwrapper
|
@pytest.mark.hookwrapper
|
||||||
|
@ -614,9 +631,36 @@ def pytest_runtest_makereport(item, call):
|
||||||
report = outcome.get_result()
|
report = outcome.get_result()
|
||||||
if pytest_html and report.when == 'call':
|
if pytest_html and report.when == 'call':
|
||||||
try:
|
try:
|
||||||
extra_report = item._testcase._html_report_extra
|
extra_report = None
|
||||||
|
if hasattr(item, "_testcase"):
|
||||||
|
extra_report = item._testcase._html_report_extra
|
||||||
|
elif hasattr(item.instance, "sb") or (
|
||||||
|
item.nodeid in sb_config._sb_node):
|
||||||
|
if not hasattr(item.instance, "sb"):
|
||||||
|
sb_node = sb_config._sb_node[item.nodeid]
|
||||||
|
else:
|
||||||
|
sb_node = item.instance.sb
|
||||||
|
test_id = item.nodeid
|
||||||
|
if not test_id:
|
||||||
|
test_id = "unidentified_TestCase"
|
||||||
|
test_id = test_id.replace(' ', '_')
|
||||||
|
if '[' in test_id:
|
||||||
|
import re
|
||||||
|
test_id_intro = test_id.split('[')[0]
|
||||||
|
parameter = test_id.split('[')[1]
|
||||||
|
parameter = re.sub(re.compile(r'\W'), '', parameter)
|
||||||
|
test_id = test_id_intro + "__" + parameter
|
||||||
|
test_id = test_id.replace('/', '.').replace('\\', '.')
|
||||||
|
test_id = test_id.replace('::', '.').replace('.py', '')
|
||||||
|
sb_node._sb_test_identifier = test_id
|
||||||
|
if sb_node._needs_tearDown:
|
||||||
|
sb_node.tearDown()
|
||||||
|
sb_node._needs_tearDown = False
|
||||||
|
extra_report = sb_node._html_report_extra
|
||||||
|
else:
|
||||||
|
return
|
||||||
extra = getattr(report, 'extra', [])
|
extra = getattr(report, 'extra', [])
|
||||||
if extra_report[1]["content"]:
|
if len(extra_report) > 1 and extra_report[1]["content"]:
|
||||||
report.extra = extra + extra_report
|
report.extra = extra + extra_report
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
Loading…
Reference in New Issue