Lei Lei | 75b4ff7 | 2019-08-21 19:03:54 | [diff] [blame] | 1 | Testing is an essential component of software development in Chromium, |
| 2 | it ensures Chrome is behaving as we expect, and is critical to find bugs and |
| 3 | regressions at early stage. |
| 4 | |
| 5 | This document covers the high level overview of testing in Chromium, |
| 6 | including what type of tests we have, what's the purpose for each test type, |
| 7 | what tests are needed for new features etc. |
| 8 | |
| 9 | ## Test Types |
| 10 | |
| 11 | There are several different types of tests in Chromium to serve different purposes, |
| 12 | some types of test are running on multiple platforms, others are specific |
| 13 | for 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. |
| 18 | * **[Junit]** is a unit testing framework |
| 19 | for the Java programming language, and it is used to write |
| 20 | unit tests on Android for Java code in Chromium. |
| 21 | * **Browser Tests** is built on top of gtest, and it is used to write integration tests |
| 22 | and e2e tests in Chromium. |
| 23 | <!-- TODO(leilei) Add link to browser tests ---> |
| 24 | * **[Web Tests] (formerly known as "Layout Tests" or "LayoutTests")** |
| 25 | is used by Blink to test many components, including but not |
| 26 | limited to layout and rendering. In general, web tests involve loading pages |
| 27 | in a test renderer (`content_shell`) and comparing the rendered output or |
| 28 | JavaScript output against an expected output file. |
| 29 | Web Tests are required to launch new W3C API support in Chromium. |
| 30 | * **[Instrumentation Tests]** is a test framework specific for Android platform, |
| 31 | it is used to write integration tests or e2e tests for Chromium on Android. |
| 32 | * **[EarlGrey]** is the integration testing framework used by Chromium for iOS. |
| 33 | * **[Telemetry]** is the performance testing framework used by Chromium. |
| 34 | It allows you to perform arbitrary actions on a set of web pages and |
| 35 | report metrics about it. |
| 36 | * **[Fuzzer Tests]** is used to uncover potential security & stability problems in Chromium. |
Ben Pastene | b30c66e9 | 2019-08-30 23:25:10 | [diff] [blame] | 37 | * **[Tast]** is a test framework for system integration tests on Chrome OS. |
Lei Lei | 75b4ff7 | 2019-08-21 19:03:54 | [diff] [blame] | 38 | |
| 39 | |
| 40 | The following table shows which types of test works on which platforms. |
| 41 | |
| 42 | | | Linux | Windows | Mac | Android | iOS | CrOS | |
| 43 | |:----------------------------|:--------|:--------|:--------|:--------|:--------|:--------| |
| 44 | | gtest(C++) | √ | √ | √ | √ | √ | √ | |
| 45 | | Junit(Java) | | | | √ | | | |
| 46 | | Browser Tests(C++) | √ | √ | √ | √ | | | |
| 47 | | Web Tests(HTML, JS) | √ | √ | √ | | | | |
Ben Pastene | b30c66e9 | 2019-08-30 23:25:10 | [diff] [blame] | 48 | | Telemetry(Python) | √ | √ | √ | √ | | √ | |
Lei Lei | 75b4ff7 | 2019-08-21 19:03:54 | [diff] [blame] | 49 | | Instrumentation Tests(Java) | | | | √ | | | |
| 50 | | EarlGrey | | | | | √ | | |
| 51 | | Fuzzer Tests(C++) | √ | √ | √ | √ | | √ | |
Ben Pastene | b30c66e9 | 2019-08-30 23:25:10 | [diff] [blame] | 52 | | Tast(Golang) | | | | | | √ | |
Lei Lei | 75b4ff7 | 2019-08-21 19:03:54 | [diff] [blame] | 53 | |
| 54 | *** note |
| 55 | **Browser Tests Note** |
| 56 | |
| 57 | Only subset of browser tests are enabled on Android: |
| 58 | * components_browsertests |
| 59 | * content_browsertests |
Lei Lei | 75b4ff7 | 2019-08-21 19:03:54 | [diff] [blame] | 60 | |
| 61 | Other browser tests are not supported on Android yet. [crbug/611756] |
| 62 | tracks the effort to enable them on Android. |
| 63 | *** |
| 64 | |
| 65 | *** note |
| 66 | **Web Tests Note** |
| 67 | |
| 68 | Web Tests were enabled on Android K before, but it is disabled on Android platform now, |
| 69 | see [this thread](https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/338WKwWPbPI/discussion) for more context. |
| 70 | *** |
| 71 | |
Lei Lei | 75b4ff7 | 2019-08-21 19:03:54 | [diff] [blame] | 72 | ## General Principles |
| 73 | |
| 74 | * All the tests in Chromium running on CQ and main waterfall should be hermetic and stable. |
| 75 | * Add unit tests along with the code in same changelist instead of adding tests in future, |
| 76 | it is most likely no one will add tests later. |
| 77 | * Write enough unit tests to have good [code coverage](./code_coverage.md), |
| 78 | since they are fast and stable. |
| 79 | * Don't enable tests with external dependencies on CQ and main waterfall, |
| 80 | e.g. tests against live sites. |
| 81 | It is fine to check in those tests, but only run them on your own bots. |
Dirk Pranke | e034e1ef5 | 2020-07-03 00:48:08 | [diff] [blame] | 82 | * Eventually, all tests should implement the |
| 83 | [Test Executable API](./test_executable_api.md) command line interface. |
Lei Lei | 75b4ff7 | 2019-08-21 19:03:54 | [diff] [blame] | 84 | |
| 85 | ## What tests are needed for new features |
| 86 | |
| 87 | * **Unit Tests** are needed no matter where the code is for your feature. |
| 88 | It is the best practice to add the unit tests |
| 89 | when you add new code or update existing code in the same changelist, |
Dirk Pranke | e034e1ef5 | 2020-07-03 00:48:08 | [diff] [blame] | 90 | check out [Code Coverage in Gerrit](./code_coverage_in_gerrit.md) |
Lei Lei | 75b4ff7 | 2019-08-21 19:03:54 | [diff] [blame] | 91 | for the instruction about how to see the code coverage in Gerrit. |
| 92 | * **Browser Tests** are recommended for integration tests and e2e tests. |
| 93 | It will be great if you add browser tests to cover the major user |
| 94 | cases for your feature, even with some mocking. |
| 95 | * **[Web Tests]** are required if you plan to launch new W3C APIs in Chrome. |
| 96 | * **[Instrumentation Tests]** are recommended for features on Android, you only |
| 97 | need to write instrumentation features |
| 98 | if your feature is supported on Android for integration tests or e2e tests. |
| 99 | * **EarlGrey Tests** are recommended for iOS only. |
| 100 | * **[Telemetry] benchmarking or stories** are needed if existing telemetry |
| 101 | benchmarks or stories can't cover the performance for your feature, |
| 102 | you need to either add new story, but reuse existing metrics or |
| 103 | add new benchmarks for your feature. Talk to benchmarking team first |
| 104 | before start to add Telemetry benchmarks or stories. |
| 105 | * **[Fuzzer Tests]** are recommended if your feature adds user facing APIs |
| 106 | in Chromium, it is recommended to write fuzzer tests to detect the security issue. |
| 107 | |
| 108 | Right now, code coverage is the only way we have to measure test coverage. |
| 109 | The following is the recommended thresholds for different code coverage levels: |
| 110 | * >level 1(improving): >0% |
| 111 | * >level 2(acceptable): 60% |
| 112 | * >level 3(commendable): 75% |
| 113 | * >level 4(exemplary): 90% |
| 114 | |
Bastian Kersting | 1aef80b | 2022-05-13 10:34:35 | [diff] [blame] | 115 | Go to [code coverage dashboard](https://analysis.chromium.org/coverage/p/chromium) to check the code coverage for your project. |
Lei Lei | 75b4ff7 | 2019-08-21 19:03:54 | [diff] [blame] | 116 | |
| 117 | |
| 118 | ## How to write new tests |
| 119 | * [Simple gtests] |
| 120 | * [Writing JUnit tests] |
| 121 | * [Writing Browser Tests] |
| 122 | * [Writing Instrumentation Tests] |
| 123 | * [Writing EarlGrey Tests] |
| 124 | * [Writing Telemetry Benchmarks/Stories] |
| 125 | * [Writing Web Tests](./writing_web_tests.md) |
| 126 | * [Write Fuzz Target] |
| 127 | |
| 128 | >TODO: add the link to the instruction about how to enable new tests in CQ and main waterfall |
| 129 | |
| 130 | ## How to run tests |
| 131 | |
| 132 | ### Run tests locally |
Delan Azabani | b4a421a | 2021-05-26 08:46:01 | [diff] [blame] | 133 | * [Run gtest locally](#Run-gtest-locally) |
Lei Lei | 75b4ff7 | 2019-08-21 19:03:54 | [diff] [blame] | 134 | * [Run browser tests locally] |
| 135 | * [Run tests on Android](./android_test_instructions.md#Running-Tests) |
| 136 | It includes the instructions to run gTests, JUnit tests and Instrumentation tests on Android. |
| 137 | * [Run EarlGrey tests locally](../ios/testing.md#running-tests-from-xcode) |
Delan Azabani | b4a421a | 2021-05-26 08:46:01 | [diff] [blame] | 138 | * [Run Web Tests locally](./web_tests.md#running-web-tests) |
Lei Lei | 75b4ff7 | 2019-08-21 19:03:54 | [diff] [blame] | 139 | * [Telemetry: Run benchmarks locally] |
| 140 | * [Run fuzz target locally] |
| 141 | |
Delan Azabani | b4a421a | 2021-05-26 08:46:01 | [diff] [blame] | 142 | #### Run gtest locally |
| 143 | |
| 144 | Before you can run a gtest, you need to build the appropriate launcher target |
| 145 | that contains your test, such as `blink_unittests`: |
| 146 | |
| 147 | ```bash |
| 148 | autoninja -C out/Default blink_unittests |
| 149 | ``` |
| 150 | |
| 151 | To run specific tests, rather than all tests in a launcher, pass |
| 152 | `--gtest_filter=` with a pattern. The simplest pattern is the full name of a |
| 153 | test (SuiteOrFixtureName.TestName), but you can use wildcards: |
| 154 | |
| 155 | ```bash |
| 156 | out/Default/blink_unittests --gtest_filter='Foo*' |
| 157 | ``` |
| 158 | |
| 159 | Use `--help` for more ways to select and run tests. |
| 160 | |
Lei Lei | 75b4ff7 | 2019-08-21 19:03:54 | [diff] [blame] | 161 | ### Run tests remotely(on Swarming) |
| 162 | >TODO: add the link to the instruction about how to run tests on Swarming. |
| 163 | |
| 164 | ## How to debug tests |
| 165 | * [Android Debugging Instructions] |
Ben Pastene | b30c66e9 | 2019-08-30 23:25:10 | [diff] [blame] | 166 | * [Chrome OS Debugging Tips] |
Lei Lei | 75b4ff7 | 2019-08-21 19:03:54 | [diff] [blame] | 167 | * [Debugging Web Tests] |
| 168 | |
| 169 | ## How to deal with flaky tests |
| 170 | |
Matthew Warton | c9908ca | 2022-11-01 17:20:54 | [diff] [blame] | 171 | Go to [LUCI Analysis] to find reports about flaky tests in your projects. |
Lei Lei | 75b4ff7 | 2019-08-21 19:03:54 | [diff] [blame] | 172 | |
Stephen McGruer | 5f4af313 | 2020-11-05 21:05:52 | [diff] [blame] | 173 | * [Addressing Flaky GTests](./gtest_flake_tips.md) |
| 174 | * [Addressing Flaky Web Tests](./web_tests_addressing_flake.md) |
| 175 | * [Addressing Flaky WPTs](./web_platform_tests_addressing_flake.md) |
Lei Lei | 75b4ff7 | 2019-08-21 19:03:54 | [diff] [blame] | 176 | |
Stephen McGruer | 5f4af313 | 2020-11-05 21:05:52 | [diff] [blame] | 177 | If you cannot fix a flaky test in a short timeframe, disable it first to reduce |
| 178 | development pain for other and then fix it later. "[How do I disable a flaky |
| 179 | test]" has instructions on how to disable a flaky test. |
Lei Lei | 75b4ff7 | 2019-08-21 19:03:54 | [diff] [blame] | 180 | |
Robert Kaplow | 8202763 | 2023-02-13 16:31:52 | [diff] [blame] | 181 | ## Other |
| 182 | |
| 183 | Tests are not configured to upload metrics, such as UMA, UKM or crash reports. |
| 184 | |
Lei Lei | 75b4ff7 | 2019-08-21 19:03:54 | [diff] [blame] | 185 | [gtest]: https://github.com/google/googletest |
Eric Willigers | c2e3d881 | 2022-01-17 01:59:37 | [diff] [blame] | 186 | [Simple gtests]: https://github.com/google/googletest/blob/main/docs/primer.md#simple-tests |
Lei Lei | 75b4ff7 | 2019-08-21 19:03:54 | [diff] [blame] | 187 | [Junit]: https://developer.android.com/training/testing/junit-rules |
John Palmer | 046f987 | 2021-05-24 01:24:56 | [diff] [blame] | 188 | [Instrumentation Tests]: https://chromium.googlesource.com/chromium/src/+/main/testing/android/docs/instrumentation.md |
Lei Lei | 75b4ff7 | 2019-08-21 19:03:54 | [diff] [blame] | 189 | [EarlGrey]: https://github.com/google/EarlGrey |
| 190 | [Telemetry]: https://chromium.googlesource.com/catapult/+/HEAD/telemetry/README.md |
John Palmer | 046f987 | 2021-05-24 01:24:56 | [diff] [blame] | 191 | [Fuzzer Tests]: https://chromium.googlesource.com/chromium/src/+/main/testing/libfuzzer/README.md |
Ben Pastene | b30c66e9 | 2019-08-30 23:25:10 | [diff] [blame] | 192 | [Tast]: https://chromium.googlesource.com/chromiumos/platform/tast/+/HEAD/README.md |
Lei Lei | 75b4ff7 | 2019-08-21 19:03:54 | [diff] [blame] | 193 | [Web Tests]: ./web_tests.md |
| 194 | [crbug/611756]: https://bugs.chromium.org/p/chromium/issues/detail?id=611756 |
Matthew Warton | c9908ca | 2022-11-01 17:20:54 | [diff] [blame] | 195 | [LUCI Analysis]: https://luci-analysis.appspot.com/ |
John Palmer | 046f987 | 2021-05-24 01:24:56 | [diff] [blame] | 196 | [Write Fuzz Target]: https://chromium.googlesource.com/chromium/src/+/main/testing/libfuzzer/getting_started.md#write-fuzz-target |
Lei Lei | 75b4ff7 | 2019-08-21 19:03:54 | [diff] [blame] | 197 | [Telemetry: Run benchmarks locally]: https://chromium.googlesource.com/catapult/+/HEAD/telemetry/docs/run_benchmarks_locally.md |
John Palmer | 046f987 | 2021-05-24 01:24:56 | [diff] [blame] | 198 | [Run fuzz target locally]: https://chromium.googlesource.com/chromium/src/+/main/testing/libfuzzer/getting_started.md#build-and-run-fuzz-target-locally |
Lei Lei | 75b4ff7 | 2019-08-21 19:03:54 | [diff] [blame] | 199 | [Android Debugging Instructions]: https://chromium.googlesource.com/chromium/src/+/HEAD/docs/android_debugging_instructions.md |
Ben Pastene | b30c66e9 | 2019-08-30 23:25:10 | [diff] [blame] | 200 | [Chrome OS Debugging Tips]: ./chromeos_debugging_tips.md |
Lei Lei | 75b4ff7 | 2019-08-21 19:03:54 | [diff] [blame] | 201 | [Debugging Web Tests]: https://chromium.googlesource.com/chromium/src/+/HEAD/docs/testing/web_tests.md#Debugging-Web-Tests |
| 202 | [code coverage dashboard]: https://analysis.chromium.org/p/chromium/coverage |
| 203 | [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- |