From 530c9b234ac8185c8cf8e7f9cbb303bb3e9ef158 Mon Sep 17 00:00:00 2001 From: thou Date: Fri, 30 Jun 2017 13:09:15 -0500 Subject: [PATCH] Unserialize reprlocals to a ReprLocal instance --- changelog/176.bugfix | 1 + testing/test_remote.py | 53 ++++++++++++++++++++++++++++++++++++------ xdist/slavemanage.py | 9 ++++--- 3 files changed, 53 insertions(+), 10 deletions(-) create mode 100644 changelog/176.bugfix diff --git a/changelog/176.bugfix b/changelog/176.bugfix new file mode 100644 index 0000000..93d0fbe --- /dev/null +++ b/changelog/176.bugfix @@ -0,0 +1 @@ +Fix ``ReprLocal`` not being unserialized breaking --showlocals usages. \ No newline at end of file diff --git a/testing/test_remote.py b/testing/test_remote.py index 102b2ea..151616e 100644 --- a/testing/test_remote.py +++ b/testing/test_remote.py @@ -86,15 +86,54 @@ class TestReportSerialization: """) reports = reprec.getreports("pytest_runtest_logreport") assert len(reports) == 3 - initial_failure_report = reports[1] + rep = reports[1] added_section = ('Failure Metadata', str("metadata metadata"), "*") - initial_failure_report.longrepr.sections.append(added_section) - d = serialize_report(initial_failure_report) + rep.longrepr.sections.append(added_section) + d = serialize_report(rep) check_marshallable(d) - processed_report = unserialize_report("testreport", d) - assert 'Expected Message' \ - in processed_report.longrepr.reprcrash.message - assert added_section in processed_report.longrepr.sections + a = unserialize_report("testreport", d) + # Check assembled == rep + assert a.__dict__.keys() == rep.__dict__.keys() + for key in rep.__dict__.keys(): + if key != 'longrepr': + assert getattr(a, key) == getattr(rep, key) + assert rep.longrepr.reprcrash.lineno == a.longrepr.reprcrash.lineno + assert rep.longrepr.reprcrash.message == a.longrepr.reprcrash.message + assert rep.longrepr.reprcrash.path == a.longrepr.reprcrash.path + assert rep.longrepr.reprtraceback.entrysep \ + == a.longrepr.reprtraceback.entrysep + assert rep.longrepr.reprtraceback.extraline \ + == a.longrepr.reprtraceback.extraline + assert rep.longrepr.reprtraceback.style \ + == a.longrepr.reprtraceback.style + assert rep.longrepr.sections == a.longrepr.sections + assert rep.longrepr.reprtraceback.reprentries \ + == a.longrepr.reprtraceback.reprentries + # Missing section attribute PR171 + assert added_section in a.longrepr.sections + + def test_reprentries_serialization_170(self, testdir): + reprec = testdir.inline_runsource(""" + def test_fail(): + x = 0 + assert x + """, '--showlocals', '-n1') + reports = reprec.getreports("pytest_runtest_logreport") + assert len(reports) == 3 + rep = reports[1] + d = serialize_report(rep) + a = unserialize_report("testreport", d) + + rep_entries = rep.longrepr.reprtraceback.reprentries + a_entries = a.longrepr.reprtraceback.reprentries + assert rep_entries == a_entries + for i in range(len(a_entries)): + assert rep_entries[i].lines == a_entries[i].lines + assert rep_entries[i].localssep == a_entries[i].localssep + assert rep_entries[i].reprfileloc == a_entries[i].reprfileloc + assert rep_entries[i].reprfuncargs == a_entries[i].reprfuncargs + assert rep_entries[i].reprlocals == a_entries[i].reprlocals + assert rep_entries[i].style == a_entries[i].style def test_itemreport_outcomes(self, testdir): reprec = testdir.inline_runsource(""" diff --git a/xdist/slavemanage.py b/xdist/slavemanage.py index 0313791..8091f8d 100644 --- a/xdist/slavemanage.py +++ b/xdist/slavemanage.py @@ -329,10 +329,11 @@ class SlaveController(object): def unserialize_report(name, reportdict): def assembled_report(reportdict): from _pytest._code.code import ( + ReprEntry, ReprExceptionInfo, ReprFileLocation, - ReprEntry, ReprFuncArgs, + ReprLocals, ReprTraceback ) if reportdict['longrepr']: @@ -343,16 +344,18 @@ def unserialize_report(name, reportdict): unserialized_entries = [] for entry in reprtraceback['reprentries']: - reprfuncargs, reprfileloc = None, None + 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=entry['reprlocals'], + reprlocals=reprlocals, filelocrepr=reprfileloc, style=entry['style'] )