diff options
author | Benjamin Parzella <bparzella@gmail.com> | 2023-03-15 00:55:47 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-14 16:55:47 -0700 |
commit | 45d76fa644b9f2e082de1721a55f91eacdcdc520 (patch) | |
tree | 986c21b5def79165382a8e50efeb265a84770016 | |
parent | e47f35462dc7e8b28d2fa94de65a1bf34608d4c8 (diff) | |
download | python-coveragepy-git-45d76fa644b9f2e082de1721a55f91eacdcdc520.tar.gz |
fix: generate xml report packages correctly on windows (#1574)
* fix: generate xml report packages correctly on windows
* test: check duplicate package names in xml report
* fix: shorten long line in test_xml
-rw-r--r-- | coverage/xmlreport.py | 2 | ||||
-rw-r--r-- | tests/test_xml.py | 33 |
2 files changed, 34 insertions, 1 deletions
diff --git a/coverage/xmlreport.py b/coverage/xmlreport.py index 65da11d2..fd2e9f81 100644 --- a/coverage/xmlreport.py +++ b/coverage/xmlreport.py @@ -182,7 +182,7 @@ class XmlReporter: rel_name = filename[len(source_path)+1:] break else: - rel_name = fr.relative_filename() + rel_name = fr.relative_filename().replace("\\", "/") self.source_paths.add(fr.filename[:-len(rel_name)].rstrip(r"\/")) dirname = os.path.dirname(rel_name) or "." diff --git a/tests/test_xml.py b/tests/test_xml.py index c21a9dd4..94b310e3 100644 --- a/tests/test_xml.py +++ b/tests/test_xml.py @@ -318,6 +318,39 @@ class XmlReportTest(XmlTestHelpers, CoverageTest): "name": "รข", } + def test_no_duplicate_packages(self) -> None: + self.make_file( + "namespace/package/__init__.py", + "from . import sample; from . import test; from .subpackage import test" + ) + self.make_file("namespace/package/sample.py", "print('package.sample')") + self.make_file("namespace/package/test.py", "print('package.test')") + self.make_file("namespace/package/subpackage/test.py", "print('package.subpackage.test')") + + # no source path passed to coverage! + # problem occurs when they are dynamically generated during xml report + cov = coverage.Coverage() + + cov.start() + import_local_file("foo", "namespace/package/__init__.py") # pragma: nested + cov.stop() # pragma: nested + + cov.xml_report() + + dom = ElementTree.parse("coverage.xml") + + # only two packages should be present + packages = dom.findall(".//package") + assert len(packages) == 2 + + # one of them is namespace.package + named_package = dom.findall(".//package[@name='namespace.package']") + assert len(named_package) == 1 + + # the other one namespace.package.subpackage + named_sub_package = dom.findall(".//package[@name='namespace.package.subpackage']") + assert len(named_sub_package) == 1 + def unbackslash(v: Any) -> Any: """Find strings in `v`, and replace backslashes with slashes throughout.""" |