Cómo probar el proveedor de contenido

Si estás implementando un proveedor de contenido con el fin de almacenar y recuperar datos o ponerlos a disposición de otras apps, debes probar el proveedor y asegurarte de que no se comportará de manera inesperada. En esta lección, se describe cómo probar los proveedores de contenido público, y también sirve con los proveedores que mantienes como privados en tu propia app.

También es recomendable que leas sobre los Proveedores de contenido.

Cómo crear pruebas de integración para proveedores de contenido

En Android, las apps ven a los proveedores de contenido como API de datos que proporcionan tablas de datos, con sus elementos internos ocultos en la vista. Un proveedor de contenido puede tener muchas constantes públicas, pero en general tiene pocos o ningún método y ninguna variable pública. Por este motivo, debes escribir tus pruebas solo en función de los miembros públicos del proveedor. Un proveedor de contenido diseñado de esta manera ofrece un contrato entre él y sus usuarios.

Los proveedores de contenido permiten acceder a los datos reales del usuario, por lo que es importante asegurarse de probar el proveedor de contenido en un entorno de prueba aislado. Este enfoque permite ejecutar el contenido solo con las dependencias de datos establecidas explícitamente en el caso de prueba. También significa que las pruebas no modifican los datos reales del usuario. Por ejemplo, debes evitar escribir una prueba que falle porque había datos de una prueba anterior. Tu prueba también debe evitar agregar o borrar información de contacto real en un proveedor.

Para probar tu proveedor de contenido de forma aislada, usa la clase ProviderTestCase2. Esta clase te permite usar clases de objetos ficticios de Android, como IsolatedContext y MockContentResolver, para acceder a la información de archivos y bases de datos sin afectar los datos reales del usuario.

La prueba de integración se debe escribir como una clase de prueba JUnit 4. Para obtener más información sobre la creación de clases de prueba JUnit 4 y el uso de afirmaciones, consulta Cómo crear una clase de prueba de unidad local.

A fin de crear una prueba de integración para tu proveedor de contenido, debes seguir estos pasos:

  • Crea la clase de prueba como una subclase de ProviderTestCase2.
  • Agrega la anotación @RunWith(AndroidJUnit4::class) al comienzo de la definición de la clase de prueba.
  • Especifica la clase AndroidJUnitRunner que AndroidX Test proporciona como panel de prueba predeterminado. Este paso se describe con más detalle en Cómo comenzar con las pruebas.
  • Configura el objeto Context de la clase ApplicationProvider. Consulta el fragmento a continuación para ver un ejemplo.

    Kotlin

        @Throws(Exception::class)
        override fun setUp() {
            super.setUp()
            context = ApplicationProvider.getApplicationContext<Context>()
        }
        

    Java

        @Override
        protected void setUp() throws Exception {
            super.setUp();
            setContext(ApplicationProvider.getApplicationContext());
        }
        

Cómo funciona ProviderTestCase2

Pruebas un proveedor con una subclase ProviderTestCase2. Esta clase base extiende AndroidTestCase, de modo que proporciona el framework de prueba de JUnit, así como métodos específicos de Android para probar los permisos de las aplicaciones. La función más importante de esta clase es la inicialización, que crea el entorno de prueba aislado.

La inicialización ocurre en el constructor ProviderTestCase2, que las subclases llaman en sus propios constructores. El constructor ProviderTestCase2 crea un objeto IsolatedContext que permite operaciones de archivos y bases de datos, pero excluye otras interacciones con el sistema Android. Las operaciones de archivo y base de datos ocurren en un directorio que es local para el dispositivo o emulador y que tiene un prefijo especial.

El constructor crea una instancia MockContentResolver para usarla como agente de resolución de la prueba.

Por último, el constructor crea una instancia del proveedor bajo evaluación. Es un objeto ContentProvider normal, pero toma toda la información del entorno desde IsolatedContext, por lo que se restringe al entorno de prueba aislado. Todas las pruebas realizadas en la clase del caso de prueba se ejecutan contra este objeto aislado.

Debes ejecutar las pruebas de integración para proveedores de contenido de la misma manera que ejecutas las pruebas de unidades instrumentadas. A fin de ejecutar la prueba de integración para tu proveedor de contenido, sigue los pasos descritos en Cómo ejecutar pruebas de unidades instrumentadas.

Qué debes probar

Estas son algunas pautas específicas para probar los proveedores de contenido.

  • Prueba con los métodos del agente de resolución. Aunque puedes crear una instancia de un objeto del proveedor en ProviderTestCase2, siempre debes probar con un objeto del agente de resolución mediante el URI apropiado. Así, se garantiza que pruebes el proveedor con la misma interacción que usaría una aplicación normal.
  • Prueba un proveedor público como un contrato. Si quieres que el proveedor sea público y que esté disponible para otras aplicaciones, debes probarlo como un contrato. A continuación, se incluyen algunos ejemplos de cómo hacerlo:
    • Prueba con constantes que tu proveedor expone públicamente. Por ejemplo, busca constantes que hagan referencia a nombres de columna en una de las tablas de datos del proveedor. Estas siempre deben ser constantes que el proveedor defina de manera pública.
    • Prueba todos los URI que ofrece tu proveedor. El proveedor puede ofrecer varios, y cada uno hará referencia a un aspecto diferente de los datos.
    • Prueba los URI no válidos. Las pruebas de unidades deben llamar deliberadamente al proveedor con un URI no válido y buscar errores. Un buen diseño de proveedor es arrojar una IllegalArgumentException para URI no válidos.
  • Prueba las interacciones estándar del proveedor. La mayoría de los proveedores ofrecen seis métodos de acceso: query(), insert(), delete(), update(), getType() y onCreate(). Las pruebas deben verificar que funcionen todos estos métodos, que se describen con más detalle en el tema Proveedores de contenido.
  • Prueba la lógica empresarial: Si el proveedor de contenido implementa la lógica empresarial, debes probarla. Esta lógica incluye el control de valores no válidos, cálculos financieros o aritméticos, eliminación o combinación de duplicados.