We are running python unit tests via the unittest-xml-reporting (aka xmlrunner) package.
This outputs XML files in the xUnit format.
Based on the docs, SonarCloud supports xUnit files by setting the option sonar.python.xunit.reportPath.
We run tests with this command:
coverage run -m xmlrunner discover tests -o test-reports
In the test-reports output directory we see the expected test outputs e.g.:
test-reports/
├── coverage.xml
├── TEST-test_compare_utils.AnyMatchTestCase-20230118094324.xml
├── TEST-test_compare_utils.LenientCompareTestCase-20230118094324.xml
├── TEST-test_function_utils.IdentityTestCase-20230118094324.xml
└── TEST-test_list_utils.EnsureListTestCase-20230118094324.xml
Here a shortened test output as example:
<?xml version="1.0" encoding="UTF-8"?>
<testsuite name="test_list_utils.EnsureListTestCase-20230118094324" tests="5" file="test_list_utils.py" time="0.003" timestamp="2023-01-18T09:43:24" failures="0" errors="0" skipped="0">
<testcase classname="test_list_utils.EnsureListTestCase" name="test_dict_to_list" time="0.001" timestamp="2023-01-18T09:43:24" file="tests/test_list_utils.py" line="27">
<!--Test that a dict is wrapped as list.-->
</testcase>
</testsuite>
And we run sonar scanner like this:
sonar-scanner -Dsonar.host.url=https://sonarcloud.io -Dsonar.organization=ourorg -Dsonar.pullrequest.provider="BitbucketCloud" -Dsonar.tests="tests/" -Dsonar.projectKey=aprojectkey -Dsonar.python.coverage.reportPaths=test-reports/coverage.xml -Dsonar.python.xunit.reportPath="test-reports/TEST-*.xml" -Dsonar.sources=. -Dsonar.c.file.suffixes=- -Dsonar.cpp.file.suffixes=- -Dsonar.objc.file.suffixes=- -Dsonar.python.version="3.7, 3.8, 3.9, 3.10" -Dsonar.exclusions="tests/**/*,setup.py"
Relevant here the option:
-Dsonar.python.xunit.reportPath="test-reports/TEST-*.xml"
But SonarCloud does not scan or detect them and instead shows a warning:
No report was found for sonar.python.xunit.reportPath using pattern test-reports/TEST-*.xml
We don’t see what we are doing wrong. Help would be appreciated.