blob: e6c37dc05ef847a097df56d733ad86a77f6ea8ae [file] [log] [blame] [view]
Lei Lei75b4ff72019-08-21 19:03:541Testing is an essential component of software development in Chromium,
2it ensures Chrome is behaving as we expect, and is critical to find bugs and
3regressions at early stage.
4
5This document covers the high level overview of testing in Chromium,
6including what type of tests we have, what's the purpose for each test type,
7what tests are needed for new features etc.
8
9## Test Types
10
11There are several different types of tests in Chromium to serve different purposes,
12some types of test are running on multiple platforms, others are specific
13for one platform.
14
15* **[gtest]** is Google's C++ test framework,
16 which helps you write better C++ tests in Chromium.
17 gtest is test framework for unit tests in Chromium and browser tests are built on top of it.
Weizhong Xiaaec77252025-04-24 18:39:4418* **[Browser Tests]** is built on top of gtest, and it is used to write integration tests
Lei Lei75b4ff72019-08-21 19:03:5419 and e2e tests in Chromium.
Lei Lei75b4ff72019-08-21 19:03:5420* **[Web Tests] (formerly known as "Layout Tests" or "LayoutTests")**
21 is used by Blink to test many components, including but not
22 limited to layout and rendering. In general, web tests involve loading pages
23 in a test renderer (`content_shell`) and comparing the rendered output or
24 JavaScript output against an expected output file.
25 Web Tests are required to launch new W3C API support in Chromium.
Andrew Grieveb5b3bb32023-10-04 13:55:5126* **[Robolectric]** is build on top of JUnit 4. It emulates Android APIs so
27 that tests can be run on the host machine instead of on devices / emulators.
28* **[Instrumentation Tests]** are JUnit tests that run on devices / emulators.
Lei Lei75b4ff72019-08-21 19:03:5429* **[EarlGrey]** is the integration testing framework used by Chromium for iOS.
30* **[Telemetry]** is the performance testing framework used by Chromium.
31 It allows you to perform arbitrary actions on a set of web pages and
32 report metrics about it.
33* **[Fuzzer Tests]** is used to uncover potential security & stability problems in Chromium.
Ben Pasteneb30c66e92019-08-30 23:25:1034* **[Tast]** is a test framework for system integration tests on Chrome OS.
Lei Lei75b4ff72019-08-21 19:03:5435
36
37The following table shows which types of test works on which platforms.
38
39| | Linux | Windows | Mac | Android | iOS | CrOS |
40|:----------------------------|:--------|:--------|:--------|:--------|:--------|:--------|
41| gtest(C++) | √ | √ | √ | √ | √ | √ |
Lei Lei75b4ff72019-08-21 19:03:5442| Browser Tests(C++) | √ | √ | √ | √ | | |
43| Web Tests(HTML, JS) | √ | √ | √ | | | |
Ben Pasteneb30c66e92019-08-30 23:25:1044| Telemetry(Python) | √ | √ | √ | √ | | √ |
Andrew Grieveb5b3bb32023-10-04 13:55:5145| Robolectric(Java) | | | | √ | | |
Lei Lei75b4ff72019-08-21 19:03:5446| Instrumentation Tests(Java) | | | | √ | | |
47| EarlGrey | | | | | √ | |
48| Fuzzer Tests(C++) | √ | √ | √ | √ | | √ |
Ben Pasteneb30c66e92019-08-30 23:25:1049| Tast(Golang) | | | | | | √ |
Lei Lei75b4ff72019-08-21 19:03:5450
51*** note
52**Browser Tests Note**
53
54Only subset of browser tests are enabled on Android:
55* components_browsertests
56* content_browsertests
Lei Lei75b4ff72019-08-21 19:03:5457
58Other browser tests are not supported on Android yet. [crbug/611756]
59tracks the effort to enable them on Android.
60***
61
62*** note
63**Web Tests Note**
64
65Web Tests were enabled on Android K before, but it is disabled on Android platform now,
66see [this thread](https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/338WKwWPbPI/discussion) for more context.
67***
68
John Abd-El-Malek33524c22024-01-29 19:41:2369*** note
70**Tast Tests Note**
71
72Tast tests are written, maintained and gardened by ChromeOS engineers.
73
74ChromeOS tests that Chrome engineers support should be (re)written in the following priority order:
75* unit tests
76* linux_chromeos browser_tests
77* linux_chromeos interactive_ui_tests
78* [Crosier tests](http://go/crosier)
79
80When a Tast test fails:
81* If the change is written by a ChromeOS engineer, the ChromeOS [gardener](http://go/cros-gardening) can revert it.
82* Otherwise the ChromeOS gardener can revert the Chrome-authored change accompanied by a test from the supported frameworks above or manual repro steps that a Chrome engineer can run under [linux_chromeos](../chromeos_build_instructions.md#Chromium-OS-on-Linux-linux_chromeos) (preferable) or using Simple Chrome VM [instructions](https://chromium.googlesource.com/chromiumos/docs/+/HEAD/simple_chrome_workflow.md).
83* If the above is not possible, the ChromeOS gardener or ChromeOS feature owner should inform the author about the failure, and the author uses their best judgment on whether to revert, fix on trunk, or let ChromeOS engineers update the test (e.g. if test needs an update or if the test is just testing internal implementation details of Chrome but doesn't break user functionality).
84
85
86***
87
Lei Lei75b4ff72019-08-21 19:03:5488## General Principles
89
90* All the tests in Chromium running on CQ and main waterfall should be hermetic and stable.
91* Add unit tests along with the code in same changelist instead of adding tests in future,
92 it is most likely no one will add tests later.
93* Write enough unit tests to have good [code coverage](./code_coverage.md),
94 since they are fast and stable.
95* Don't enable tests with external dependencies on CQ and main waterfall,
96 e.g. tests against live sites.
97 It is fine to check in those tests, but only run them on your own bots.
Dirk Prankee034e1ef52020-07-03 00:48:0898* Eventually, all tests should implement the
99 [Test Executable API](./test_executable_api.md) command line interface.
Lei Lei75b4ff72019-08-21 19:03:54100
101## What tests are needed for new features
102
103* **Unit Tests** are needed no matter where the code is for your feature.
104 It is the best practice to add the unit tests
105 when you add new code or update existing code in the same changelist,
Dirk Prankee034e1ef52020-07-03 00:48:08106 check out [Code Coverage in Gerrit](./code_coverage_in_gerrit.md)
Lei Lei75b4ff72019-08-21 19:03:54107 for the instruction about how to see the code coverage in Gerrit.
108* **Browser Tests** are recommended for integration tests and e2e tests.
109 It will be great if you add browser tests to cover the major user
110 cases for your feature, even with some mocking.
111* **[Web Tests]** are required if you plan to launch new W3C APIs in Chrome.
112* **[Instrumentation Tests]** are recommended for features on Android, you only
113 need to write instrumentation features
114 if your feature is supported on Android for integration tests or e2e tests.
115* **EarlGrey Tests** are recommended for iOS only.
116* **[Telemetry] benchmarking or stories** are needed if existing telemetry
117 benchmarks or stories can't cover the performance for your feature,
118 you need to either add new story, but reuse existing metrics or
119 add new benchmarks for your feature. Talk to benchmarking team first
120 before start to add Telemetry benchmarks or stories.
121* **[Fuzzer Tests]** are recommended if your feature adds user facing APIs
122 in Chromium, it is recommended to write fuzzer tests to detect the security issue.
123
124Right now, code coverage is the only way we have to measure test coverage.
125The following is the recommended thresholds for different code coverage levels:
126* >level 1(improving): >0%
127* >level 2(acceptable): 60%
128* >level 3(commendable): 75%
129* >level 4(exemplary): 90%
130
Bastian Kersting1aef80b2022-05-13 10:34:35131Go to [code coverage dashboard](https://analysis.chromium.org/coverage/p/chromium) to check the code coverage for your project.
Lei Lei75b4ff72019-08-21 19:03:54132
133
134## How to write new tests
135* [Simple gtests]
136* [Writing JUnit tests]
137* [Writing Browser Tests]
138* [Writing Instrumentation Tests]
139* [Writing EarlGrey Tests]
140* [Writing Telemetry Benchmarks/Stories]
141* [Writing Web Tests](./writing_web_tests.md)
142* [Write Fuzz Target]
143
144>TODO: add the link to the instruction about how to enable new tests in CQ and main waterfall
145
146## How to run tests
147
148### Run tests locally
Delan Azabanib4a421a2021-05-26 08:46:01149* [Run gtest locally](#Run-gtest-locally)
Lei Lei75b4ff72019-08-21 19:03:54150* [Run browser tests locally]
151* [Run tests on Android](./android_test_instructions.md#Running-Tests)
152 It includes the instructions to run gTests, JUnit tests and Instrumentation tests on Android.
153* [Run EarlGrey tests locally](../ios/testing.md#running-tests-from-xcode)
Delan Azabanib4a421a2021-05-26 08:46:01154* [Run Web Tests locally](./web_tests.md#running-web-tests)
Lei Lei75b4ff72019-08-21 19:03:54155* [Telemetry: Run benchmarks locally]
156* [Run fuzz target locally]
157
Delan Azabanib4a421a2021-05-26 08:46:01158#### Run gtest locally
159
160Before you can run a gtest, you need to build the appropriate launcher target
161that contains your test, such as `blink_unittests`:
162
163```bash
164autoninja -C out/Default blink_unittests
165```
166
167To run specific tests, rather than all tests in a launcher, pass
168`--gtest_filter=` with a pattern. The simplest pattern is the full name of a
169test (SuiteOrFixtureName.TestName), but you can use wildcards:
170
171```bash
172out/Default/blink_unittests --gtest_filter='Foo*'
173```
174
175Use `--help` for more ways to select and run tests.
176
Lei Lei75b4ff72019-08-21 19:03:54177### Run tests remotely(on Swarming)
178>TODO: add the link to the instruction about how to run tests on Swarming.
179
180## How to debug tests
181* [Android Debugging Instructions]
Ben Pasteneb30c66e92019-08-30 23:25:10182* [Chrome OS Debugging Tips]
Lei Lei75b4ff72019-08-21 19:03:54183* [Debugging Web Tests]
184
185## How to deal with flaky tests
186
Matthew Wartonc9908ca2022-11-01 17:20:54187Go to [LUCI Analysis] to find reports about flaky tests in your projects.
Lei Lei75b4ff72019-08-21 19:03:54188
Stephen McGruer5f4af3132020-11-05 21:05:52189* [Addressing Flaky GTests](./gtest_flake_tips.md)
190* [Addressing Flaky Web Tests](./web_tests_addressing_flake.md)
191* [Addressing Flaky WPTs](./web_platform_tests_addressing_flake.md)
Lei Lei75b4ff72019-08-21 19:03:54192
Stephen McGruer5f4af3132020-11-05 21:05:52193If you cannot fix a flaky test in a short timeframe, disable it first to reduce
194development pain for other and then fix it later. "[How do I disable a flaky
195test]" has instructions on how to disable a flaky test.
Lei Lei75b4ff72019-08-21 19:03:54196
Robert Kaplow82027632023-02-13 16:31:52197## Other
198
199Tests are not configured to upload metrics, such as UMA, UKM or crash reports.
200
Lei Lei75b4ff72019-08-21 19:03:54201[gtest]: https://github.com/google/googletest
Eric Willigersc2e3d8812022-01-17 01:59:37202[Simple gtests]: https://github.com/google/googletest/blob/main/docs/primer.md#simple-tests
Weizhong Xiaaec77252025-04-24 18:39:44203[Browser Tests]: https://chromium.googlesource.com/website/+/HEAD/site/developers/testing/browser-tests/index.md
Andrew Grieveb5b3bb32023-10-04 13:55:51204[Robolectric]: android_robolectric_tests.md
205[Instrumentation Tests]: https://chromium.googlesource.com/chromium/src/+/main/docs/testing/android_instrumentation_tests.md
Lei Lei75b4ff72019-08-21 19:03:54206[EarlGrey]: https://github.com/google/EarlGrey
207[Telemetry]: https://chromium.googlesource.com/catapult/+/HEAD/telemetry/README.md
John Palmer046f9872021-05-24 01:24:56208[Fuzzer Tests]: https://chromium.googlesource.com/chromium/src/+/main/testing/libfuzzer/README.md
Ben Pasteneb30c66e92019-08-30 23:25:10209[Tast]: https://chromium.googlesource.com/chromiumos/platform/tast/+/HEAD/README.md
Lei Lei75b4ff72019-08-21 19:03:54210[Web Tests]: ./web_tests.md
211[crbug/611756]: https://bugs.chromium.org/p/chromium/issues/detail?id=611756
Matthew Wartonc9908ca2022-11-01 17:20:54212[LUCI Analysis]: https://luci-analysis.appspot.com/
John Palmer046f9872021-05-24 01:24:56213[Write Fuzz Target]: https://chromium.googlesource.com/chromium/src/+/main/testing/libfuzzer/getting_started.md#write-fuzz-target
Lei Lei75b4ff72019-08-21 19:03:54214[Telemetry: Run benchmarks locally]: https://chromium.googlesource.com/catapult/+/HEAD/telemetry/docs/run_benchmarks_locally.md
John Palmer046f9872021-05-24 01:24:56215[Run fuzz target locally]: https://chromium.googlesource.com/chromium/src/+/main/testing/libfuzzer/getting_started.md#build-and-run-fuzz-target-locally
Lei Lei75b4ff72019-08-21 19:03:54216[Android Debugging Instructions]: https://chromium.googlesource.com/chromium/src/+/HEAD/docs/android_debugging_instructions.md
Ben Pasteneb30c66e92019-08-30 23:25:10217[Chrome OS Debugging Tips]: ./chromeos_debugging_tips.md
Lei Lei75b4ff72019-08-21 19:03:54218[Debugging Web Tests]: https://chromium.googlesource.com/chromium/src/+/HEAD/docs/testing/web_tests.md#Debugging-Web-Tests
219[code coverage dashboard]: https://analysis.chromium.org/p/chromium/coverage
220[How do I disable a flaky test]: https://www.chromium.org/developers/tree-sheriffs/sheriff-details-chromium#TOC-How-do-I-disable-a-flaky-test-