diff options
author | Alexis Lothoré <alexis.lothore@bootlin.com> | 2023-10-22 19:49:35 +0200 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2023-10-23 10:49:19 +0100 |
commit | c304fcbe0588b1078373558c2ddf36064bcdf214 (patch) | |
tree | 0eb2d534cb0dc362ff64f0561b4732d1e3070821 /scripts/lib/resulttool/regression.py | |
parent | 7cba02e8be91aed00f9d86ebb5488f89a29f6a45 (diff) | |
download | poky-c304fcbe0588b1078373558c2ddf36064bcdf214.tar.gz |
scripts/resulttool: limit the number of changes displayed per test
Most of the changes list generated in regression reports fall in one
of the two following categories:
- there is only a few (<10) changes listed and the info is
valuable/relevant
- the list is huge (> 100 ? 1000 ?) and basically tells us that the whole
tests category suffers the same status (test missing, test failing, test
skipped, etc)
Prevent those huge, worthless lists by limiting the output for each test
group:
- current default limit is arbitrarily set to 50
- limit can still be overriden with a new "-l"/"--limit" flag, either with
custom value, or with 0 to print the whole lists of changes
- limit is applied per test family: currently it distinguishes only types
of ptests, but it can be adapted to other kind of tests
(From OE-Core rev: cec118406f3ad81cb4709f6e6ae1cef65799658e)
Signed-off-by: Alexis Lothoré <alexis.lothore@bootlin.com>
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts/lib/resulttool/regression.py')
-rw-r--r-- | scripts/lib/resulttool/regression.py | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/scripts/lib/resulttool/regression.py b/scripts/lib/resulttool/regression.py index 3d64b8f4af..d98504f4ce 100644 --- a/scripts/lib/resulttool/regression.py +++ b/scripts/lib/resulttool/regression.py | |||
@@ -78,6 +78,8 @@ STATUS_STRINGS = { | |||
78 | "None": "No matching test result" | 78 | "None": "No matching test result" |
79 | } | 79 | } |
80 | 80 | ||
81 | REGRESSIONS_DISPLAY_LIMIT=50 | ||
82 | |||
81 | def test_has_at_least_one_matching_tag(test, tag_list): | 83 | def test_has_at_least_one_matching_tag(test, tag_list): |
82 | return "oetags" in test and any(oetag in tag_list for oetag in test["oetags"]) | 84 | return "oetags" in test and any(oetag in tag_list for oetag in test["oetags"]) |
83 | 85 | ||
@@ -181,11 +183,15 @@ def get_status_str(raw_status): | |||
181 | raw_status_lower = raw_status.lower() if raw_status else "None" | 183 | raw_status_lower = raw_status.lower() if raw_status else "None" |
182 | return STATUS_STRINGS.get(raw_status_lower, raw_status) | 184 | return STATUS_STRINGS.get(raw_status_lower, raw_status) |
183 | 185 | ||
184 | def compare_result(logger, base_name, target_name, base_result, target_result): | 186 | def compare_result(logger, base_name, target_name, base_result, target_result, display_limit=None): |
185 | base_result = base_result.get('result') | 187 | base_result = base_result.get('result') |
186 | target_result = target_result.get('result') | 188 | target_result = target_result.get('result') |
187 | result = {} | 189 | result = {} |
188 | new_tests = 0 | 190 | new_tests = 0 |
191 | regressions = {} | ||
192 | resultstring = "" | ||
193 | |||
194 | display_limit = int(display_limit) if display_limit else REGRESSIONS_DISPLAY_LIMIT | ||
189 | 195 | ||
190 | if base_result and target_result: | 196 | if base_result and target_result: |
191 | for k in base_result: | 197 | for k in base_result: |
@@ -212,7 +218,17 @@ def compare_result(logger, base_name, target_name, base_result, target_result): | |||
212 | resultstring = "Regression: %s\n %s\n" % (base_name, target_name) | 218 | resultstring = "Regression: %s\n %s\n" % (base_name, target_name) |
213 | for k in sorted(result): | 219 | for k in sorted(result): |
214 | if not result[k]['target'] or not result[k]['target'].startswith("PASS"): | 220 | if not result[k]['target'] or not result[k]['target'].startswith("PASS"): |
215 | resultstring += ' %s: %s -> %s\n' % (k, get_status_str(result[k]['base']), get_status_str(result[k]['target'])) | 221 | # Differentiate each ptest kind when listing regressions |
222 | key = '.'.join(k.split('.')[:2]) if k.startswith('ptest') else k | ||
223 | # Append new regression to corresponding test family | ||
224 | regressions[key] = regressions.setdefault(key, []) + [' %s: %s -> %s\n' % (k, get_status_str(result[k]['base']), get_status_str(result[k]['target']))] | ||
225 | resultstring += f" Total: {sum([len(regressions[r]) for r in regressions])} new regression(s):\n" | ||
226 | for k in regressions: | ||
227 | resultstring += f" {len(regressions[k])} regression(s) for {k}\n" | ||
228 | count_to_print=min([display_limit, len(regressions[k])]) if display_limit > 0 else len(regressions[k]) | ||
229 | resultstring += ''.join(regressions[k][:count_to_print]) | ||
230 | if count_to_print < len(regressions[k]): | ||
231 | resultstring+=' [...]\n' | ||
216 | if new_pass_count > 0: | 232 | if new_pass_count > 0: |
217 | resultstring += f' Additionally, {new_pass_count} previously failing test(s) is/are now passing\n' | 233 | resultstring += f' Additionally, {new_pass_count} previously failing test(s) is/are now passing\n' |
218 | else: | 234 | else: |
@@ -280,7 +296,7 @@ def regression_common(args, logger, base_results, target_results): | |||
280 | for b in target.copy(): | 296 | for b in target.copy(): |
281 | if not can_be_compared(logger, base_results[a][c], target_results[a][b]): | 297 | if not can_be_compared(logger, base_results[a][c], target_results[a][b]): |
282 | continue | 298 | continue |
283 | res, resstr = compare_result(logger, c, b, base_results[a][c], target_results[a][b]) | 299 | res, resstr = compare_result(logger, c, b, base_results[a][c], target_results[a][b], args.limit) |
284 | if not res: | 300 | if not res: |
285 | matches.append(resstr) | 301 | matches.append(resstr) |
286 | base.remove(c) | 302 | base.remove(c) |
@@ -291,7 +307,7 @@ def regression_common(args, logger, base_results, target_results): | |||
291 | for b in target: | 307 | for b in target: |
292 | if not can_be_compared(logger, base_results[a][c], target_results[a][b]): | 308 | if not can_be_compared(logger, base_results[a][c], target_results[a][b]): |
293 | continue | 309 | continue |
294 | res, resstr = compare_result(logger, c, b, base_results[a][c], target_results[a][b]) | 310 | res, resstr = compare_result(logger, c, b, base_results[a][c], target_results[a][b], args.limit) |
295 | if res: | 311 | if res: |
296 | regressions.append(resstr) | 312 | regressions.append(resstr) |
297 | else: | 313 | else: |
@@ -403,4 +419,5 @@ def register_commands(subparsers): | |||
403 | parser_build.add_argument('--commit-number', help="Revision number to search for, redundant if --commit is specified") | 419 | parser_build.add_argument('--commit-number', help="Revision number to search for, redundant if --commit is specified") |
404 | parser_build.add_argument('--commit2', help="Revision to compare with") | 420 | parser_build.add_argument('--commit2', help="Revision to compare with") |
405 | parser_build.add_argument('--commit-number2', help="Revision number to compare with, redundant if --commit2 is specified") | 421 | parser_build.add_argument('--commit-number2', help="Revision number to compare with, redundant if --commit2 is specified") |
422 | parser_build.add_argument('-l', '--limit', default=REGRESSIONS_DISPLAY_LIMIT, help="Maximum number of changes to display per test. Can be set to 0 to print all changes") | ||
406 | 423 | ||