Repository navigation
Test execution data of utPLSQL project not showing on SonarCloud #1198
Description
Recently I saw this comment saying that the unit test data isn't showing on your SonarCloud project, then I decided to investigate this issue further and I would like to discuss what's the best way to fix it.
Just for reference, this is how the SonarCloud panel looks like now:
And how it should look like:
I saw that the utplsql-cli is executed using the user ut3_test_helper, but the unit tests are being compiled on users ut3_tester and ut3$user# and the option -owner for the test files is being omitted (line 10):
Lines 7 to 11 in b4d72e3
| time utPLSQL-cli/bin/utplsql run ${UT3_TESTER_HELPER}/${UT3_TESTER_HELPER_PASSWORD}@${CONNECTION_STR} \ | |
| -source_path=source -owner=ut3_develop \ | |
| -p='ut3_tester,ut3$user#' \ | |
| -test_path=test -c \ | |
| -f=ut_coverage_sonar_reporter -o=coverage.xml \ |
When this option is omitted and there's no other mapping rule to identify the owner of a file by its path, the ut_file_mapper package assumes that the owner is the user running the tests, which is the user ut3_test_helper:
utPLSQL/source/core/ut_file_mapper.pkb
Lines 102 to 105 in b4d72e3
| l_object_owner := coalesce( | |
| upper(a_object_owner), | |
| upper(regexp_substr(l_file_path, l_regex_pattern, 1, 1, 'i', l_object_owner_subexpression)), | |
| sys_context('USERENV', 'CURRENT_SCHEMA')); |
But actually the ut3_test_helper doesn't own any unit test and, as result, the test_results.xml file generated by ut_sonar_test_reporter doesn't contain any file path. This is the reason that the unit test data isn't being uploaded to SonarCloud.
The log of the "SonarCloud Scan" step on the GitHub Actions (example) also shows this, because the files aren't mapped correctly:
INFO: Test execution data ignored for 55 unknown files, including:
utplsql.ut3_tester.core.test_ut_utils
utplsql.ut3_tester.core.test_ut_test
(....)
One way I found to fix this issue without any changes to the utPLSQL code is executing the utplsql-cli twice, one for each schema, like:
utPLSQL-cli/bin/utplsql run ${UT3_TESTER_HELPER} (...) -p='ut3_tester' -test_path=test -owner='ut3_tester'
utPLSQL-cli/bin/utplsql run ${UT3_TESTER_HELPER} (...) -p='ut3$user#' -test_path=test -owner='ut3$user#'
But this would required some other changes to the build pipeline because the generated reports would also be duplicated.
Another alternative, that makes more sense to me, is to not assume any default value for the file owner on ut_file_mapper and change the ut_file_mapping usages (example) to compare the owner only if it's present. With this change, if there's no owner defined on the object-to-file mapping rules, the code will compare only the object name and object type to find the corresponding file, which should be good enough for most situations.
What do you folks think about it?


Activity
lwasylow commentedon Mar 2, 2022
I think the CLI should resolve all filepath under
test_pathhowever the regex is possible not rightgc_file_mapping_regex constant varchar2(100) := '/(((\w|[$#])+)\.)?((\w|[$#])+)\.(\w{3})$';and we need to pass some extra options foras per https://github.com/utPLSQL/utPLSQL-cli
I will have a play.
Ideally if we can avoid running twice would be ideal, or changing default behaviour.
jgebal commentedon Mar 2, 2022
We need to rename the folder:
UT3_USERtoUT3$USER#jgebal commentedon Mar 2, 2022
I take this back.
We need to rename user
UT3$USER#toUT3_USERUnix doesn't like the special chars in folder names and for some reason utPLSQL-cli doesn't pass the paths to runner when the directory is named
UT3$USER#jgebal commentedon Mar 2, 2022
The parameters that seem to work for me locally were:
I have tested it locally with UT_DEBUG_REPORTER to see what are the file mappings generated by utPLSQL file mapper.
jgebal commentedon Mar 3, 2022
@felipebz
Thanks for bringing this to our attention.
I have wrongly assumed that the issue with test-results not showing in sonar was related to sonar changes, while in fact it was related to tests refactoring that was done some time ago.
I've managed to fix the issue by change to how file mapping is interpreted (owner extracted from file path).