After an upgrade, the reports nobody opens are the ones that break. You can test them all without a PDF engine: render each report's QWeb as HTML on a couple of real records, inside a savepoint that you always roll back.
Disclosure: I make a paid Odoo module that automates this (link at the bottom).
Two details matter. First, an error from QWeb wraps the real cause; the exception's __cause__ has it, and the message names the template and element. Second, some standard reports refuse on purpose: Odoo's "Hash integrity result" raises a UserError ("contact your accountant") when its conditions aren't met. That's not breakage, so classify UserError as skipped.
On a demo database with 50 reports, 32 rendered fine, 16 were skipped because there was no record to test with, and only the two I had broken on purpose failed. Nothing in Odoo's own reports was flagged.
I turned this into a module called Report Breakage Checker, 29 EUR on the Apps Store: https://apps.odoo.com/apps/modules/19.0/report_breakage_checker/
