diff --git a/coverage/xmlreport.py b/coverage/xmlreport.py index 2c8fd0cc1..b2180266d 100644 --- a/coverage/xmlreport.py +++ b/coverage/xmlreport.py @@ -69,6 +69,8 @@ def __init__(self, coverage: Coverage) -> None: if os.path.exists(src): if not self.config.relative_files: src = files.canonical_filename(src) + else: + src = src.rstrip(r"\/") self.source_paths.add(src) self.packages: Dict[str, PackageData] = {} self.xml_out: xml.dom.minidom.Document diff --git a/tests/test_xml.py b/tests/test_xml.py index 94b310e3e..0f2cff419 100644 --- a/tests/test_xml.py +++ b/tests/test_xml.py @@ -320,7 +320,7 @@ def test_accented_directory(self) -> None: def test_no_duplicate_packages(self) -> None: self.make_file( - "namespace/package/__init__.py", + "namespace/package/__init__.py", "from . import sample; from . import test; from .subpackage import test" ) self.make_file("namespace/package/sample.py", "print('package.sample')") @@ -489,6 +489,19 @@ def test_relative_source(self) -> None: elts = dom.findall(".//sources/source") assert [elt.text for elt in elts] == ["src"] + def test_relative_source_trailing_slash(self) -> None: + self.make_file("src/mod.py", "print(17)") + cov = coverage.Coverage(source=["src/"]) + cov.set_option("run:relative_files", True) + self.start_import_stop(cov, "mod", modfile="src/mod.py") + cov.xml_report() + + with open("coverage.xml") as x: + print(x.read()) + dom = ElementTree.parse("coverage.xml") + elts = dom.findall(".//sources/source") + assert [elt.text for elt in elts] == ["src"] + def compare_xml(expected: str, actual: str, actual_extra: bool = False) -> None: """Specialized compare function for our XML files."""