Skip to content

Commit 48ed437

Browse files
authored
Merge pull request #5087 from samueljsb/issue/4907
Show XFail reason as part of JUnitXML message field
2 parents 97cd5f0 + a37d1df commit 48ed437

File tree

4 files changed

+29
-2
lines changed

4 files changed

+29
-2
lines changed

AUTHORS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ Ross Lawley
208208
Russel Winder
209209
Ryan Wooden
210210
Samuel Dion-Girardeau
211+
Samuel Searles-Bryant
211212
Samuele Pedroni
212213
Sankt Petersbug
213214
Segev Finer

changelog/4907.feature.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Show XFail reason as part of JUnitXML message field.

src/_pytest/junitxml.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,14 @@ def append_error(self, report):
252252

253253
def append_skipped(self, report):
254254
if hasattr(report, "wasxfail"):
255-
self._add_simple(Junit.skipped, "expected test failure", report.wasxfail)
255+
xfailreason = report.wasxfail
256+
if xfailreason.startswith("reason: "):
257+
xfailreason = xfailreason[8:]
258+
self.append(
259+
Junit.skipped(
260+
"", type="pytest.xfail", message=bin_xml_escape(xfailreason)
261+
)
262+
)
256263
else:
257264
filename, lineno, skipreason = report.longrepr
258265
if skipreason.startswith("Skipped: "):

testing/test_junitxml.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -485,9 +485,27 @@ def test_xfail():
485485
tnode = node.find_first_by_tag("testcase")
486486
tnode.assert_attr(classname="test_xfailure_function", name="test_xfail")
487487
fnode = tnode.find_first_by_tag("skipped")
488-
fnode.assert_attr(message="expected test failure")
488+
fnode.assert_attr(type="pytest.xfail", message="42")
489489
# assert "ValueError" in fnode.toxml()
490490

491+
def test_xfailure_marker(self, testdir):
492+
testdir.makepyfile(
493+
"""
494+
import pytest
495+
@pytest.mark.xfail(reason="42")
496+
def test_xfail():
497+
assert False
498+
"""
499+
)
500+
result, dom = runandparse(testdir)
501+
assert not result.ret
502+
node = dom.find_first_by_tag("testsuite")
503+
node.assert_attr(skipped=1, tests=1)
504+
tnode = node.find_first_by_tag("testcase")
505+
tnode.assert_attr(classname="test_xfailure_marker", name="test_xfail")
506+
fnode = tnode.find_first_by_tag("skipped")
507+
fnode.assert_attr(type="pytest.xfail", message="42")
508+
491509
def test_xfail_captures_output_once(self, testdir):
492510
testdir.makepyfile(
493511
"""

0 commit comments

Comments
 (0)