blob: 2df00c18dc0e42351bc4e7f3c35321f6ccec31f1 [file] [log] [blame] [view]
AndroidX Core Team2e416b22020-12-03 22:58:07 +00001# Testing
2
3[TOC]
4
5AndroidX contains unit and integration tests that are run automatically when a
6change is uploaded. It also contains a number of sample applications that are
7useful for demonstrating how to use features as well as performing manual
8testing.
9
AndroidX Core Teamaa5f6572023-11-28 08:39:09 -080010## Motivation
11
12Jetpack libraries are developed with the intention that they are functionally
13stable and production-ready as of the first public `alpha01` release, and that
14they remain production-ready at tip-of-tree thereafter.
15
16For this reason, we emphasize that continuous integration testing -- both pre-
17and post-submit -- is the ultimate source of truth for library correctness. If
18tests are failing at head, the library is not only at risk of blocking public
19releases but at risk of breaking production Google apps that rely on its
20tip-of-tree builds.
21
22### API level coverage in CI
23
24Generally, we aim to test Jetpack libraries against (1) the earliest supported
25API level, (2) the latest stable API level, (3) API levels with major changes,
26(4) API levels with high concentration of devices in the field, and (5) the next
27pre-release API level.
28
29In practice, this is limited by device and emulator availability and
30reliability. As of November 2023, we run tests on the following API levels:
31
32- API level 21: the lowest API level supported by Firebase Test Lab (FTL)
33- API level 26: the lowest supported ARM-based emulator FTL runner, which has
34 much greater performance and stability
35- API level 28: provides coverage between 26 and 30
36- API levels 30, 31, 33: the latest supported API levels, which represent the
37 majority of devices in the field
38
AndroidX Core Team2e416b22020-12-03 22:58:07 +000039## Adding tests {#adding}
40
41For an example of how to set up simple unit and integration tests in a new
42module, see
43[aosp/1189799](https://android-review.googlesource.com/c/platform/frameworks/support/+/1189799).
44For an example of how to set up Espresso-powered integration tests, see the
45`preference` library's
AndroidX Core Team408c27b2020-12-15 15:57:00 +000046[`build.gradle`](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:preference/preference/build.gradle)
AndroidX Core Team2e416b22020-12-03 22:58:07 +000047and
AndroidX Core Team408c27b2020-12-15 15:57:00 +000048[`EditTextPreferenceTest.java`](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:preference/preference/src/androidTest/java/androidx/preference/tests/EditTextPreferenceTest.java)
AndroidX Core Team2e416b22020-12-03 22:58:07 +000049files.
50
51The currently allowed test runners for on-device tests are
52[`AndroidJUnitRunner`](https://developer.android.com/training/testing/junit-runner)
53and
54[`Parameterized`](https://junit.org/junit4/javadoc/4.12/org/junit/runners/Parameterized.html).
55
AndroidX Core Teamb5ba61d2021-06-08 09:20:36 -070056NOTE All package/class/method combinations must be unique. Multiple copies of
57the same class/method can be included e.g. under different directories, but must
58be distinguishable by their packages.
59
AndroidX Core Team03b4da32021-03-10 23:20:41 +000060NOTE For best practices on writing libraries in a way that makes it easy for end
61users -- and library developers -- to write tests, see the
Ian Baker186108e2023-11-20 06:54:36 -080062[Testability](/docs/testability.md) guide.
AndroidX Core Team03b4da32021-03-10 23:20:41 +000063
AndroidX Core Team5330eef2023-02-21 16:07:59 -050064### Adding a JVM based screenshot test
65
66For UI heavy libraries, it might make sense to add screenshot tests to verify
67that everything still renders as expected. For that you need to write the test
68([example](https://r.android.com/2428035)) and add new goldens
69([example](https://r.android.com/2428721)). You can run these tests just like
70any other JVM test using `test` Gradle task.
71
AndroidX Core Teame11d0932023-09-08 09:43:38 -070072### Adding screenshots tests using scuba library
73
74#### Prerequisites
75
76Golden project: Make sure that you have the golden directory in your root
77checkout (sibling of frameworks directory). If not re-init your repo to fetch
78the latest manifest file:
79
80```
81$ repo init -u sso://android/platform/manifest \
82 -b androidx-main && repo sync -c -j8
83```
84
85Set up your module: If your module is not using screenshot tests yet, you need
86to do the initial setup.
87
881. Modify your gradle file: Add dependency on the diffing library into your
89 gradle file:
90
91 ```
92 androidTestImplementation project(“:test:screenshot:screenshot”)
93 ```
94
95 Important step: Add golden asset directory to be linked to your test apk:
96
97 ```
98 android {
99 sourceSets.androidTest.assets.srcDirs +=
100 // For androidx project (not in ui dir) use "/../../golden/project"
101 project.rootDir.absolutePath + "/../../golden/compose/material/material"
102 }
103 ```
104
105 This will bundle the goldens into your apk so they can be retrieved during
106 the test.
107
1082. Create directory and variable: In the golden directory, create a new
109 directory for your module (the directory that you added to your gradle file,
110 which in case of material was “compose/material/material”).
111
112 In your test module, create a variable pointing at your new directory:
113
114 ```
115 const val GOLDEN_MATERIAL = "compose/material/material"
116 ```
117
118#### Adding a screenshot test
119
120Here is an example of a minimal screenshot test for compose material.
121
122```
123@LargeTest
124@RunWith(JUnit4::class)
125@SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
126class CheckboxScreenshotTest {
127 @get:Rule val composeTestRule = createComposeRule()
128 @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
129
130 @Test
131 fun checkBoxTest_checked() {
132 composeTestRule.setMaterialContent {
133 Checkbox(Modifier.wrapContentSize(Alignment.TopStart),
134 checked = true,
135 onCheckedChange = {}
136 )
137 }
138 find(isToggleable())
139 .captureToBitmap()
140 .assertAgainstGolden(screenshotRule, "checkbox_checked")
141 }
142}
143```
144
145NOTE: The string “checkbox_checked” is the unique identifier of your golden in
146your module. We use that string to name the golden file so avoid special
147characters. Please avoid any substrings like: golden, image etc. as there is no
148need - instead just describe what the image contains.
149
150#### Guidance around diffing
151
152Try to take the smallest screenshot possible. This will reduce interference from
153other elements.
154
155By default we use a MSSIM comparer. This one is based on similarity. However we
156have quite a high bar currently which is 0.98 (1 is an exact match). You can
157provide your own threshold or even opt into a pixel perfect comparer for some
158reason.
159
160Note: The bigger screenshots you take the more you sacrifice in the precision as
161you can aggregate larger diffing errors, see the examples below.
162
163![alt_text](onboarding_images/image6.png "screenshot diff at different MSSIM")
164
165#### Generating your goldens in CI (Gerrit)
166
167Upload your CL to gerrit and run presubmit. You should see your test fail.
168
169Step 1: Click on the “Test” button below:
170
171![alt_text](onboarding_images/image7.png "Presubmit link to failed test")
172
173Step 2: Click on the “Update scuba goldens” below:
174![alt_text](onboarding_images/image8.png "Update scuba button")
175
176Step 3: You should see a dashboard similar to the example below. Check-out if
177the new screenshots look as expected and if yes click approve. This will create
178a new CL.
179![alt_text](onboarding_images/image9.png "Button to approve scuba changes")
180
181Step 4: Link your original CL with the new goldens CL by setting the same Topic
182field in both CLs (any arbitrary string will do). This tells Gerrit to submit
183the CLs together, effectively providing a reference from the original CL to the
184new goldens. And re-run presubmit. Your tests should now pass!
185![alt_text](onboarding_images/image10.png "Topic for connecting cls")
186
187#### Running manually / debugging
188
189Screenshot tests can be run locally using pixel 2 api33 emulator. Start the
190emulator using [these](#emulator) steps.
191
192Wait until the emulator is running and run the tests as you would on a regular
193device.
194
195```
196$ ./gradlew <module>:cAT -Pandroid.testInstrumentationRunnerArguments.class=<class>
197```
198
199If the test passes, the results are limited to a .textproto file for each
200screenshot test. If the test fails, the results will also contain the actual
201screenshot and, if available, the golden reference image and the diff between
202the two. Note that this means that if you want to regenerate the golden image,
203you have to remove the golden image before running the test.
204
205To get the screenshot related results from the device onto your workstation, you
206can run
207
208```
209$ adb pull /sdcard/Android/data/<test-package>/cache/androidx_screenshots
210```
211
212where test-package is the identifier of you test apk, e.g.
213androidx.compose.material.test
214
215#### Locally updating the golden images
216
217After you run a screenshot test and pull the results to a desired location,
218verify that the actual images are the correct ones and copy them to the golden
219screenshots directory (the one you use to create the AndroidXScreenshotTestRule
220with) using this script.
221
222```
223androidx-main/frameworks/support/development/copy_screenshots_to_golden_repo.py \
224--input-dir=/tmp/androidx_screenshots/ --output-dir=androidx-main/golden/<test>/
225```
226
227Repeat for all screenshots, then create and upload a CL in the golden
228repository.
229
AndroidX Core Team21ccf652022-04-01 14:53:07 +0000230### What gets tested, and when {#affected-module-detector}
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000231
AndroidX Core Team3da62632022-10-03 11:29:25 -0700232With over 45000 tests executed on every CI run, it is necessary for us to run
233only a subset of our instrumentation tests in presubmit. We use the
AndroidX Core Team4cc85fa2021-11-23 15:58:34 +0000234[AffectedModuleDetector](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:buildSrc/private/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt)
AndroidX Core Team3da62632022-10-03 11:29:25 -0700235to determine what projects have changed since the last merge. In turn, we only
236generate apks and test configurations for those changed modules and their
237dependencies.
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000238
239When changes are made that can't be associated with a module, are in the root of
240the checkout, or are within `buildSrc`, then all host tests and all device tests
241annotated with `@SmallTest` or `@MediumTest` will be run for all modules.
242
243Presubmit tests represent only a subset of the devices on which our tests run.
244The remaining devices are tested only in postsubmit. In postsubmit, all host and
245device tests are run for all modules.
246
AndroidX Core Team21ccf652022-04-01 14:53:07 +0000247### Test annotations {#annotations}
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000248
AndroidX Core Team21ccf652022-04-01 14:53:07 +0000249#### Test size and runners {#test-size}
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000250
251All device tests *should* be given a size annotation, which is one of:
252
253* [`@SmallTest`](https://developer.android.com/reference/androidx/test/filters/SmallTest)
254* [`@MediumTest`](https://developer.android.com/reference/androidx/test/filters/MediumTest)
255* [`@LargeTest`](https://developer.android.com/reference/androidx/test/filters/LargeTest)
256
alanv37fed3a22021-09-17 07:46:47 -0700257If a device test is *not* annotated with its size, it will be run as if it were
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000258`@LargeTest` by default. Host tests do not need to be annotated with their size,
259as all host tests are run regardless of size.
260
261This annotation can occur at either the class level or individual test level.
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000262
AndroidX Core Teamb5ba61d2021-06-08 09:20:36 -0700263Annotation | Max duration
264------------- | ------------
265`@SmallTest` | 200ms
266`@MediumTest` | 1000ms
267`@LargeTest` | 100000ms
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000268
AndroidX Core Team21ccf652022-04-01 14:53:07 +0000269#### Disabling tests {#disabling-tests}
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000270
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000271If you need to stop a host- or device-side test from running entirely, use
272JUnit's [`@Ignore`](http://junit.sourceforge.net/javadoc/org/junit/Ignore.html)
273annotation. Do *not* use Android's `@Suppress` annotation, which only works with
274Android test runners and will *not* work for host-side tests.
275
AndroidX Core Team21ccf652022-04-01 14:53:07 +0000276#### Filtering devices {#filtering-devices}
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000277
278To restrict a test to a range of SDKs, use
279[`@SdkSuppress`](https://developer.android.com/reference/androidx/test/filters/SdkSuppress)
280which allows specifying a range with `minSdkVersion` and `maxSdkVersion`. This
281annotation also supports targeting a specific pre-release SDK with the
282`codeName` parameter.
283
284```java
285// Target SDKs 17 through 19, inclusive
286@SdkSuppress(minSdkVersion = 17, maxSdkVersion = 19)
287
AndroidX Core Team21ccf652022-04-01 14:53:07 +0000288// Target pre-release SDK T only
289@SdkSuppress(minSdkVersion = Build.VERSION_CODES.TIRAMISU, codeName = "Tiramisu")
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000290```
291
292You may also gate portions of test implementation code using `SDK_INT` or
293[`BuildCompat.isAtLeast`](https://developer.android.com/reference/androidx/core/os/BuildCompat)
AndroidX Core Team25bc9332021-08-10 11:11:26 -0700294methods. s To restrict to only physical devices, use
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000295[`@RequiresDevice`](https://developer.android.com/reference/androidx/test/filters/RequiresDevice).
296
AndroidX Core Team5c914c42021-02-08 17:22:57 +0000297NOTE [Cuttlefish](https://source.android.com/setup/create/cuttlefish) is not
298affected by this annotation, only e.g. Studio emulators. If Cuttlefish is
299displaying behavior that differs from a physical device, they are considering
300that a bug in Cuttlefish, so please file those bugs instead of only looking for
301a workaround.
302
AndroidX Core Team21ccf652022-04-01 14:53:07 +0000303### Animations in tests {#animations}
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000304
305Animations are disabled for tests by default. This helps avoid flakes due to
306timing and also makes tests faster.
307
308In rare cases, like testing the animations themselves, you may want to enable
309animations for a particular test or test class. For those cases, you can use the
AndroidX Core Team408c27b2020-12-15 15:57:00 +0000310[`AnimationDurationScaleRule`](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:testutils/testutils-runtime/src/main/java/androidx/testutils/AnimationDurationScaleRule.kt).
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000311
AndroidX Core Team21ccf652022-04-01 14:53:07 +0000312### Robolectric {#robolectric}
alanvf21d4ab2021-08-18 07:43:40 -0700313
314Robolectric tests are supported in AndroidX; however, if you targeting a
315pre-release version of the Android SDK then you may see an error like
316
317```
alanv9102ecc2022-08-26 07:46:41 -0700318java.lang.IllegalArgumentException: Package targetSdkVersion=31 > maxSdkVersion=30
alanvf21d4ab2021-08-18 07:43:40 -0700319at org.robolectric.plugins.DefaultSdkPicker.configuredSdks(DefaultSdkPicker.java:118)
320at org.robolectric.plugins.DefaultSdkPicker.selectSdks(DefaultSdkPicker.java:69)
321```
322
323You can force Robolectric to run using an earlier version of the platform SDK by
324creating a `<project>/src/test/resources/robolectric.properties` file with the
325following contents:
326
327```
alanv9102ecc2022-08-26 07:46:41 -0700328# Robolectric currently doesn't support API 31, so we have to explicitly specify 30 as the target
alanvf21d4ab2021-08-18 07:43:40 -0700329# sdk for now. Remove when no longer necessary.
alanv9102ecc2022-08-26 07:46:41 -0700330sdk=30
alanvf21d4ab2021-08-18 07:43:40 -0700331```
332
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000333## Using the emulator {#emulator}
334
335You can use the emulator or a real device to run tests. If you wish to use the
336emulator, you will need to access the AVD Manager (and your downloaded emulator
337images) using a separate "normal" instance of Android Studio. "Normal" means a
338non-Canary build of Studio that you would use for regular app development -- the
339important part being that it points to the Android SDK where your downloaded
340emulator images reside. You will need to open a project to get the Tools menu --
341do NOT open the AndroidX project in the "normal" instance of Android Studio;
342instead, open a normal app or create a blank project using the app wizard.
343
AndroidX Core Team4cc85fa2021-11-23 15:58:34 +0000344NOTE You can reuse the emulator and system images from a "normal" installation
345of Android Studio by linking the `emulator` and `system_images` directories to a
AndroidX Core Team21ccf652022-04-01 14:53:07 +0000346standard Android SDK path and restarting Android Studio. **This is set up
347automatically by `studiow` on Google-managed devices with a standard Android SDK
348path.** In other cases, it may be set up manually with something like: `cd
AndroidX Core Team4cc85fa2021-11-23 15:58:34 +0000349prebuilts/fullsdk-darwin ln -s ~/Library/Android/sdk/emulator emulator ln -s
AndroidX Core Team21ccf652022-04-01 14:53:07 +0000350~/Library/Android/sdk/system-images system-images` (substituting `fullsdk-linux`
351and your local SDK path as appropriate)
AndroidX Core Team4cc85fa2021-11-23 15:58:34 +0000352
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000353## Debugging with platform SDK sources {#sources}
354
355The platform SDK sources that are checked into the development branch may not
356match up with the build of Android present on the emulator or your physical
357device. As a result, the line numbers reported by the debugger may not match up
358the actual code being run.
359
360If you have a copy of the sources for the build against which you are debugging,
361you can manually specify your platform SDK source path:
362
3631. Click on a module (e.g. `appcompat`) in the `Project` view
3641. Press `Ctrl-Shift-A` and type "Module Settings", then run the action
3651. In the `Project Structure` dialog, navigate to `SDKs > Android API 29
366 Platform > Sourcepath`
3671. Use the `-` button to remove any paths that are present, then use the `+`
368 button to add the desired source path, ex. `<android checkout
369 root>/frameworks/base` if you are debugging against a locally-built system
370 image
371
372NOTE The `Project Structure` dialog reachable via `File > Project Structure` is
373**not** the same as the `Project Structure` dialog that will allow you to
374specify the SDK source path. You must use the "Module Settings" action as
375directed above.
376
377## Running unit and integration tests {#running}
378
379From Android Studio, right-click can be used to run most test targets, including
380source files, classes within a file, or individual test methods but **not**
381entire modules. To run a supported test target, right-click on the test target
382and then click `Run <name of test target>`.
383
384To run tests for an entire module such as `appcompat`, use `Run -> Edit
385configurations...` and use the `+` button to create a new `Android Instrumented
386Tests` configuration. Specify the module to be tested, give it a reasonable name
387(not "All Tests") and click `OK`, then use the `Run` menu to run the
388configuration.
389
390![alt_text](onboarding_images/image2.png "screenshot of run menu")
391
392NOTE If you receive the error `JUnit version 3.8 or later expected` this means
393that Android Studio generated an Android JUnit configuration when you actually
394needed an Android Instrumented Tests configuration. Open the `Run -> Edit
395configurations...` dialog and delete the configuration from Android JUnit, then
396manually add a configuration in Android Instrumented Tests.
397
398### From the command line {#running-from-shell}
399
400Following a successful build, tests may be run against a particular AndroidX
401module using `gradlew`.
402
AndroidX Core Team408c27b2020-12-15 15:57:00 +0000403To run all unit or integration tests in a specific project, run the following
404from `framework/support`:
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000405
406```shell
AndroidX Core Team408c27b2020-12-15 15:57:00 +0000407# Run instrumentation tests on a connected device
AndroidX Core Team8c9a1c02023-03-08 14:16:36 -0800408./gradlew <project-name>:connectedAndroidTest --info
409
410# Run instrumentation tests in Firebase Test Lab (remote)
411./gradlew <project-name>:ftlnexus4api21
412./gradlew <project-name>:ftlpixel2api26
413./gradlew <project-name>:ftlpixel2api28
414./gradlew <project-name>:ftlpixel2api30
415./gradlew <project-name>:ftlpixel2api33
AndroidX Core Team408c27b2020-12-15 15:57:00 +0000416
417# Run local unit tests
AndroidX Core Team8c9a1c02023-03-08 14:16:36 -0800418./gradlew <project-name>:test
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000419```
420
AndroidX Core Team8c9a1c02023-03-08 14:16:36 -0800421substituting the Gradle project name (ex. `:core:core`).
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000422
AndroidX Core Team8c9a1c02023-03-08 14:16:36 -0800423To run a specific instrumentation test in a given project, run
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000424
425```shell
AndroidX Core Team8c9a1c02023-03-08 14:16:36 -0800426# Run instrumentation tests on a connected device
427./gradlew <project-name>:connectedAndroidTest --info \
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000428 -Pandroid.testInstrumentationRunnerArguments.class=<fully-qualified-class>[\#testName]
AndroidX Core Team8c9a1c02023-03-08 14:16:36 -0800429
430# Run instrumentation tests on in Firebase Test Lab (remote)
431./gradlew <project-name>:ftlpixel2api30 --className=<fully-qualified-class>
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000432```
433
434substituting the Gradle project name (ex. `viewpager`) and fully-qualified class
435name (ex. `androidx.viewpager.widget.ViewPagerTest`) of your test file,
436optionally followed by `\#testName` if you want to execute a single test in that
AndroidX Core Team8c9a1c02023-03-08 14:16:36 -0800437file
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000438
AndroidX Core Team8c9a1c02023-03-08 14:16:36 -0800439If you want to run a specific unit test, you can do it using
AndroidX Core Teama200cb82023-03-28 15:23:28 -0700440[`--tests` filtering](https://docs.gradle.org/current/userguide/java_testing.html#test_filtering):
441
AndroidX Core Team8c9a1c02023-03-08 14:16:36 -0800442```shell
AndroidX Core Team8c9a1c02023-03-08 14:16:36 -0800443# Run a test for an Android library on a connected device
AndroidX Core Team8c9a1c02023-03-08 14:16:36 -0800444./gradlew <project-name>:test --tests androidx.core.view.DisplayCompatTest
445
446# Run a test for a JVM library
AndroidX Core Team8c9a1c02023-03-08 14:16:36 -0800447./gradlew <project-name>:testDebugUnitTest --tests
AndroidX Core Teama200cb82023-03-28 15:23:28 -0700448androidx.core.view.DisplayCompatTest
449```
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000450
451## Test apps {#testapps}
452
453Library developers are strongly encouraged to write test apps that exercise
454their library's public API surface. Test apps serve multiple purposes:
455
456* Integration testing and validation of API testability, when paired with
457 tests
458* Validation of API usability and developer experience, when paired with a use
459 case or critical user journey
460* Sample documentation, when embedded into API reference docs using the
Ian Baker186108e2023-11-20 06:54:36 -0800461 [`@sample` and `@Sampled` annotations](/docs/api_guidelines/index.md#sample-usage)
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000462
463### Legacy test apps {#testapps-legacy}
464
465We have a set of legacy sample Android applications in projects suffixed with
466`-demos`. These applications do not have tests and should not be used as test
467apps for new APIs, but they may be useful for manual regression testing.
468
4691. Click `Run/Debug Configuration` on the top of the window.
4701. Select the app you want to run.
4711. Click 'Run' button.
472
473![alt_text](onboarding_images/image3.png "screenshot of Run/Debug menu")
474
475## Benchmarking {#benchmarking}
476
477AndroidX supports benchmarking - locally with Studio/Gradle, and continuously in
478post-submit. For more information on how to create and run benchmarks, see
Ian Baker186108e2023-11-20 06:54:36 -0800479[Benchmarking](/docs/benchmarking.md).