Android Test de l'interface utilisateur simple expresso


Exemple

Outils de test de l'interface utilisateur

Appium et Espresso sont les deux principaux outils actuellement utilisés pour les tests d’interface utilisateur.

Appium Expresso
test de blackbox test de boîte blanche / grise
ce que vous voyez est ce que vous pouvez tester peut modifier le fonctionnement interne de l'application et le préparer pour le test, par exemple enregistrer certaines données dans la base de données ou les préférences partagées avant de lancer le test
Utilisé principalement pour des tests d'intégration de bout en bout et des flux d'utilisateurs entiers tester la fonctionnalité d'un écran et / ou d'un flux
peut être abstraite afin que le test écrit puisse être exécuté sur iOS et Android Android uniquement
Bien soutenu Bien soutenu
prend en charge les tests parallèles sur plusieurs périphériques avec grille de sélénium Pas de tests parallèles prêts à l'emploi, des plug-ins comme Spoon existent jusqu'à ce que le véritable support de Google apparaisse

Comment ajouter du café au projet

dependencies {
  // Set this dependency so you can use Android JUnit Runner
  androidTestCompile 'com.android.support.test:runner:0.5'
  // Set this dependency to use JUnit 4 rules
  androidTestCompile 'com.android.support.test:rules:0.5'
  // Set this dependency to build and run Espresso tests
  androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
  // Set this dependency to build and run UI Automator tests
  androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.2.2'
}

REMARQUE Si vous utilisez les dernières bibliothèques de support, les annotations, etc., vous devez exclure les anciennes versions de l'espresso pour éviter les collisions:

    // there is a conflict with the test support library (see http://stackoverflow.com/questions/29857695)
    // so for now re exclude the support-annotations dependency from here to avoid clashes
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2') {
        exclude group: 'com.android.support', module: 'support-annotations'
        exclude module: 'support-annotations'
        exclude module: 'recyclerview-v7'
        exclude module: 'support-v4'
        exclude module: 'support-v7'
    }
    // exclude a couple of more modules here because of <http://stackoverflow.com/questions/29216327> and
    // more specifically of <https://code.google.com/p/android-test-kit/issues/detail?id=139>
    // otherwise you'll receive weird crashes on devices and dex exceptions on emulators
    // Espresso-contrib for DatePicker, RecyclerView, Drawer actions, Accessibility checks, CountingIdlingResource
    androidTestCompile('com.android.support.test.espresso:espresso-contrib:2.2.2') {
        exclude group: 'com.android.support', module: 'support-annotations'
        exclude group: 'com.android.support', module: 'design'
        exclude module: 'support-annotations'
        exclude module: 'recyclerview-v7'
        exclude module: 'support-v4'
        exclude module: 'support-v7'
    }
    //excluded specific packages due to https://code.google.com/p/android/issues/detail?id=183454
    androidTestCompile('com.android.support.test.espresso:espresso-intents:2.2.2') {
        exclude group: 'com.android.support', module: 'support-annotations'
        exclude module: 'support-annotations'
        exclude module: 'recyclerview-v7'
        exclude module: 'support-v4'
        exclude module: 'support-v7'
    }

    androidTestCompile('com.android.support.test.espresso:espresso-web:2.2.2') {
        exclude group: 'com.android.support', module: 'support-annotations'
        exclude module: 'support-annotations'
        exclude module: 'recyclerview-v7'
        exclude module: 'support-v4'
        exclude module: 'support-v7'
    }

    androidTestCompile('com.android.support.test:runner:0.5') {
        exclude group: 'com.android.support', module: 'support-annotations'
        exclude module: 'support-annotations'
        exclude module: 'recyclerview-v7'
        exclude module: 'support-v4'
        exclude module: 'support-v7'
    }
    androidTestCompile('com.android.support.test:rules:0.5') {
        exclude group: 'com.android.support', module: 'support-annotations'
        exclude module: 'support-annotations'
        exclude module: 'recyclerview-v7'
        exclude module: 'support-v4'
        exclude module: 'support-v7'
    }

Outre ces importations, il est nécessaire d’ajouter le testeur d’instrumentation Android à build.gradle android.defaultConfig:

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

Configuration de l'appareil

Pour un test non feuilleté, il est recommandé de définir les paramètres suivants sur vos appareils:

  • Options pour les développeurs / Désactiver les animations - réduit la fragilité des tests
  • Options pour les développeurs / Restez éveillé - si vous avez des appareils dédiés aux tests, cela est utile
  • Options du développeur / Taille du tampon de l'enregistreur - définissez un nombre plus élevé si vous exécutez des suites de test très volumineuses sur votre téléphone
  • Délai d'accessibilité / Touch & Hold - long pour éviter les problèmes de tapotement dans l'espresso

Assez une configuration du monde réel ha? Eh bien, maintenant, quand c'est hors de portée permet de jeter un oeil à la configuration d'un petit test

Écrire le test

Supposons que nous avons l'écran suivant: Écran tamisé pour le test d'espresso L'écran contient:

  • champ de saisie de texte - R.id.textEntry
  • bouton qui montre le snack avec le texte tapé quand cliqué - R.id.shownSnackbarBtn
  • snackbar qui devrait contenir le texte saisi par l'utilisateur - android.support.design.R.id.snackbar_text

Maintenant, créons une classe qui testera notre flux:

/**
* Testing of the snackbar activity.
**/
@RunWith(AndroidJUnit4.class)
@LargeTest
public class SnackbarActivityTest{
    //espresso rule which tells which activity to start
    @Rule
    public final ActivityTestRule<SnackbarActivity> mActivityRule = 
        new ActivityTestRule<>(SnackbarActivity.class, true, false);


    @Override
    public void tearDown() throws Exception {
        super.tearDown();
        //just an example how tear down should cleanup after itself
        mDatabase.clear();
        mSharedPrefs.clear();
    }
    
    @Override
    public void setUp() throws Exception {
        super.setUp();
        //setting up your application, for example if you need to have a user in shared
        //preferences to stay logged in you can do that for all tests in your setup
        User mUser = new User();
        mUser.setToken("randomToken");
    }
    
    /**
    *Test methods should always start with "testXYZ" and it is a good idea to 
    *name them after the intent what you want to test
    **/
    @Test
    public void testSnackbarIsShown() {
        //start our activity
        mActivityRule.launchActivity(null);
        //check is our text entry displayed and enter some text to it
        String textToType="new snackbar text";
        onView(withId(R.id.textEntry)).check(matches(isDisplayed()));
        onView(withId(R.id.textEntry)).perform(typeText(textToType));
        //click the button to show the snackbar
        onView(withId(R.id.shownSnackbarBtn)).perform(click());
        //assert that a view with snackbar_id with text which we typed and is displayed
        onView(allOf(withId(android.support.design.R.id.snackbar_text), 
        withText(textToType))) .check(matches(isDisplayed()));
    }
}

Comme vous l'avez remarqué, il y a 3 ou 4 choses que vous remarquerez souvent:

onView (withXYZ) <- viewMatchers avec eux, vous pouvez trouver des éléments à l'écran

effectuer (click ()) <- viewActions, vous pouvez exécuter des actions sur des éléments trouvés précédemment

check (correspond à (isDisplayed ())) <- viewAssertions, vérifications à effectuer sur les écrans précédemment trouvés

Tous ces éléments et bien d'autres peuvent être trouvés ici: https://google.github.io/android-testing-support-library/docs/espresso/cheatsheet/index.html

Thats it, maintenant vous pouvez exécuter le test soit avec un clic droit sur le nom de la classe / test et en sélectionnant Exécuter le test ou avec la commande:

./gradlew connectedFLAVORNAMEAndroidTest