Skip to content

Commit 3b41c65

Browse files
[8.0.x] Escape skip reason in junitxml (#11845)
Co-authored-by: clee2000 <[email protected]>
1 parent 747072a commit 3b41c65

File tree

3 files changed

+21
-1
lines changed

3 files changed

+21
-1
lines changed

changelog/11842.bugfix.rst

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Properly escape the ``reason`` of a :ref:`skip <pytest.mark.skip ref>` mark when writing JUnit XML files.

src/_pytest/junitxml.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,9 @@ def append_skipped(self, report: TestReport) -> None:
248248
skipreason = skipreason[9:]
249249
details = f"{filename}:{lineno}: {skipreason}"
250250

251-
skipped = ET.Element("skipped", type="pytest.skip", message=skipreason)
251+
skipped = ET.Element(
252+
"skipped", type="pytest.skip", message=bin_xml_escape(skipreason)
253+
)
252254
skipped.text = bin_xml_escape(details)
253255
self.append(skipped)
254256
self.write_captured_output(report)

testing/test_junitxml.py

+17
Original file line numberDiff line numberDiff line change
@@ -1653,6 +1653,23 @@ def test_skip():
16531653
snode.assert_attr(message="1 <> 2")
16541654

16551655

1656+
def test_bin_escaped_skipreason(pytester: Pytester, run_and_parse: RunAndParse) -> None:
1657+
"""Escape special characters from mark.skip reason (#11842)."""
1658+
pytester.makepyfile(
1659+
"""
1660+
import pytest
1661+
@pytest.mark.skip("\33[31;1mred\33[0m")
1662+
def test_skip():
1663+
pass
1664+
"""
1665+
)
1666+
_, dom = run_and_parse()
1667+
node = dom.find_first_by_tag("testcase")
1668+
snode = node.find_first_by_tag("skipped")
1669+
assert "#x1B[31;1mred#x1B[0m" in snode.text
1670+
snode.assert_attr(message="#x1B[31;1mred#x1B[0m")
1671+
1672+
16561673
def test_escaped_setup_teardown_error(
16571674
pytester: Pytester, run_and_parse: RunAndParse
16581675
) -> None:

0 commit comments

Comments
 (0)