Marco de prueba de Espresso - AdapterView

AdapterView es un tipo especial de vista diseñado específicamente para representar una colección de información similar, como la lista de productos y los contactos de los usuarios, obtenidos de una fuente de datos subyacente mediante Adapter . La fuente de datos puede ser una lista simple de entradas de bases de datos complejas. Algunas de las vistas derivadas de AdapterView son ListView , GridView y Spinner .

AdapterView representa la interfaz de usuario de forma dinámica en función de la cantidad de datos disponibles en la fuente de datos subyacente. Además, AdapterView procesa solo los datos mínimos necesarios, que se pueden procesar en el área visible disponible de la pantalla. AdapterView hace esto para conservar la memoria y hacer que la interfaz de usuario se vea fluida incluso si los datos subyacentes son grandes.

Tras el análisis, la naturaleza de la arquitectura AdapterView hace que la opción onView y sus comparadores de vistas sean irrelevantes porque es posible que la vista particular que se va a probar no se represente en absoluto en primer lugar. Afortunadamente, espresso proporciona un método, onData ( ), que acepta comparadores hamcrest (relevantes para el tipo de datos de los datos subyacentes) para hacer coincidir los datos subyacentes y devuelve el objeto de tipo DataInteraction correspondiente a la vista de los datos coincidentes. Un código de muestra es el siguiente,

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

Aquí, onData () coincide con la entrada "Apple", si está disponible en los datos subyacentes (lista de matriz) y devuelve el objeto DataInteraction para interactuar con la vista coincidente (TextView correspondiente a la entrada "Apple").

Métodos

DataInteraction proporciona los siguientes métodos para interactuar con la vista,

realizar()

Esto acepta acciones de visualización y activa las acciones de visualización pasadas.

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

cheque()

Esto acepta aserciones de vista y verifica las aserciones de vista pasadas.

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

inAdapterView ()

Esto acepta ver comparadores. Selecciona el AdapterView particular basado en los comparadores de vista pasados ​​y devuelve el objeto DataInteraction para interactuar con el AdapterView coincidente

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

atPosition ()

Acepta un argumento de tipo entero y hace referencia a la posición del elemento en los datos subyacentes. Selecciona la vista correspondiente al valor posicional pasado de los datos y devuelve el objeto DataInteraction para interactuar con la vista coincidente. Será útil si conocemos el orden correcto de los datos subyacentes.

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

onChildView ()

Esto acepta comparadores de vista y coincide con la vista dentro de la vista secundaria específica. Por ejemplo, podemos interactuar con elementos específicos como el botón Comprar en un AdapterView basado en una lista de productos .

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

Escribir una aplicación de muestra

Siga los pasos que se muestran a continuación para escribir una aplicación simple basada en AdapterView y escriba un caso de prueba usando el método onData () .

  • Inicie Android Studio.

  • Cree un nuevo proyecto como se discutió anteriormente y asígnele el nombre MyFruitApp .

  • Migre la aplicación al marco de AndroidX usando RefactorMigrar al menú de opciones de AndroidX .

  • Elimine el diseño predeterminado en la actividad principal y agregue ListView . El contenido de activity_main.xml es el siguiente,

<?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>
  • Agregue un nuevo recurso de diseño, item.xml para especificar la plantilla de elementos de la vista de lista. El contenido del item.xml es el siguiente,

<?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"
/>
  • Ahora, cree un adaptador que tenga una matriz de frutas como datos subyacentes y configúrelo en la vista de lista. Esto debe hacerse en el onCreate () de MainActivity como se especifica a continuación,

@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);
}
  • Ahora, compile el código y ejecute la aplicación. La captura de pantalla de la aplicación My Fruit es la siguiente:

  • Ahora, abra el archivo ExampleInstrumentedTest.java y agregue ActivityTestRule como se especifica a continuación,

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

Además, asegúrese de que la configuración de prueba se realice en 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'
}
  • Agregue un nuevo caso de prueba para probar la vista de lista como se muestra a continuación,

@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());
}
  • Finalmente, ejecute el caso de prueba usando el menú contextual de Android Studio y verifique si todos los casos de prueba están teniendo éxito.