blob: 266b993dd23c1588b3d73ca8c21489d79759f33e [file] [log] [blame] [view]
Yuke Liao8bc00852019-01-29 19:22:391# Code Coverage in Gerrit
2
Yuke Liao0e5a20e2019-06-17 19:52:573Tests are critical because they find bugs and regressions, enforce better
4designs and make code easier to maintain. **Code coverage helps you ensure your
5tests are thorough**.
Yuke Liao8bc00852019-01-29 19:22:396
Yuke Liao0e5a20e2019-06-17 19:52:577Chromium CLs can show a line-by-line breakdown of test coverage. **You can use
Yuke Liao78aa43b2019-08-29 16:58:178it to ensure you only submit well-tested code**.
Yuke Liao0e5a20e2019-06-17 19:52:579
Yuke Liao78aa43b2019-08-29 16:58:1710To see code coverage for a Chromium CL, **trigger a CQ dry run**, and once the
Yuke Liaoa085b982019-10-24 21:37:1111builds finish and code coverage data is processed successfully, **look at the
12change view to see absolute and incremental code coverage percentages**:
13
14![code_coverage_percentages]
15
16Absolute coverage percentage is the percentage of lines covered by tests
17out of **all the lines** in the file, while incremental coverage percentage only
Prakharc7ae92e2023-09-20 09:34:5218accounts for **newly added or modified lines**. Both these coverage metrics, are further
19classified into Unit Tests coverage(coverage from just unit tests) and All Tests coverage(covererd by all tests running in CQ, including unit tests). All Tests coverage is a superset of Unit Tests coverage.
Yuke Liaoa085b982019-10-24 21:37:1120
21To further dig into specific lines that are not covered by tests, **look at the
Prakharc7ae92e2023-09-20 09:34:5222right column of the side by side diff view**. It only shows All Tests Coverage right now
Yuke Liao8bc00852019-01-29 19:22:3923
Yuke Liao0e5a20e2019-06-17 19:52:5724![code_coverage_annotations]
25
Yuke Liao78aa43b2019-08-29 16:58:1726**Code coverage data is shared between patchsets that are commit-message-edit or
27trivial-rebase away**, however, if a newly uploaded patchset has
28non-trivial code change, a new CQ dry run must be triggered before coverage data
29shows up again.
30
Prakharc7ae92e2023-09-20 09:34:5231The code coverage tool supports coverage for C/C++, JAVA and Javascript on all major platforms(Linux, MacOS, Windows, Android, iOS and ChromeOS)
Yuke Liao6e57a8a2019-11-12 22:23:4932
Prakharc7ae92e2023-09-20 09:34:5233## CLs Blocked Due to Low Coverage
34For some teams in Chrome, we have turned on a coverage check, which blocks a CL from submission if the incremental coverage is below a preset threshold(default = 70%). CLs with insufficient test coverage have a `CodeCoverage-1` label added to them, which prevents them from being submitted. Also, a descriptive message is added to the CL, notifying developer of why the CL was blocked, and how to resolve it.
35![low_coverage_message]
36
37Once the tests are added, another run of coverage builders (through CQ+1 or CQ+2) changes the label to `CodeCoverage+1`, allowing CLs to proceed with submission.
38
39Devs can also choose to bypass this block, in case they think they are being unfairly punished. They can do so by adding a *Low-Coverage-Reason: reason* footer to the change description. The `reason` string should mention the category the bypass reason belongs to. For e.g. *Low-Coverage-Reason: TRIVIAL_CHANGE This change contains only minor cosmetic changes.* (TRIVIAL_CHANGE is the category)
40
41Available category choices are:
42* **TRIVIAL_CHANGE**: CL contains mostly minor changes e.g. renaming, file moves, logging statements, simple interface definitions etc.
43* **TESTS_ARE_DISABLED**: Corresponding tests exist, but they are currently disabled.
44* **TESTS_IN_SEPARATE_CL**: Developer plan to write tests in a separate CL (Should not be exercised often as per best practices)
45* **HARD_TO_TEST**: The code under consideration is hard to test. For e.g. Interfaces with system, real hardware etc.
46* **COVERAGE_UNDERREPORTED**: To be used when the developer thinks that tests exist, but corresponding coverage is missing.
47* **LARGE_SCALE_REFACTOR**: The current change is part of a large scale refactor. Should explain why the refactor shouldn't have tests.
48* **EXPERIMENTAL_CODE**: The current code is experimental and unlikely to be released to users.
49* **OTHER**: None of the above categories are the right fit
50
51In case the developer doesn't specify the coverage category as prescribed, a warning will be shown in the UI, with details on how to fix
52![impropery_formatted_coverage_footer]
Yuke Liao0e5a20e2019-06-17 19:52:5753
Yuke Liao8bc00852019-01-29 19:22:3954## Contacts
55
56### Reporting problems
57For any breakage report and feature requests, please [file a bug].
58
59### Mailing list
60For questions and general discussions, please join [code-coverage group].
61
62## FAQ
Yuke Liao8bc00852019-01-29 19:22:3963### Why is coverage not shown even though the try job finished successfully?
64
65There are several possible reasons:
Yuke Liao8bc00852019-01-29 19:22:3966* A particular source file/test may not be available on a particular project or
67platform. As of now, only `chromium/src` project and `Linux` platform is
68supported.
69* There is a bug in the pipeline. Please [file a bug] to report the breakage.
70
71### How does it work?
72
73Please refer to [code_coverage.md] for how code coverage works in Chromium in
74general, and specifically, for per-CL coverage in Gerrit, the
75[clang_code_coverage_wrapper] is used to compile and instrument ONLY the source
Yuke Liao0e5a20e2019-06-17 19:52:5776files that are affected by the CL for the sake of performance and a
77[chromium-coverage Gerrit plugin] is used to display code coverage information
78in Gerrit.
Yuke Liao8bc00852019-01-29 19:22:3979
80
81[choose_tryjobs]: images/code_coverage_choose_tryjobs.png
Yuke Liao0e5a20e2019-06-17 19:52:5782[code_coverage_annotations]: images/code_coverage_annotations.png
Yuke Liaoa085b982019-10-24 21:37:1183[code_coverage_percentages]: images/code_coverage_percentages.png
Prakharc7ae92e2023-09-20 09:34:5284[low_coverage_message]: images/low_coverage_message.png
85[impropery_formatted_coverage_footer]: images/improperly_formatted_coverage_footer.png
Yuke Liao03c644072019-07-30 18:33:4086[file a bug]: https://bugs.chromium.org/p/chromium/issues/entry?components=Infra%3ETest%3ECodeCoverage
Yuke Liao8bc00852019-01-29 19:22:3987[code-coverage group]: https://groups.google.com/a/chromium.org/forum/#!forum/code-coverage
88[code_coverage.md]: code_coverage.md
John Palmer046f9872021-05-24 01:24:5689[clang_code_coverage_wrapper]: https://chromium.googlesource.com/chromium/src/+/main/docs/clang_code_coverage_wrapper.md
Yuke Liao8bc00852019-01-29 19:22:3990[chromium-coverage Gerrit plugin]: https://chromium.googlesource.com/infra/gerrit-plugins/code-coverage/