Cómo probar un proyecto de biblioteca de Android

97

Estoy escribiendo un proyecto de biblioteca de Android basado en la clase de mapa de bits de Android (llámelo AndroindLib) que contiene solo la clase de utilidad (sin actividad). Intenté probarlo usando Android JUnit, pero sigue quejándose de que no puede encontrar el AnroidLib.apk

¿Cuál es la forma correcta de realizar una prueba unitaria del proyecto de biblioteca de Android?

Lirio
fuente
1
O ( alerta de enchufe descarado ) podría usar un proyecto que creé: Android Library Test Harness (lo que me gusta llamar "Alt H"). Está disponible como un repositorio de git: gitorious.org/alth El proyecto aún está en desarrollo y la documentación es un poco escasa, así que no dude en contactarme si tiene alguna pregunta.
i41

Respuestas:

75

Citando la documentación :

"Hay dos formas recomendadas de configurar las pruebas en el código y los recursos en un proyecto de biblioteca:

  • Puede configurar un proyecto de prueba que instrumenta un proyecto de aplicación que depende del proyecto de la biblioteca. Luego puede agregar pruebas al proyecto para características específicas de la biblioteca.

  • Puede configurar un proyecto de aplicación estándar que dependa de la biblioteca y poner la instrumentación en ese proyecto. Esto le permite crear un proyecto autónomo que contiene tanto las pruebas / instrumentaciones como el código para probar ".

CommonsWare
fuente
27
así que básicamente todo lo que tiene que hacer es agregar la biblioteca a su proyecto de prueba y probar el proyecto de prueba.
njzk2
El enlace ya no es válido, ¿hay alguna posibilidad de que pueda indicarnos el actual?
Abdullah Jibaly
4
No estoy seguro de si alguien más ha tenido éxito con estas recomendaciones, pero yo no. Primero probé la segunda solución y cuando intento ejecutar en Eclipse obtengo lo siguiente: <ProjectName> no especifica una instrumentación android.test.InstrumentationTestRunner o no declara uses-library android.test.runner en su AndroidManifest.xml. Esto es a pesar del hecho de que agregué tanto la instrumentación como los elementos de la biblioteca de usos a mi manifiesto.
Bellinghammer
2
Obtuve la segunda (y la forma preferida de trabajar). Es muy importante que obtenga los elementos de la biblioteca de usos y la instrumentación en la ubicación correcta en su manifiesto. El elemento de instrumentación es hijo del elemento de manifiesto raíz y el elemento uses-library es hijo del elemento de aplicación. Estaba poniendo la biblioteca de usos debajo del elemento de manifiesto y terminando con el mensaje de error anterior al intentar ejecutar las pruebas.
Bellinghammer
17

En su proyecto de prueba, simplemente cambie el nombre del paquete para que sea el mismo que el paquete de su biblioteca. Por ejemplo, tiene una biblioteca cuyo paquete es "com.example.lib". Cree un proyecto de prueba dirigido a su biblioteca. En el archivo de manifiesto, verá package="com.example.lib.test"y targetPackage="com.example.lib". Simplemente cambie el paquete de "com.example.lib.test" a "com.example.lib" ( targetPackagedéjelo como está).

Además, asegúrese de que la biblioteca esté referenciada a su proyecto de prueba NO en la ruta de compilación de Java, sino como una biblioteca de Android habitual: en Eclipse debe mostrarse como biblioteca en la Project->Properties->Androidpestaña, pero no en la Project->Properties->Java Build Pathpestaña.

Entonces haz tus pruebas.

alexaschka
fuente
Sus ideas tenían sentido para mí, por lo que la prueba se apuntó a sí misma (como la aplicación) y la aplicación está vinculada con la biblioteca ... pero no pude hacer que funcione a través de ant build ni IntelliJ ... como el .apk (esperado para la aplicación bajo prueba) no existía cuando intentó instalarla, ya que se está compilando en "test / bin /.- debug.apk"
Andrew Mackenzie
Lo hice funcionar simplemente cambiando el nombre del paquete del proyecto de prueba en su manifiesto (y el paquete bajo prueba, que debería ser el mismo) para NO coincidir con el nombre del paquete del proyecto de la biblioteca, además de eliminar la referencia a la prueba de destino proyecto en el archivo ant.properties.
Andrew Mackenzie
1
Creo que esta es una respuesta mejor que la aceptada, que solo hace eco de la documentación, en mi humilde opinión.
Andrew Mackenzie
5

Según la documentación :

Probar un módulo de biblioteca es lo mismo que probar una aplicación. La principal diferencia es que la biblioteca y sus dependencias se incluyen automáticamente como dependencias del APK de prueba. Esto significa que el APK de prueba incluye no solo su propio código, sino también el AAR de la biblioteca y todas sus dependencias. Debido a que no hay una "aplicación bajo prueba" separada, la tarea androidTest instala (y desinstala) solo el APK de prueba. Al fusionar varios archivos de manifiesto, Gradle sigue el orden de prioridad predeterminado y fusiona el manifiesto de la biblioteca en el manifiesto principal del APK de prueba.

Avilio
fuente
¿Qué tarea ejecutar pruebas? gradle test o gradle androidTest? androidTest no es una tarea.
Día soleado
pero herramientas como Firebase Test Lab requieren un APK o AAB y no aceptan un archivo AAR que es el resultado de la tarea de ensamblaje de la biblioteca
Mustafa Berkay Mutlu
1

NOTA: Esta solución se basa en el uso de Eclipse Indigo (3.8.2) y es posible que deba implementarse de manera ligeramente diferente para otro IDE, aunque los principios básicos serán los mismos.

Tuve problemas similares y descubrí que lo siguiente siempre funciona:

( NOTA: Estas instrucciones son para crear un nuevo grupo de proyectos desde cero. Si ya ha creado partes del grupo de proyectos, es posible que deba modificar sus proyectos para que se conecten de la misma manera ) .

  1. Cree un nuevo proyecto de biblioteca de Android marcando la casilla de verificación "Es biblioteca" durante la creación. (por ejemplo, un proyecto de Android llamado "RemingtonAndroidTools").
  2. Cree el proyecto de la biblioteca de Android y verifique que haya creado un archivo jar en la carpeta bin. (por ejemplo, un archivo jar llamado "RemingtonAndroidTools.jar").
  3. Cree un proyecto de Android vacío para probar la aplicación de Android que servirá como una aplicación de prueba de Android. (Por ejemplo, un proyecto de Android llamado "RemingtonAndroidToolsTestApp"). No necesitará modificar el código fuente o los recursos del proyecto de la aplicación de prueba de Android a menos que tenga algo que deba agregarse para la prueba. Se pueden probar muchas cosas sin modificaciones en el proyecto de aplicación de prueba de Android. El proyecto de la aplicación de prueba de Android es un puente entre su proyecto de biblioteca de Android y el proyecto de Android Junit que hace posible la prueba del proyecto de biblioteca de Android a través de Android Junit.
  4. Vaya a la pestaña Biblioteca de Java Build Path para el proyecto de la aplicación de prueba de Android ("RemingtonAndroidToolsTestApp" en este ejemplo).
  5. Agregue el archivo jar ("RemingtonAndroidTools.jar" en este ejemplo) del proyecto de biblioteca de Android ("RemingtonAndroidTools" en este ejemplo) a través del botón "Agregar jarras ...".
  6. Cree un nuevo proyecto de prueba de Android (por ejemplo, "RemingtonAndroidToolsTester") que servirá como un probador de bibliotecas de Android y seleccione el proyecto de la aplicación de prueba de Android ("RemingtonAndroidToolsTestApp" en este ejemplo) como destino.
  7. Vaya a la pestaña Biblioteca de Java Build Path para el proyecto de probador de bibliotecas de Android ("RemingtonAndroidToolsTester" en este ejemplo).
  8. Agregue el archivo jar ("RemingtonAndroidTools.jar" en este ejemplo) del proyecto de biblioteca de Android ("RemingtonAndroidTools" en este ejemplo) a través del botón "Agregar jarras ...".
  9. Busque la última carpeta de su paquete de Android en el proyecto Android Library Tester ("danny.remington.remington_android_tools_test_app.test", por ejemplo) y agregue una clase de prueba ("MainActivityTest" por ejemplo) que herede de ActivityInstrumentationTestCase2.
  10. Edite la clase de prueba ("TestActivityTest" en este ejemplo) para usar la actividad (por ejemplo, "TestActivity") de la aplicación de prueba de Android ("RemingtonAndroidToolsTestApp" en este ejemplo) como parámetro para ActivityInstrumentationTestCase2.
  11. Edite la clase de prueba ("TestActivityTest" en este ejemplo) y cree un constructor predeterminado que haga una llamada a super (Class) y pase la clase de la aplicación de prueba de Android ("TestActivity.class" por ejemplo).

Debería terminar con tres proyectos (biblioteca de Android, aplicación de prueba de Android, probador de biblioteca de Android) que se parecen a esto:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Debería terminar con una clase para probar su biblioteca de Android que se parece a esto:

package danny.remington.remington_android_tools_test_app.test;

import android.test.ActivityInstrumentationTestCase2;
import danny.remington.remington_android_tools_test_app.TestActivity;

/**
 * 
 */
public class TestActivityTest extends
      ActivityInstrumentationTestCase2<TestActivity> {

   public TestActivityTest() {
      super(TestActivity.class);
   }

}

A continuación, puede agregar cualquier prueba que desee. No necesitará hacer referencia a la aplicación de prueba de Android ("RemingtonAndroidToolsTestApp" en este ejemplo) más para ejecutar sus pruebas a menos que requieran acceso a un componente específico de Android (como la carpeta de Activos, por ejemplo). Si necesita acceder a algún componente específico de Android, puede hacerlo modificando la aplicación de prueba de Android ("RemingtonAndroidToolsTestApp" en este ejemplo) y luego haciendo referencia a ella a través de la instrumentación proporcionada por la API estándar de Android Junit. (Puede leer más sobre eso aquí: http://developer.android.com/tools/testing/testing_android.html )

Danny Remington - OMS
fuente
0

Si sus clases ulitiy no dependen de ningún código específico de Android, puede usar las pruebas unitarias estándar de JUnit. No es necesario utilizar las versiones de Android.

Cheryl Simon
fuente
2
Esto no funciona porque JUnit estándar se compila en la JVM estándar, mientras que los archivos java de Android se compilan en la VM Dalvik.
Danny Remington - OMS