89 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
# 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()
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
```
 |