09 Maj

Espresso Test Recorder

Wraz z udostępnieniem Android Studio w wersji 2.2, Google oddało w ręce deweloperów wiele nowości. Jedną z nich jest Espresso Test Recorder. Espresso jest frameworkiem umożliwiającym pisanie testów UI naszych aplikacji. Jest on częścią Android Support Testing Library.

Dzięki Espresso Test Recorder tworzenie testów jest znacznie łatwiejsze oraz szybsze niż w przypadku pisania ich samodzielnie. Nasze zadanie polega na wykonaniu akcji, takich jak przy normalnym użytkowaniu aplikacji, a następnie dodaniu asercji które ocenią czy działanie aplikacji jest prawidłowe. Po zakończeniu tak zwanego nagrywania, zostaje wygenerowany kod z testem, który odpala się tak samo, jak test pisany ręcznie.

Instalacja

Aby rozpocząć pracę z Test Recorderem, do naszego pliku app/build.gradle musimy dodać następujące zależności:

androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
androidTestCompile 'com.android.support.test:runner:0.5'

W tym samym pliku, w sekcji android.defaulConfig należy dodać:

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

Po takim przygotowaniu możemy rozpocząć nagrywanie testu. Z górnego menu wybieramy Run -> Record Espresso Test.

Nagrywanie

Następnie należy wybrać urządzenie na którym ma zostać uruchomiona aplikacja, może to być zarówno emulator jak i fizyczne urządzenie. W tym miejscu warto zaznaczyć, że aby nagrywanie testów działało prawidłowo, powinniśmy w opcjach deweloperskich wyłączyć animacje. Naszym oczom powinno ukazać się okno zawierające wszystkie interakcje oraz asercje jakie wykonaliśmy/dodaliśmy. Na samym początku będzie ono oczywiście puste.

Po każdej wykonanej interakcji lista zostanie uaktualniona.

W dowolnym momencie możemy zaznaczyć jakikolwiek widok, a następnie klikając w przycisk "Add Assertion" dodać asercję, oceniającą czy znajduje się on we właściwym stanie czy też nie. Wybór asercji niestety nie jest zbyt szeroki i ogranicza się do, "exists" lub "does not exist", dla wszystkich widoków, oraz dodatkowo "text is" dla TextView i jego podklas.

Po wykonaniu wszystkich akcji i dodaniu wszystkich asercji, możemy kliknąć w przycisk "Complete Recording". Po zakończeniu nagrywania, zostanie wygenerowany plik z kodem dla naszego testu.

@RunWith(AndroidJUnit4.class)
public class MainActivityTest3 {

    @Rule
    public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class);

    @Test
    public void mainActivityTest3() {
        ViewInteraction appCompatButton = onView(
                allOf(withId(R.id.button_1), withText("Button 1"),
                        withParent(allOf(withId(R.id.activity_main),
                                withParent(withId(android.R.id.content)))),
                        isDisplayed()));
        appCompatButton.perform(click());

        ViewInteraction textView = onView(
                allOf(withId(R.id.text_tv), withText("Button 1"),
                        childAtPosition(
                                allOf(withId(R.id.activity_main),
                                        childAtPosition(
                                                withId(android.R.id.content),
                                                0)),
                                0),
                        isDisplayed()));
        textView.check(matches(withText("Button 1")));

    }

    private static Matcher<View> childAtPosition(
            final Matcher<View> parentMatcher, final int position) {

        return new TypeSafeMatcher<View>() {
            @Override
            public void describeTo(Description description) {
                description.appendText("Child at position " + position + " in parent ");
                parentMatcher.describeTo(description);
            }

            @Override
            public boolean matchesSafely(View view) {
                ViewParent parent = view.getParent();
                return parent instanceof ViewGroup && parentMatcher.matches(parent)
                        && view.equals(((ViewGroup) parent).getChildAt(position));
            }
        };
    }
}
Podsumowanie

Espresso Test Recorder jest na pewno ciekawym narzędziem z potencjałem. Niestety głównie przez ograniczenia związane z małą ilością możliwych asercji, nie pozwala on w tym momencie na tworzenie bardziej skomplikowanych testów. Zachęcam jednak do sprawdzenia jego działania i śledzenia jego rozwoju. W przyszłości może on nawet całkowicie zastąpić tradycyjny sposób tworzenia testów UI.