Cadre de test Espresso - AdapterView

AdapterView est un type de vue spécial spécialement conçu pour restituer une collection d'informations similaires telles que la liste de produits et les contacts utilisateur extraits d'une source de données sous-jacente à l'aide d' Adaptateur . La source de données peut être une simple liste d'entrées de base de données complexes. Certaines vues dérivées de AdapterView sont ListView , GridView et Spinner .

AdapterView rend l'interface utilisateur de manière dynamique en fonction de la quantité de données disponibles dans la source de données sous-jacente. De plus, AdapterView ne rend que les données minimales nécessaires, qui peuvent être rendues dans la zone visible disponible de l'écran. AdapterView effectue cette opération pour conserver la mémoire et rendre l'interface utilisateur fluide même si les données sous-jacentes sont volumineuses.

Lors de l'analyse, la nature de l' architecture AdapterView rend l' option onView et ses correspondances de vue non pertinentes car la vue particulière à tester peut ne pas être rendue du tout en premier lieu. Heureusement, espresso fournit une méthode, onData ( ), qui accepte les matchers hamcrest (pertinents pour le type de données des données sous-jacentes) pour faire correspondre les données sous-jacentes et renvoie un objet de type DataInteraction correspondant à la vue des données correspondantes. Un exemple de code est le suivant,

onData(allOf(is(instanceOf(String.class)), startsWith("Apple"))).perform(click())

Ici, onData () correspond à l'entrée «Apple», si elle est disponible dans les données sous-jacentes (liste de tableaux) et renvoie l' objet DataInteraction pour interagir avec la vue correspondante (TextView correspondant à l'entrée «Apple»).

Méthodes

DataInteraction fournit les méthodes ci-dessous pour interagir avec la vue,

effectuer()

Cela accepte les actions de vue et déclenche les actions de vue transmises.

onData(allOf(is(instanceOf(String.class)), startsWith("Apple"))).perform(click())

vérifier()

Cela accepte les assertions de vue et vérifie les assertions de vue transmises.

onData(allOf(is(instanceOf(String.class)), startsWith("Apple")))
   .check(matches(withText("Apple")))

inAdapterView ()

Cela accepte les correspondances de vue. Il sélectionne l' AdaptateurView particulier en fonction des correspondances de vue transmises et renvoie l' objet DataInteraction pour interagir avec l' AdaptateurView correspondant

onData(allOf())
   .inAdapterView(withId(R.id.adapter_view))
   .atPosition(5)
   .perform(click())

atPosition ()

Cela accepte un argument de type entier et fait référence à la position de l'élément dans les données sous-jacentes. Il sélectionne la vue correspondant à la valeur positionnelle transmise des données et renvoie l' objet DataInteraction pour interagir avec la vue correspondante. Ce sera utile, si nous connaissons le bon ordre des données sous-jacentes.

onData(allOf())
   .inAdapterView(withId(R.id.adapter_view))
   .atPosition(5)
   .perform(click())

onChildView ()

Cela accepte les correspondances de vue et correspond à la vue dans la vue enfant spécifique. Par exemple, nous pouvons interagir avec des éléments spécifiques comme le bouton Acheter dans une liste de produits basée sur AdapterView .

onData(allOf(is(instanceOf(String.class)), startsWith("Apple")))
   .onChildView(withId(R.id.buy_button))
   .perform(click())

Rédiger un exemple d'application

Suivez les étapes ci-dessous pour écrire une application simple basée sur AdapterView et écrire un scénario de test à l'aide de la méthode onData () .

  • Démarrez le studio Android.

  • Créez un nouveau projet comme indiqué précédemment et nommez-le MyFruitApp .

  • Migrez l'application vers le framework AndroidX à l'aide de RefactorMigrer vers le menu d'options AndroidX .

  • Supprimez la conception par défaut dans l'activité principale et ajoutez ListView . Le contenu de activity_main.xml est le suivant,

<?xml version = "1.0" encoding = "utf-8"?>
<RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android"
   xmlns:app = "http://schemas.android.com/apk/res-auto"
   xmlns:tools = "http://schemas.android.com/tools"
   android:layout_width = "match_parent"
   android:layout_height = "match_parent"
   tools:context = ".MainActivity">
   <ListView
      android:id = "@+id/listView"
      android:layout_width = "wrap_content"
      android:layout_height = "wrap_content" />
</RelativeLayout>
  • Ajoutez une nouvelle ressource de mise en page, item.xml pour spécifier le modèle d'élément de la vue de liste. Le contenu du fichier item.xml est le suivant,

<?xml version = "1.0" encoding = "utf-8"?>
<TextView xmlns:android = "http://schemas.android.com/apk/res/android"
   android:id = "@+id/name"
   android:layout_width = "fill_parent"
   android:layout_height = "fill_parent"
   android:padding = "8dp"
/>
  • Maintenant, créez un adaptateur ayant un tableau de fruits comme données sous-jacentes et définissez-le sur la vue de liste. Cela doit être fait dans le onCreate () de MainActivity comme spécifié ci-dessous,

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);
   
   // Find fruit list view
   final ListView listView = (ListView) findViewById(R.id.listView);
   
   // Initialize fruit data
   String[] fruits = new String[]{
      "Apple", 
      "Banana", 
      "Cherry", 
      "Dates", 
      "Elderberry", 
      "Fig", 
      "Grapes", 
      "Grapefruit", 
      "Guava",
      "Jack fruit", 
      "Lemon",
      "Mango", 
      "Orange", 
      "Papaya", 
      "Pears", 
      "Peaches", 
      "Pineapple",
      "Plums", 
      "Raspberry",
      "Strawberry", 
      "Watermelon"
   };
   
   // Create array list of fruits
   final ArrayList<String> fruitList = new ArrayList<String>();
   for (int i = 0; i < fruits.length; ++i) {
      fruitList.add(fruits[i]);
   }
   
   // Create Array adapter
   final ArrayAdapter adapter = new ArrayAdapter(this, R.layout.item, fruitList);
   
   // Set adapter in list view
   listView.setAdapter(adapter);
}
  • Maintenant, compilez le code et exécutez l'application. La capture d'écran de l'application My Fruit est la suivante,

  • Maintenant, ouvrez le fichier ExampleInstrumentedTest.java et ajoutez ActivityTestRule comme spécifié ci-dessous,

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

Assurez-vous également que la configuration du test est effectuée dans app / build.gradle -

dependencies {
   testImplementation 'junit:junit:4.12'
   androidTestImplementation 'androidx.test:runner:1.1.1'
   androidTestImplementation 'androidx.test:rules:1.1.1'
   androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
}
  • Ajoutez un nouveau cas de test pour tester la vue de liste comme ci-dessous,

@Test
public void listView_isCorrect() {
   // check list view is visible
   onView(withId(R.id.listView)).check(matches(isDisplayed()));
   onData(allOf(is(instanceOf(String.class)), startsWith("Apple"))).perform(click());
   onData(allOf(is(instanceOf(String.class)), startsWith("Apple")))
      .check(matches(withText("Apple")));
   // click a child item
   onData(allOf())
      .inAdapterView(withId(R.id.listView))
      .atPosition(10)
      .perform(click());
}
  • Enfin, exécutez le scénario de test à l'aide du menu contextuel d'Android Studio et vérifiez si tous les scénarios de test réussissent.