| # 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() |
| } |
| } |
| } |
| ``` |