| # Flicker Test Library | |
| ## Motivation | |
| This set of tests use the flickerlib from `platform_testing/libraries/flicker` to execute a set of common UI transitions to detect discontinuous or unpredictable behavior. | |
| The tests are organized in packages according to the transitions they test (e.g., `rotation`, `splitscreen`). | |
| ## Adding a Test | |
| By default tests should inherit from `RotationTestBase` or `NonRotationTestBase` and must override the variable `transitionToRun` (Kotlin) or the function `getTransitionToRun()` (Java). | |
| Only tests that are not supported by these classes should inherit directly from the `FlickerTestBase` class. | |
| ### Rotation animations and transitions | |
| Tests that rotate the device should inherit from `RotationTestBase`. | |
| Tests that inherit from the class automatically receive start and end rotation values. | |
| Moreover, these tests inherit the following checks: | |
| * all regions on the screen are covered | |
| * status bar is always visible | |
| * status bar rotates | |
| * nav bar is always visible | |
| * nav bar is rotates | |
| The default tests can be disabled by overriding the respective methods and including an `@Ignore` annotation. | |
| ### Non-Rotation animations and transitions | |
| `NonRotationTestBase` was created to make it easier to write tests that do not involve rotation (e.g., `Pip`, `split screen` or `IME`). | |
| Tests that inherit from the class are automatically executed twice: once in portrait and once in landscape mode and the assertions are checked independently. | |
| Moreover, these tests inherit the following checks: | |
| * all regions on the screen are covered | |
| * status bar is always visible | |
| * nav bar is always visible | |
| The default tests can be disabled by overriding the respective methods and including an `@Ignore` annotation. | |
| ### Exceptional cases | |
| Tests that rotate the device should inherit from `RotationTestBase`. | |
| This class allows the test to be freely configured and does not provide any assertions. | |
| ### Example | |
| Start by defining common or error prone transitions using `TransitionRunner`. | |
| ```kotlin | |
| @LargeTest | |
| @RunWith(Parameterized::class) | |
| @FixMethodOrder(MethodSorters.NAME_ASCENDING) | |
| class MyTest( | |
| beginRotationName: String, | |
| beginRotation: Int | |
| ) : NonRotationTestBase(beginRotationName, beginRotation) { | |
| init { | |
| mTestApp = MyAppHelper(InstrumentationRegistry.getInstrumentation()) | |
| } | |
| override val transitionToRun: TransitionRunner | |
| get() = TransitionRunner.newBuilder() | |
| .withTag("myTest") | |
| .recordAllRuns() | |
| .runBefore { device.pressHome() } | |
| .runBefore { device.waitForIdle() } | |
| .run { testApp.open() } | |
| .runAfter{ testApp.exit() } | |
| .repeat(2) | |
| .includeJankyRuns() | |
| .build() | |
| @Test | |
| fun myWMTest() { | |
| checkResults { | |
| WmTraceSubject.assertThat(it) | |
| .showsAppWindow(MyTestApp) | |
| .forAllEntries() | |
| } | |
| } | |
| @Test | |
| fun mySFTest() { | |
| checkResults { | |
| LayersTraceSubject.assertThat(it) | |
| .showsLayer(MyTestApp) | |
| .forAllEntries() | |
| } | |
| } | |
| } | |
| ``` |