Testowanie pod kątem zmian w konfiguracji ekranu za pomocą interfejsu Espresso Device API

Za pomocą interfejsu API Espresso Device API możesz testować aplikację, gdy urządzenie przechodzi przez typowe zmiany konfiguracji, takie jak obrót i rozkładanie ekranu. Interfejs Device API w usłudze Espresso umożliwia symulowanie tych zmian konfiguracji na urządzeniu wirtualnym i wykonywanie testów synchronicznie, dzięki czemu w danym momencie występuje tylko jedno działanie lub twierdzenie UI, a wyniki testów są bardziej wiarygodne. Jeśli nie wiesz, jak pisać testy interfejsu użytkownika za pomocą Espresso, zapoznaj się z tą dokumentacją.

Aby korzystać z interfejsu Espresso Device API, musisz mieć:

  • Android Studio Iguana lub nowszy
  • Wtyczka Androida do obsługi Gradle w wersji 8.3 lub nowszej
  • emulator Androida 33.1.10 lub nowszy.
  • wirtualne urządzenie z Androidem na poziomie interfejsu API 24 lub nowszym,

Konfigurowanie projektu pod kątem interfejsu Espresso Device API

Aby skonfigurować projekt tak, aby obsługiwał interfejs Espresso Device API, wykonaj te czynności:

  1. Aby umożliwić testom przekazywanie poleceń do urządzenia testowego, dodaj uprawnienia INTERNETACCESS_NETWORK_STATE do pliku manifestu w zbiorze źródeł androidTest:

      <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
      
  2. Włącz flagę eksperymentalną enableEmulatorControl w pliku gradle.properties:

      android.experimental.androidTest.enableEmulatorControl=true
      
  3. Włącz opcję emulatorControl w skrypcie kompilacji na poziomie modułu:

    Kotlin

      testOptions {
        emulatorControl {
          enable = true
        }
      }
      

    Groovy

      testOptions {
        emulatorControl {
          enable = true
        }
      }
      
  4. W skrypcie kompilacji na poziomie modułu zaimportuj do projektu bibliotekę Espresso Device:

    Kotlin

      dependencies {
        androidTestImplementation("androidx.test.espresso:espresso-device:1.0.1")
      }
      

    Groovy

      dependencies {
        androidTestImplementation 'androidx.test.espresso:espresso-device:1.0.1'
      }
      

Testowanie w przypadku typowych zmian konfiguracji

Interfejs Espresso Device API obsługuje różne orientacje ekranu i stany składania, które możesz wykorzystać do symulowania zmian konfiguracji urządzenia.

Testowanie na obrót ekranu

Oto przykład testowania tego, co dzieje się z aplikacją po obróbieniu ekranu urządzenia:

  1. Najpierw, aby zachować spójny stan początkowy, ustaw urządzenie w trybie poziomym:

      import androidx.test.espresso.device.action.ScreenOrientation
      import androidx.test.espresso.device.rules.ScreenOrientationRule
      ...
      @get:Rule
      val screenOrientationRule: ScreenOrientationRule = ScreenOrientationRule(ScreenOrientation.PORTRAIT)
      
  2. Utwórz test, który podczas wykonywania testu ustawia urządzenie w orientacji poziomej:

      @Test
      fun myRotationTest() {
        ...
        // Sets the device to landscape orientation during test execution.
        onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE)
        ...
      }
      
  3. Po obróceniu ekranu sprawdź, czy interfejs dostosowuje się do nowego układu zgodnie z oczekiwaniami.

      @Test
      fun myRotationTest() {
        ...
        // Sets the device to landscape orientation during test execution.
        onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE)
        composeTestRule.onNodeWithTag("NavRail").assertIsDisplayed()
        composeTestRule.onNodeWithTag("BottomBar").assertDoesNotExist()
      }
      

Testowanie otwierania ekranu

Oto przykład testowania tego, co dzieje się z aplikacją, gdy jest ona na urządzeniu składanym, a ekran jest rozłożony:

  1. Najpierw przetestuj urządzenie w stanie złożonym, dzwoniąc na numer onDevice().setClosedMode(). Upewnij się, że układ aplikacji dostosowuje się do kompaktowej szerokości ekranu.

      @Test
      fun myUnfoldedTest() {
        onDevice().setClosedMode()
        composeTestRule.onNodeWithTag("BottomBar").assetIsDisplayed()
        composeTestRule.onNodeWithTag("NavRail").assetDoesNotExist()
        ...
      }
      
  2. Aby przejść do stanu pełnego rozłożenia, wywołaj funkcję onDevice().setFlatMode(). Sprawdź, czy układ aplikacji dostosowuje się do rozszerzonej klasy rozmiarów.

      @Test
      fun myUnfoldedTest() {
        onDevice().setClosedMode()
        ...
        onDevice().setFlatMode()
        composeTestRule.onNodeWithTag("NavRail").assertIsDisplayed()
        composeTestRule.onNodeWithTag("BottomBar").assetDoesNotExist()
      }
      

Określ, jakie urządzenia są potrzebne do testów

Jeśli przeprowadzasz test, który wykonuje czynności składania na urządzeniu, które nie jest składane, test prawdopodobnie się nie powiedzie. Aby wykonać tylko testy, które są istotne dla danego urządzenia, użyj adnotacji @RequiresDeviceMode. Narzędzie do uruchamiania testów automatycznie pomija testy na urządzeniach, które nie obsługują testowanej konfiguracji. Regułę wymagań dotyczących urządzenia możesz dodać do każdego testu lub całej klasy testów.

Aby na przykład określić, że test powinien być uruchamiany tylko na urządzeniach obsługujących rozkładanie do konfiguracji płaskiej, dodaj do testu ten kod @RequiresDeviceMode:

@Test
@RequiresDeviceMode(mode = FLAT)
fun myUnfoldedTest() {
  ...
}