Strategie dotyczące robotyzacji

Robolectric to framework open source obsługiwany przez Google, który umożliwia uruchamianie testów w symulowanym środowisku Androida w ramach JVM bez obciążenia i niestabilności emulatora. Obsługuje wszystkie wersje Androida od Lollipop (poziom interfejsu API 21).

Wiele dużych projektów korzysta z Robolectric, aby zwiększyć szybkość i wiarygodność testów oraz ograniczyć koszty związane z uruchamianiem testów na prawdziwych urządzeniach lub emulatorach. Dotyczy to większości aplikacji Google, które w dużej mierze korzystają z Robolectric.

Robolectric nie zastępuje w pełni emulatora, ponieważ nie obsługuje wszystkich funkcji i interfejsów API. Na przykład Robolectric nie ma ekranu, tak jak emulator, a niektóre interfejsy API są obsługiwane tylko częściowo. Emuluje jednak wystarczającą liczbę elementów Androida, aby można było niezawodnie przeprowadzać testy jednostkowe i większość testów interfejsu użytkownika.

Testowanie strategii

W Robolectric możesz stosować 2 rodzaje strategii testowania: testowanie jednostkowe i testowanie interfejsu użytkownika.

Testowanie jednostkowe

Robolectric został stworzony jako sposób na umożliwienie „testowania jednostkowego” aplikacji na Androida. Możesz na przykład symulować uruchamianie Activity i testować logikę wewnątrz niego, wywołując wszystkie metody cyklu życia.

Jako zależności w testach jednostek możesz też używać fałszywych danych Robolectric (tzw. cieni). Na przykład, jeśli Twoja klasa korzysta z pakietu lub musisz symulować połączenie Bluetooth.

Jeśli zaimplementujesz architekturę testową, nie musisz używać Robolectric do testowania jednostkowego, ponieważ Twój kod powinien być testowany oddzielnie, bez zależności od platformy Android.

Testowanie interfejsu użytkownika

Robolectric może też przeprowadzać testy interfejsu użytkownika, takie jak testy Espresso lub Compose. Możesz przekonwertować test z instrumentacją na test Robolectric, przenosząc go do zestawu testźródeł i konfigurując zależności Robolectric.

android {
  testOptions {
    unitTests {
      isIncludeAndroidResources = true
    }
  }
}

dependencies {
  testImplementation("junit:junit:4.13.2")
  testImplementation("org.robolectric:robolectric:4.13")
}

Każdy test UI obecny w zbiorze test jest uruchamiany za pomocą Robolectric.

import androidx.test.espresso.Espresso.onView

@RunWith(AndroidJUnit4::class)
class AddContactActivityTest {
    @Test
    fun inputTextShouldBeRetainedAfterActivityRecreation() {
        // GIVEN
        val contactName = "Test User"
        val scenario = ActivityScenario.launchActivity<AddContactActivity>()

        // WHEN
        // Enter contact name
        onView(withId(R.id.contact_name_text))
            .perform(typeText(contactName))
        // Destroy and recreate Activity
        scenario.recreate()

        // THEN
        // Check contact name was preserved.
        onView(withId(R.id.contact_name_text))
            .check(matches(withText(contactName)))
     }
}

Większość testów interfejsu użytkownika nie wchodzi w interakcję z ramówką i można je uruchamiać w Robolectric. Możesz przeprowadzać testy behawioralne w Robolectric, ponieważ dokładność tego narzędzia w pełni wystarcza. Na przykład gdy testowanie kodu źródłowego sprawdza, czy interfejs użytkownika zmienił się po kliknięciu przycisku.

Za pomocą Robolectric możesz też wykonywać inne testy interfejsu użytkownika, np. testy zrzutów ekranu. Jednak jakość jest niższa, ponieważ różne urządzenia renderują ekrany nieco inaczej.

Musisz zdecydować, czy implementacja Robolectric jest wystarczająca w każdym przypadku użycia, ale oto kilka zaleceń:

  • Używaj Robolectric do testów zachowania UI w przypadku komponentów, funkcji lub aplikacji. Ogólnie te testy sprawdzają zarządzanie stanem i zachowanie interfejsu użytkownika, ale nie oddziałują na zewnętrzne zależności.
  • Użyj Robolectric do robienia zrzutów ekranu, gdy dokładność pikseli nie jest krytyczna. Możesz na przykład sprawdzić, jak komponent reaguje na różne rozmiary czcionki lub motywy.

Uwaga: Robolectric może robić zrzuty ekranu w sposób natywny, ale do testowania zrzutów ekranu za pomocą tego narzędzia potrzebna jest biblioteka innej firmy.

Robolectric a testy na urządzeniach

Podsumowując, Robolectric zapewnia wystarczającą zgodność, aby można było przeprowadzać większość testów interfejsu użytkownika, ale w niektórych przypadkach konieczne będą testy na urządzeniu, np. w przypadku testów związanych z interfejsem systemu, takich jak wyświetlanie obrazu od krawędzi do krawędzi lub obrazu w obrazie, lub gdy korzystasz z nieobsługiwanych funkcji, takich jak WebView.