def deserialize_repr_entry(entry_data): data = entry_data["data"] entry_type = entry_data["type"] if entry_type == "ReprEntry": reprfuncargs = None reprfileloc = None reprlocals = None if data["reprfuncargs"]: reprfuncargs = ReprFuncArgs(**data["reprfuncargs"]) if data["reprfileloc"]: reprfileloc = ReprFileLocation(**data["reprfileloc"]) if data["reprlocals"]: reprlocals = ReprLocals(data["reprlocals"]["lines"]) reprentry: Union[ReprEntry, ReprEntryNative] = ReprEntry( lines=data["lines"], reprfuncargs=reprfuncargs, reprlocals=reprlocals, reprfileloc=reprfileloc, style=data["style"], ) elif entry_type == "ReprEntryNative": reprentry = ReprEntryNative(data["lines"]) else: _report_unserialization_failure(entry_type, TestReport, reportdict) return reprentry
def repr_failure(self, excinfo, style=None): if not excinfo.errisinstance(MypyAssertionError): return super().repr_failure(excinfo, style=style) # pragma: no cover reprfileloc_key = ("filelocrepr" if PYTEST_VERSION_INFO < (5, 4) else "reprfileloc") exception_repr = excinfo.getrepr(style="short") exception_repr.reprcrash.message = "" exception_repr.reprtraceback.reprentries = [ ReprEntry( lines=mismatch.lines, style="short", reprlocals=None, reprfuncargs=None, **{ reprfileloc_key: ReprFileLocation( path=self.parent.fspath, lineno=mismatch.lineno, message=mismatch.error_message, ) }, ) for mismatch in excinfo.value.errors ] return exception_repr
def assembled_report(reportdict): from _pytest._code.code import ( ReprEntry, ReprEntryNative, ReprExceptionInfo, ReprFileLocation, ReprFuncArgs, ReprLocals, ReprTraceback, ) if reportdict["longrepr"]: if ("reprcrash" in reportdict["longrepr"] and "reprtraceback" in reportdict["longrepr"]): reprtraceback = reportdict["longrepr"]["reprtraceback"] reprcrash = reportdict["longrepr"]["reprcrash"] unserialized_entries = [] reprentry = None for entry_data in reprtraceback["reprentries"]: data = entry_data["data"] entry_type = entry_data["type"] if entry_type == "ReprEntry": reprfuncargs = None reprfileloc = None reprlocals = None if data["reprfuncargs"]: reprfuncargs = ReprFuncArgs(**data["reprfuncargs"]) if data["reprfileloc"]: reprfileloc = ReprFileLocation( **data["reprfileloc"]) if data["reprlocals"]: reprlocals = ReprLocals( data["reprlocals"]["lines"]) reprentry = ReprEntry( lines=data["lines"], reprfuncargs=reprfuncargs, reprlocals=reprlocals, filelocrepr=reprfileloc, style=data["style"], ) elif entry_type == "ReprEntryNative": reprentry = ReprEntryNative(data["lines"]) else: report_unserialization_failure(entry_type, name, reportdict) unserialized_entries.append(reprentry) reprtraceback["reprentries"] = unserialized_entries exception_info = ReprExceptionInfo( reprtraceback=ReprTraceback(**reprtraceback), reprcrash=ReprFileLocation(**reprcrash), ) for section in reportdict["longrepr"]["sections"]: exception_info.addsection(*section) reportdict["longrepr"] = exception_info return reportdict
def _from_json(cls, reportdict): """ This was originally the serialize_report() function from xdist (ca03269). Factory method that returns either a TestReport or CollectReport, depending on the calling class. It's the callers responsibility to know which class to pass here. Experimental method. """ if reportdict["longrepr"]: if ("reprcrash" in reportdict["longrepr"] and "reprtraceback" in reportdict["longrepr"]): reprtraceback = reportdict["longrepr"]["reprtraceback"] reprcrash = reportdict["longrepr"]["reprcrash"] unserialized_entries = [] reprentry = None for entry_data in reprtraceback["reprentries"]: data = entry_data["data"] entry_type = entry_data["type"] if entry_type == "ReprEntry": reprfuncargs = None reprfileloc = None reprlocals = None if data["reprfuncargs"]: reprfuncargs = ReprFuncArgs(**data["reprfuncargs"]) if data["reprfileloc"]: reprfileloc = ReprFileLocation( **data["reprfileloc"]) if data["reprlocals"]: reprlocals = ReprLocals( data["reprlocals"]["lines"]) reprentry = ReprEntry( lines=data["lines"], reprfuncargs=reprfuncargs, reprlocals=reprlocals, filelocrepr=reprfileloc, style=data["style"], ) elif entry_type == "ReprEntryNative": reprentry = ReprEntryNative(data["lines"]) else: _report_unserialization_failure( entry_type, cls, reportdict) unserialized_entries.append(reprentry) reprtraceback["reprentries"] = unserialized_entries exception_info = ReprExceptionInfo( reprtraceback=ReprTraceback(**reprtraceback), reprcrash=ReprFileLocation(**reprcrash), ) for section in reportdict["longrepr"]["sections"]: exception_info.addsection(*section) reportdict["longrepr"] = exception_info return cls(**reportdict)
def assembled_report(reportdict): from _pytest._code.code import ( ReprEntry, ReprEntryNative, ReprExceptionInfo, ReprFileLocation, ReprFuncArgs, ReprLocals, ReprTraceback ) if reportdict['longrepr']: if 'reprcrash' in reportdict['longrepr'] and 'reprtraceback' in reportdict['longrepr']: reprtraceback = reportdict['longrepr']['reprtraceback'] reprcrash = reportdict['longrepr']['reprcrash'] unserialized_entries = [] reprentry = None for entry_data in reprtraceback['reprentries']: data = entry_data['data'] entry_type = entry_data['type'] if entry_type == 'ReprEntry': reprfuncargs = None reprfileloc = None reprlocals = None if data['reprfuncargs']: reprfuncargs = ReprFuncArgs( **data['reprfuncargs']) if data['reprfileloc']: reprfileloc = ReprFileLocation( **data['reprfileloc']) if data['reprlocals']: reprlocals = ReprLocals( data['reprlocals']['lines']) reprentry = ReprEntry( lines=data['lines'], reprfuncargs=reprfuncargs, reprlocals=reprlocals, filelocrepr=reprfileloc, style=data['style'] ) elif entry_type == 'ReprEntryNative': reprentry = ReprEntryNative(data['lines']) else: report_unserialization_failure( entry_type, name, reportdict) unserialized_entries.append(reprentry) reprtraceback['reprentries'] = unserialized_entries exception_info = ReprExceptionInfo( reprtraceback=ReprTraceback(**reprtraceback), reprcrash=ReprFileLocation(**reprcrash), ) for section in reportdict['longrepr']['sections']: exception_info.addsection(*section) reportdict['longrepr'] = exception_info return reportdict
def handle_teardowns(item): __tracebackhide__ = True case = item._location teardown_groups = case._teardown_groups for group in teardown_groups: if group in case._helper._level_stack: start_time = time() try: group._teardown_group() except: # handle error during group setup excinfo = ExceptionInfo() stop_time = time() nodeid = item.nodeid.split("::")[0] + "::" nodeid += group._inline_description location = group._last_location keywords = {} outcome = "failed" longrepr = excinfo.getrepr() when = "teardown" sections = [] duration = stop_time - start_time context_lines = [ "Context:", "", ] context_lines += str(location).split("\n") context_lines[-1] = ">" + context_lines[-1][1:] entry = ReprEntry( context_lines, None, None, None, "long", ) if hasattr(longrepr, "chain"): reprtraceback = longrepr.chain[0][0] else: reprtraceback = longrepr.reprtraceback reprtraceback.reprentries.insert(0, entry) report = TestReport( nodeid, location, keywords, outcome, longrepr, when, sections, duration, ) item.ihook.pytest_runtest_logreport(report=report)
def setup_contextional_groups(self, nodeid, location): __tracebackhide__ = True for group in location._group._setup_ancestry: if group not in group._helper._level_stack: if self.showlongtestinfo: group._pytest_writer = self start_time = time() try: group._setup_group() except: # handle error during group setup excinfo = ExceptionInfo() stop_time = time() nodeid = nodeid.split("::")[0] + "::" nodeid += group._inline_description location = group._last_location keywords = {} outcome = "failed" longrepr = excinfo.getrepr() when = "setup" sections = [] duration = stop_time - start_time context_lines = [ "Context:", "", ] context_lines += str(location).split("\n") context_lines[-1] = ">" + context_lines[-1][1:] entry = ReprEntry(context_lines, None, None, None, "long") if hasattr(longrepr, "chain"): reprtraceback = longrepr.chain[0][0] else: reprtraceback = longrepr.reprtraceback reprtraceback.reprentries.insert(0, entry) report = TestReport( nodeid, location, keywords, outcome, longrepr, when, sections, duration, ) self.pytest_runtest_logreport(report)
def pytest_runtest_makereport(item, call): when = call.when duration = call.stop - call.start keywords = dict([(x, 1) for x in item.keywords]) excinfo = call.excinfo sections = [] if not call.excinfo: outcome = "passed" longrepr = None else: if not isinstance(excinfo, ExceptionInfo): outcome = "failed" longrepr = excinfo elif excinfo.errisinstance(skip.Exception): outcome = "skipped" r = excinfo._getreprcrash() longrepr = (str(r.path), r.lineno, r.message) else: outcome = "failed" if call.when == "call": if isinstance(item.location, Case): case = item.location longrepr = item.repr_failure(excinfo) context_lines = [ "Context:", ] context_lines += case._full_description.split("\n") context_lines[-1] = ">" + context_lines[-1][1:] if excinfo.errisinstance(CascadingFailureError): context_lines.append("E CASCADING FAILURE") entry = ReprEntry(context_lines, None, None, None, "long") if hasattr(longrepr, "chain"): reprtraceback = longrepr.chain[0][0] else: reprtraceback = longrepr.reprtraceback if excinfo.errisinstance(CascadingFailureError): reprtraceback.reprentries[0] = entry else: reprtraceback.reprentries.insert(0, entry) else: longrepr = item.repr_failure(excinfo) else:
def assembled_report(reportdict): from _pytest._code.code import (ReprEntry, ReprExceptionInfo, ReprFileLocation, ReprFuncArgs, ReprLocals, ReprTraceback) if reportdict['longrepr']: if 'reprcrash' and 'reprtraceback' in reportdict['longrepr']: reprtraceback = reportdict['longrepr']['reprtraceback'] reprcrash = reportdict['longrepr']['reprcrash'] unserialized_entries = [] for entry in reprtraceback['reprentries']: reprfuncargs, reprfileloc, reprlocals = None, None, None if entry['reprfuncargs']: reprfuncargs = ReprFuncArgs(**entry['reprfuncargs']) if entry['reprfileloc']: reprfileloc = ReprFileLocation(**entry['reprfileloc']) if entry['reprlocals']: reprlocals = ReprLocals(entry['reprlocals']['lines']) reprentry = ReprEntry(lines=entry['lines'], reprfuncargs=reprfuncargs, reprlocals=reprlocals, filelocrepr=reprfileloc, style=entry['style']) unserialized_entries.append(reprentry) reprtraceback['reprentries'] = unserialized_entries exception_info = ReprExceptionInfo( reprtraceback=ReprTraceback(**reprtraceback), reprcrash=ReprFileLocation(**reprcrash), ) for section in reportdict['longrepr']['sections']: exception_info.addsection(*section) reportdict['longrepr'] = exception_info return reportdict
def value(self, name, what): from _pytest._code.code import (ReprEntry, ReprEntryNative, ReprExceptionInfo, ReprFileLocation, ReprFuncArgs, ReprLocals, ReprTraceback) if not isinstance(what, str): unserialized_entries = [] reprentry = None for entry_data in what.reprtraceback.reprentries: data = entry_data['data'] entry_type = entry_data['type'] if entry_type == 'ReprEntry': reprfuncargs = None reprfileloc = None reprlocals = None if data['reprfuncargs']: reprfuncargs = ReprFuncArgs(**data['reprfuncargs']) if data['reprfileloc']: reprfileloc = ReprFileLocation(**data['reprfileloc']) if data['reprlocals']: reprlocals = ReprLocals(data['reprlocals']['lines']) reprentry = ReprEntry(lines=data['lines'], reprfuncargs=reprfuncargs, reprlocals=reprlocals, filelocrepr=reprfileloc, style=data['style']) elif entry_type == 'ReprEntryNative': reprentry = ReprEntryNative(data['lines']) else: report_unserialization_failure(entry_type, name, reportdict) unserialized_entries.append(reprentry) what.reprtraceback.reprentries = unserialized_entries return element_maker(self.name or name, self.namespace)(legalize_xml(unicodify(what)))