diff --git a/AUTHORS b/AUTHORS index ea6fc5cac..41e30ffbc 100644 --- a/AUTHORS +++ b/AUTHORS @@ -208,6 +208,7 @@ Ross Lawley Russel Winder Ryan Wooden Samuel Dion-Girardeau +Samuel Searles-Bryant Samuele Pedroni Sankt Petersbug Segev Finer diff --git a/changelog/4907.feature.rst b/changelog/4907.feature.rst new file mode 100644 index 000000000..48bece401 --- /dev/null +++ b/changelog/4907.feature.rst @@ -0,0 +1 @@ +Show XFail reason as part of JUnitXML message field. diff --git a/src/_pytest/junitxml.py b/src/_pytest/junitxml.py index 122e0c7ce..c2b277b8a 100644 --- a/src/_pytest/junitxml.py +++ b/src/_pytest/junitxml.py @@ -252,7 +252,14 @@ class _NodeReporter(object): def append_skipped(self, report): if hasattr(report, "wasxfail"): - self._add_simple(Junit.skipped, "expected test failure", report.wasxfail) + xfailreason = report.wasxfail + if xfailreason.startswith("reason: "): + xfailreason = xfailreason[8:] + self.append( + Junit.skipped( + "", type="pytest.xfail", message=bin_xml_escape(xfailreason) + ) + ) else: filename, lineno, skipreason = report.longrepr if skipreason.startswith("Skipped: "): diff --git a/testing/test_junitxml.py b/testing/test_junitxml.py index 769e8e8a7..82e984785 100644 --- a/testing/test_junitxml.py +++ b/testing/test_junitxml.py @@ -485,9 +485,27 @@ class TestPython(object): tnode = node.find_first_by_tag("testcase") tnode.assert_attr(classname="test_xfailure_function", name="test_xfail") fnode = tnode.find_first_by_tag("skipped") - fnode.assert_attr(message="expected test failure") + fnode.assert_attr(type="pytest.xfail", message="42") # assert "ValueError" in fnode.toxml() + def test_xfailure_marker(self, testdir): + testdir.makepyfile( + """ + import pytest + @pytest.mark.xfail(reason="42") + def test_xfail(): + assert False + """ + ) + result, dom = runandparse(testdir) + assert not result.ret + node = dom.find_first_by_tag("testsuite") + node.assert_attr(skipped=1, tests=1) + tnode = node.find_first_by_tag("testcase") + tnode.assert_attr(classname="test_xfailure_marker", name="test_xfail") + fnode = tnode.find_first_by_tag("skipped") + fnode.assert_attr(type="pytest.xfail", message="42") + def test_xfail_captures_output_once(self, testdir): testdir.makepyfile( """