blob: 95ae6b4548a1d31d662d3ce1db99f13a2d51dc13 [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
AndroidX Core Team03115222025-01-21 14:03:19 -080030reliability. As of January 2025, we run tests on the following API levels:
AndroidX Core Teamaa5f6572023-11-28 08:39:09 -080031
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
AndroidX Core Team03115222025-01-21 14:03:19 -080035- API levels 30, 33, 34, 35: the latest supported API levels, which represent
36 the majority of devices in the field
AndroidX Core Teamaa5f6572023-11-28 08:39:09 -080037
AndroidX Core Team2e416b22020-12-03 22:58:07 +000038## Adding tests {#adding}
39
40For an example of how to set up simple unit and integration tests in a new
41module, see
42[aosp/1189799](https://android-review.googlesource.com/c/platform/frameworks/support/+/1189799).
43For an example of how to set up Espresso-powered integration tests, see the
44`preference` library's
AndroidX Core Team408c27b2020-12-15 15:57:00 +000045[`build.gradle`](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:preference/preference/build.gradle)
AndroidX Core Team2e416b22020-12-03 22:58:07 +000046and
AndroidX Core Team408c27b2020-12-15 15:57:00 +000047[`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 +000048files.
49
50The currently allowed test runners for on-device tests are
51[`AndroidJUnitRunner`](https://developer.android.com/training/testing/junit-runner)
52and
53[`Parameterized`](https://junit.org/junit4/javadoc/4.12/org/junit/runners/Parameterized.html).
54
AndroidX Core Teamb5ba61d2021-06-08 09:20:36 -070055NOTE All package/class/method combinations must be unique. Multiple copies of
56the same class/method can be included e.g. under different directories, but must
57be distinguishable by their packages.
58
AndroidX Core Team03b4da32021-03-10 23:20:41 +000059NOTE For best practices on writing libraries in a way that makes it easy for end
60users -- and library developers -- to write tests, see the
Ian Baker186108e2023-11-20 06:54:36 -080061[Testability](/docs/testability.md) guide.
AndroidX Core Team03b4da32021-03-10 23:20:41 +000062
AndroidX Core Teame11d0932023-09-08 09:43:38 -070063### Adding screenshots tests using scuba library
64
65#### Prerequisites
66
67Golden project: Make sure that you have the golden directory in your root
68checkout (sibling of frameworks directory). If not re-init your repo to fetch
69the latest manifest file:
70
71```
72$ repo init -u sso://android/platform/manifest \
73 -b androidx-main && repo sync -c -j8
74```
75
76Set up your module: If your module is not using screenshot tests yet, you need
77to do the initial setup.
78
791. Modify your gradle file: Add dependency on the diffing library into your
80 gradle file:
81
82 ```
83 androidTestImplementation project(“:test:screenshot:screenshot”)
84 ```
85
86 Important step: Add golden asset directory to be linked to your test apk:
87
88 ```
89 android {
90 sourceSets.androidTest.assets.srcDirs +=
91 // For androidx project (not in ui dir) use "/../../golden/project"
92 project.rootDir.absolutePath + "/../../golden/compose/material/material"
93 }
94 ```
95
96 This will bundle the goldens into your apk so they can be retrieved during
97 the test.
98
992. Create directory and variable: In the golden directory, create a new
100 directory for your module (the directory that you added to your gradle file,
101 which in case of material was “compose/material/material”).
102
103 In your test module, create a variable pointing at your new directory:
104
105 ```
106 const val GOLDEN_MATERIAL = "compose/material/material"
107 ```
108
109#### Adding a screenshot test
110
111Here is an example of a minimal screenshot test for compose material.
112
113```
114@LargeTest
115@RunWith(JUnit4::class)
116@SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
117class CheckboxScreenshotTest {
118 @get:Rule val composeTestRule = createComposeRule()
119 @get:Rule val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL)
120
121 @Test
122 fun checkBoxTest_checked() {
123 composeTestRule.setMaterialContent {
124 Checkbox(Modifier.wrapContentSize(Alignment.TopStart),
125 checked = true,
126 onCheckedChange = {}
127 )
128 }
129 find(isToggleable())
130 .captureToBitmap()
131 .assertAgainstGolden(screenshotRule, "checkbox_checked")
132 }
133}
134```
135
136NOTE: The string “checkbox_checked” is the unique identifier of your golden in
137your module. We use that string to name the golden file so avoid special
138characters. Please avoid any substrings like: golden, image etc. as there is no
139need - instead just describe what the image contains.
140
141#### Guidance around diffing
142
143Try to take the smallest screenshot possible. This will reduce interference from
144other elements.
145
146By default we use a MSSIM comparer. This one is based on similarity. However we
147have quite a high bar currently which is 0.98 (1 is an exact match). You can
148provide your own threshold or even opt into a pixel perfect comparer for some
149reason.
150
151Note: The bigger screenshots you take the more you sacrifice in the precision as
152you can aggregate larger diffing errors, see the examples below.
153
154![alt_text](onboarding_images/image6.png "screenshot diff at different MSSIM")
155
156#### Generating your goldens in CI (Gerrit)
157
158Upload your CL to gerrit and run presubmit. You should see your test fail.
159
160Step 1: Click on the “Test” button below:
161
162![alt_text](onboarding_images/image7.png "Presubmit link to failed test")
163
164Step 2: Click on the “Update scuba goldens” below:
165![alt_text](onboarding_images/image8.png "Update scuba button")
166
AndroidX Core Teamadb58072024-07-18 11:08:51 -0700167Step 3: Select the tests for which you want to update the golden images. Confirm
168the images look correct and click on “Approve Changes”
AndroidX Core Teame11d0932023-09-08 09:43:38 -0700169![alt_text](onboarding_images/image9.png "Button to approve scuba changes")
170
AndroidX Core Teamadb58072024-07-18 11:08:51 -0700171Step 4: In the Approve changes dialog box, enter the following details and click
172on Approve: \
173Select gerrit host as shown in image below \
174Repo: platform/frameworks/support-golden \
175Branch: androidx-main
176![alt_text](onboarding_images/image10.png "Approve changes dialog box with dropdown field to select gerrit host and textboxes to select repo and branch")
177
178Step 5: Link your original CL with the new goldens CL by setting the same Topic
AndroidX Core Teame11d0932023-09-08 09:43:38 -0700179field in both CLs (any arbitrary string will do). This tells Gerrit to submit
180the CLs together, effectively providing a reference from the original CL to the
181new goldens. And re-run presubmit. Your tests should now pass!
AndroidX Core Teamadb58072024-07-18 11:08:51 -0700182![alt_text](onboarding_images/image11.png "Topic for connecting cls, so they can run together")
AndroidX Core Teame11d0932023-09-08 09:43:38 -0700183
184#### Running manually / debugging
185
186Screenshot tests can be run locally using pixel 2 api33 emulator. Start the
187emulator using [these](#emulator) steps.
188
189Wait until the emulator is running and run the tests as you would on a regular
190device.
191
192```
193$ ./gradlew <module>:cAT -Pandroid.testInstrumentationRunnerArguments.class=<class>
194```
195
196If the test passes, the results are limited to a .textproto file for each
197screenshot test. If the test fails, the results will also contain the actual
198screenshot and, if available, the golden reference image and the diff between
199the two. Note that this means that if you want to regenerate the golden image,
200you have to remove the golden image before running the test.
201
202To get the screenshot related results from the device onto your workstation, you
203can run
204
205```
206$ adb pull /sdcard/Android/data/<test-package>/cache/androidx_screenshots
207```
208
209where test-package is the identifier of you test apk, e.g.
210androidx.compose.material.test
211
212#### Locally updating the golden images
213
214After you run a screenshot test and pull the results to a desired location,
215verify that the actual images are the correct ones and copy them to the golden
216screenshots directory (the one you use to create the AndroidXScreenshotTestRule
217with) using this script.
218
219```
220androidx-main/frameworks/support/development/copy_screenshots_to_golden_repo.py \
221--input-dir=/tmp/androidx_screenshots/ --output-dir=androidx-main/golden/<test>/
222```
223
224Repeat for all screenshots, then create and upload a CL in the golden
225repository.
226
AndroidX Core Team21ccf652022-04-01 14:53:07 +0000227### What gets tested, and when {#affected-module-detector}
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000228
AndroidX Core Team3da62632022-10-03 11:29:25 -0700229With over 45000 tests executed on every CI run, it is necessary for us to run
230only a subset of our instrumentation tests in presubmit. We use the
AndroidX Core Team4cc85fa2021-11-23 15:58:34 +0000231[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 -0700232to determine what projects have changed since the last merge. In turn, we only
233generate apks and test configurations for those changed modules and their
234dependencies.
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000235
236When changes are made that can't be associated with a module, are in the root of
237the checkout, or are within `buildSrc`, then all host tests and all device tests
238annotated with `@SmallTest` or `@MediumTest` will be run for all modules.
239
240Presubmit tests represent only a subset of the devices on which our tests run.
241The remaining devices are tested only in postsubmit. In postsubmit, all host and
242device tests are run for all modules.
243
AndroidX Core Team21ccf652022-04-01 14:53:07 +0000244### Test annotations {#annotations}
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000245
AndroidX Core Team21ccf652022-04-01 14:53:07 +0000246#### Test size and runners {#test-size}
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000247
248All device tests *should* be given a size annotation, which is one of:
249
250* [`@SmallTest`](https://developer.android.com/reference/androidx/test/filters/SmallTest)
251* [`@MediumTest`](https://developer.android.com/reference/androidx/test/filters/MediumTest)
252* [`@LargeTest`](https://developer.android.com/reference/androidx/test/filters/LargeTest)
253
alanv37fed3a22021-09-17 07:46:47 -0700254If 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 +0000255`@LargeTest` by default. Host tests do not need to be annotated with their size,
256as all host tests are run regardless of size.
257
258This annotation can occur at either the class level or individual test level.
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000259
AndroidX Core Teamb5ba61d2021-06-08 09:20:36 -0700260Annotation | Max duration
261------------- | ------------
262`@SmallTest` | 200ms
263`@MediumTest` | 1000ms
264`@LargeTest` | 100000ms
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000265
AndroidX Core Team21ccf652022-04-01 14:53:07 +0000266#### Disabling tests {#disabling-tests}
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000267
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000268If you need to stop a host- or device-side test from running entirely, use
269JUnit's [`@Ignore`](http://junit.sourceforge.net/javadoc/org/junit/Ignore.html)
270annotation. Do *not* use Android's `@Suppress` annotation, which only works with
271Android test runners and will *not* work for host-side tests.
272
AndroidX Core Team21ccf652022-04-01 14:53:07 +0000273#### Filtering devices {#filtering-devices}
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000274
275To restrict a test to a range of SDKs, use
276[`@SdkSuppress`](https://developer.android.com/reference/androidx/test/filters/SdkSuppress)
277which allows specifying a range with `minSdkVersion` and `maxSdkVersion`. This
278annotation also supports targeting a specific pre-release SDK with the
279`codeName` parameter.
280
281```java
282// Target SDKs 17 through 19, inclusive
283@SdkSuppress(minSdkVersion = 17, maxSdkVersion = 19)
284
AndroidX Core Team21ccf652022-04-01 14:53:07 +0000285// Target pre-release SDK T only
286@SdkSuppress(minSdkVersion = Build.VERSION_CODES.TIRAMISU, codeName = "Tiramisu")
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000287```
288
289You may also gate portions of test implementation code using `SDK_INT` or
290[`BuildCompat.isAtLeast`](https://developer.android.com/reference/androidx/core/os/BuildCompat)
AndroidX Core Team25bc9332021-08-10 11:11:26 -0700291methods. s To restrict to only physical devices, use
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000292[`@RequiresDevice`](https://developer.android.com/reference/androidx/test/filters/RequiresDevice).
293
AndroidX Core Team5c914c42021-02-08 17:22:57 +0000294NOTE [Cuttlefish](https://source.android.com/setup/create/cuttlefish) is not
295affected by this annotation, only e.g. Studio emulators. If Cuttlefish is
296displaying behavior that differs from a physical device, they are considering
297that a bug in Cuttlefish, so please file those bugs instead of only looking for
298a workaround.
299
AndroidX Core Team21ccf652022-04-01 14:53:07 +0000300### Animations in tests {#animations}
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000301
302Animations are disabled for tests by default. This helps avoid flakes due to
303timing and also makes tests faster.
304
305In rare cases, like testing the animations themselves, you may want to enable
306animations for a particular test or test class. For those cases, you can use the
AndroidX Core Team408c27b2020-12-15 15:57:00 +0000307[`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 +0000308
AndroidX Core Team21ccf652022-04-01 14:53:07 +0000309### Robolectric {#robolectric}
alanvf21d4ab2021-08-18 07:43:40 -0700310
311Robolectric tests are supported in AndroidX; however, if you targeting a
312pre-release version of the Android SDK then you may see an error like
313
314```
alanv9102ecc2022-08-26 07:46:41 -0700315java.lang.IllegalArgumentException: Package targetSdkVersion=31 > maxSdkVersion=30
alanvf21d4ab2021-08-18 07:43:40 -0700316at org.robolectric.plugins.DefaultSdkPicker.configuredSdks(DefaultSdkPicker.java:118)
317at org.robolectric.plugins.DefaultSdkPicker.selectSdks(DefaultSdkPicker.java:69)
318```
319
320You can force Robolectric to run using an earlier version of the platform SDK by
321creating a `<project>/src/test/resources/robolectric.properties` file with the
322following contents:
323
324```
alanv9102ecc2022-08-26 07:46:41 -0700325# Robolectric currently doesn't support API 31, so we have to explicitly specify 30 as the target
alanvf21d4ab2021-08-18 07:43:40 -0700326# sdk for now. Remove when no longer necessary.
alanv9102ecc2022-08-26 07:46:41 -0700327sdk=30
alanvf21d4ab2021-08-18 07:43:40 -0700328```
329
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000330## Using the emulator {#emulator}
331
332You can use the emulator or a real device to run tests. If you wish to use the
333emulator, you will need to access the AVD Manager (and your downloaded emulator
334images) using a separate "normal" instance of Android Studio. "Normal" means a
335non-Canary build of Studio that you would use for regular app development -- the
336important part being that it points to the Android SDK where your downloaded
337emulator images reside. You will need to open a project to get the Tools menu --
338do NOT open the AndroidX project in the "normal" instance of Android Studio;
339instead, open a normal app or create a blank project using the app wizard.
340
AndroidX Core Team4cc85fa2021-11-23 15:58:34 +0000341NOTE You can reuse the emulator and system images from a "normal" installation
342of Android Studio by linking the `emulator` and `system_images` directories to a
AndroidX Core Team21ccf652022-04-01 14:53:07 +0000343standard Android SDK path and restarting Android Studio. **This is set up
344automatically by `studiow` on Google-managed devices with a standard Android SDK
345path.** In other cases, it may be set up manually with something like: `cd
AndroidX Core Team4cc85fa2021-11-23 15:58:34 +0000346prebuilts/fullsdk-darwin ln -s ~/Library/Android/sdk/emulator emulator ln -s
AndroidX Core Team21ccf652022-04-01 14:53:07 +0000347~/Library/Android/sdk/system-images system-images` (substituting `fullsdk-linux`
348and your local SDK path as appropriate)
AndroidX Core Team4cc85fa2021-11-23 15:58:34 +0000349
AndroidX Core Team9b7c30e2024-12-05 09:56:33 -0800350## Debugging tests
351
352### Using custom platform SDK sources {#sources}
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000353
354The platform SDK sources that are checked into the development branch may not
355match up with the build of Android present on the emulator or your physical
356device. As a result, the line numbers reported by the debugger may not match up
357the actual code being run.
358
359If you have a copy of the sources for the build against which you are debugging,
360you can manually specify your platform SDK source path:
361
3621. Click on a module (e.g. `appcompat`) in the `Project` view
3631. Press `Ctrl-Shift-A` and type "Module Settings", then run the action
3641. In the `Project Structure` dialog, navigate to `SDKs > Android API 29
365 Platform > Sourcepath`
3661. Use the `-` button to remove any paths that are present, then use the `+`
367 button to add the desired source path, ex. `<android checkout
368 root>/frameworks/base` if you are debugging against a locally-built system
369 image
370
371NOTE The `Project Structure` dialog reachable via `File > Project Structure` is
372**not** the same as the `Project Structure` dialog that will allow you to
373specify the SDK source path. You must use the "Module Settings" action as
374directed above.
375
AndroidX Core Team9b7c30e2024-12-05 09:56:33 -0800376### Accessing FTL outputs
377
378When we run tests on Firebase Test Lab devices, we transfer the results and
379logcat output back to Android's test result infrastructure; however, FTL also
380captures screen recordings of the entire test run.
381
382To access these videos from the Android Test Investigate page for a failed test
383run:
384
385- For the failing test, go to `Artifacts tab` in the Android Test Investigate
386 page
387- Disable `Hide empty folders` (if enabled) by clicking on it
388- Under `Run artifacts`, click on "i" icon next to the test module to open the
389 Information tab
390- In the Information tab to the right, click on the link next to the `logs`
391 property
392
393The full logcat output and screen recording are available from the `Devices` tab
394by clicking on the test device under `Device details` and using the `Logs` and
395`Video` tabs, respectively.
396
397Per-test logcat output and videos are available from the `Test cases` tab.
398
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000399## Running unit and integration tests {#running}
400
401From Android Studio, right-click can be used to run most test targets, including
402source files, classes within a file, or individual test methods but **not**
403entire modules. To run a supported test target, right-click on the test target
404and then click `Run <name of test target>`.
405
406To run tests for an entire module such as `appcompat`, use `Run -> Edit
407configurations...` and use the `+` button to create a new `Android Instrumented
408Tests` configuration. Specify the module to be tested, give it a reasonable name
409(not "All Tests") and click `OK`, then use the `Run` menu to run the
410configuration.
411
412![alt_text](onboarding_images/image2.png "screenshot of run menu")
413
414NOTE If you receive the error `JUnit version 3.8 or later expected` this means
415that Android Studio generated an Android JUnit configuration when you actually
416needed an Android Instrumented Tests configuration. Open the `Run -> Edit
417configurations...` dialog and delete the configuration from Android JUnit, then
418manually add a configuration in Android Instrumented Tests.
419
420### From the command line {#running-from-shell}
421
422Following a successful build, tests may be run against a particular AndroidX
423module using `gradlew`.
424
AndroidX Core Team408c27b2020-12-15 15:57:00 +0000425To run all unit or integration tests in a specific project, run the following
426from `framework/support`:
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000427
428```shell
AndroidX Core Team408c27b2020-12-15 15:57:00 +0000429# Run instrumentation tests on a connected device
AndroidX Core Team8c9a1c02023-03-08 14:16:36 -0800430./gradlew <project-name>:connectedAndroidTest --info
431
432# Run instrumentation tests in Firebase Test Lab (remote)
433./gradlew <project-name>:ftlnexus4api21
434./gradlew <project-name>:ftlpixel2api26
AndroidX Core Team8c9a1c02023-03-08 14:16:36 -0800435./gradlew <project-name>:ftlpixel2api30
436./gradlew <project-name>:ftlpixel2api33
AndroidX Core Team03115222025-01-21 14:03:19 -0800437./gradlew <project-name>:ftlmediumphoneapi34
438./gradlew <project-name>:ftlmediumphoneapi35
AndroidX Core Team408c27b2020-12-15 15:57:00 +0000439
440# Run local unit tests
AndroidX Core Team8c9a1c02023-03-08 14:16:36 -0800441./gradlew <project-name>:test
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000442```
443
AndroidX Core Team8c9a1c02023-03-08 14:16:36 -0800444substituting the Gradle project name (ex. `:core:core`).
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000445
AndroidX Core Team8c9a1c02023-03-08 14:16:36 -0800446To run a specific instrumentation test in a given project, run
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000447
448```shell
AndroidX Core Team8c9a1c02023-03-08 14:16:36 -0800449# Run instrumentation tests on a connected device
450./gradlew <project-name>:connectedAndroidTest --info \
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000451 -Pandroid.testInstrumentationRunnerArguments.class=<fully-qualified-class>[\#testName]
AndroidX Core Team8c9a1c02023-03-08 14:16:36 -0800452
453# Run instrumentation tests on in Firebase Test Lab (remote)
454./gradlew <project-name>:ftlpixel2api30 --className=<fully-qualified-class>
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000455```
456
457substituting the Gradle project name (ex. `viewpager`) and fully-qualified class
458name (ex. `androidx.viewpager.widget.ViewPagerTest`) of your test file,
459optionally followed by `\#testName` if you want to execute a single test in that
AndroidX Core Team8c9a1c02023-03-08 14:16:36 -0800460file
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000461
AndroidX Core Team8c9a1c02023-03-08 14:16:36 -0800462If you want to run a specific unit test, you can do it using
AndroidX Core Teama200cb82023-03-28 15:23:28 -0700463[`--tests` filtering](https://docs.gradle.org/current/userguide/java_testing.html#test_filtering):
464
AndroidX Core Team8c9a1c02023-03-08 14:16:36 -0800465```shell
AndroidX Core Team8c9a1c02023-03-08 14:16:36 -0800466# Run a test for an Android library on a connected device
AndroidX Core Team8c9a1c02023-03-08 14:16:36 -0800467./gradlew <project-name>:test --tests androidx.core.view.DisplayCompatTest
468
469# Run a test for a JVM library
AndroidX Core Team8c9a1c02023-03-08 14:16:36 -0800470./gradlew <project-name>:testDebugUnitTest --tests
AndroidX Core Teama200cb82023-03-28 15:23:28 -0700471androidx.core.view.DisplayCompatTest
472```
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000473
474## Test apps {#testapps}
475
476Library developers are strongly encouraged to write test apps that exercise
477their library's public API surface. Test apps serve multiple purposes:
478
479* Integration testing and validation of API testability, when paired with
480 tests
481* Validation of API usability and developer experience, when paired with a use
482 case or critical user journey
483* Sample documentation, when embedded into API reference docs using the
Ian Baker186108e2023-11-20 06:54:36 -0800484 [`@sample` and `@Sampled` annotations](/docs/api_guidelines/index.md#sample-usage)
AndroidX Core Team2e416b22020-12-03 22:58:07 +0000485
486### Legacy test apps {#testapps-legacy}
487
488We have a set of legacy sample Android applications in projects suffixed with
489`-demos`. These applications do not have tests and should not be used as test
490apps for new APIs, but they may be useful for manual regression testing.
491
4921. Click `Run/Debug Configuration` on the top of the window.
4931. Select the app you want to run.
4941. Click 'Run' button.
495
496![alt_text](onboarding_images/image3.png "screenshot of Run/Debug menu")
497
498## Benchmarking {#benchmarking}
499
500AndroidX supports benchmarking - locally with Studio/Gradle, and continuously in
501post-submit. For more information on how to create and run benchmarks, see
Ian Baker186108e2023-11-20 06:54:36 -0800502[Benchmarking](/docs/benchmarking.md).