diff --git a/CHANGELOG b/CHANGELOG index 8a02ee465..9d19f4210 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -11,6 +11,8 @@ Changes between 2.2.1 and 2.2.2.dev e.g. from module, class and at function level. - add chdir method to monkeypatch funcarg - fix crash resulting from calling monkeypatch undo a second time +- extend reports accepting kwargs to set arbitrary additional attributes + this helps xdist serialization/deserialization of extended/customized reports Changes between 2.2.0 and 2.2.1 ---------------------------------------- diff --git a/_pytest/runner.py b/_pytest/runner.py index 12d3a5375..048ca1dd9 100644 --- a/_pytest/runner.py +++ b/_pytest/runner.py @@ -141,6 +141,10 @@ def getslaveinfoline(node): return s class BaseReport(object): + + def __init__(self, **kw): + self.__dict__.update(kw) + def toterminal(self, out): longrepr = self.longrepr if hasattr(self, 'node'): @@ -190,7 +194,7 @@ class TestReport(BaseReport): they fail). """ def __init__(self, nodeid, location, - keywords, outcome, longrepr, when, sections=(), duration=0): + keywords, outcome, longrepr, when, sections=(), duration=0, **extra): #: normalized collection node id self.nodeid = nodeid @@ -219,6 +223,8 @@ class TestReport(BaseReport): #: time it took to run just the test self.duration = duration + self.__dict__.update(extra) + def __repr__(self): return "" % ( self.nodeid, self.when, self.outcome) @@ -226,9 +232,10 @@ class TestReport(BaseReport): class TeardownErrorReport(BaseReport): outcome = "failed" when = "teardown" - def __init__(self, longrepr): + def __init__(self, longrepr, **extra): self.longrepr = longrepr self.sections = [] + self.__dict__.update(extra) def pytest_make_collect_report(collector): call = CallInfo(collector._memocollect, "memocollect") @@ -250,12 +257,13 @@ def pytest_make_collect_report(collector): getattr(call, 'result', None)) class CollectReport(BaseReport): - def __init__(self, nodeid, outcome, longrepr, result, sections=()): + def __init__(self, nodeid, outcome, longrepr, result, sections=(), **extra): self.nodeid = nodeid self.outcome = outcome self.longrepr = longrepr self.result = result or [] self.sections = list(sections) + self.__dict__.update(extra) @property def location(self): diff --git a/testing/test_runner.py b/testing/test_runner.py index aa543299f..10a8c9610 100644 --- a/testing/test_runner.py +++ b/testing/test_runner.py @@ -315,6 +315,21 @@ class TestSessionReports: assert not rep.passed assert rep.skipped + +reporttypes = [ + runner.BaseReport, + runner.TestReport, + runner.TeardownErrorReport, + runner.CollectReport, +] + +@pytest.mark.parametrize('reporttype', reporttypes, ids=[x.__name__ for x in reporttypes]) +def test_report_extra_parameters(reporttype): + args = py.std.inspect.getargspec(reporttype.__init__)[0][1:] + basekw = dict.fromkeys(args, []) + report = reporttype(newthing=1, **basekw) + assert report.newthing == 1 + def test_callinfo(): ci = runner.CallInfo(lambda: 0, '123') assert ci.when == "123"