Testing - 1Adevelopers/FlorAppMovil GitHub Wiki

Testing

Documentos Descripción
Plan de Pruebas Documento marco que define la estrategia de QA, alcance, criterios de aceptación, herramientas y entornos de prueba.
Planilla de Test Cases Matriz detallada de casos de prueba con pasos de ejecución, datos de entrada, resultados esperados y estados.
Reporte de Bugs Registro y seguimiento de incidencias, errores visuales y fallos detectados, gestionados en el tablero Kanban.
Accesibilidad Auditoría de usabilidad y estándares WCAG 2.2 AA (contraste, TalkBack, ScrollView y touch targets de 48dp).
Pruebas Unitarias de ViewModel y Validador Evidencias y reporte HTML ejecutable (ZIP) de los tests locales sobre ContactoViewModel y ContactoValidador.
Pruebas de repositorio con MockWebServer Pruebas unitarias sobre ContactoRepository simulando respuestas HTTP (200 OK / 500 Error) en la PC sin backend real.
Flujo crítico con Espresso y Screen Object Pruebas de UI instrumentadas en emulador/dispositivo para validar navegación y formularios de forma automatizada.
Pruebas automatizadas con Appium Suite de pruebas End-to-End (E2E) ejecutadas sobre la APK compilada para validar flujos de usuario completos.

Guía de Ejecución de Pruebas - FlorApp Móvil

Este documento detalla las instrucciones necesarias para ejecutar la suite de pruebas automatizadas y consultar los reportes de calidad del proyecto FlorApp.

Requisitos Previos

  • Android Studio (versión Iguana o superior recomendada).
  • JDK 17 configurado en el proyecto.
  • Para las pruebas de UI (Espresso), se requiere un emulador o dispositivo físico conectado con Android 8.0 (API 26) o superior.

1. Tests Unitarios y MockWebServer (Pruebas Locales)

Estos tests evalúan la lógica interna (Validadores, ViewModels) y simulan las respuestas de la API de Django usando MockWebServer sin necesidad de un emulador.

Ejecución desde Android Studio:

  1. En la vista de proyecto (Project View), navega a la carpeta app/src/test/java/.
  2. Haz clic derecho sobre el paquete raíz de las pruebas (com.ispc.florappmovil).
  3. Selecciona "Run 'Tests in florappmovil'".

Ejecución por Terminal (Gradle):

Abre la terminal integrada en Android Studio y ejecuta:

./gradlew testDebugUnitTest

Pruebas unitarias de ViewModel y Validador (Contacto)

Esta sección documenta las pruebas unitarias locales para la lógica de presentación (ContactoViewModel) y la validación de formularios (ContactoValidador). Verifican el comportamiento reactivo de la interfaz y las reglas de negocio en la PC sin necesidad de encender un emulador o dispositivo físico.

Dato Valor
Herramientas JUnit 4 + Mockito (org.mockito:mockito-core:4.8.0) + ArchTaskExecutor
Lenguaje / Framework Java + JUnit 4
Tipo de prueba Unitaria local (JVM - corre en la PC)
Clases probadas com.ispc.florappmovil.ui.contacto.ContactoViewModelcom.ispc.florappmovil.util.ContactoValidador
Clases de test app/src/test/java/com/ispc/florappmovil/ui/contacto/ContactoViewModelTest.javaapp/src/test/java/com/ispc/florappmovil/util/ContactoValidadorTest.java
Responsables M. Florencia Lorenzati / Ignacio Bentivoglio
Reportes ContactoViewModelTest / ContactoValidadorTest

1. ¿Qué es cada cosa y para qué sirven estas pruebas?

Mockito y pruebas de ViewModel (AUT-UNIT-02)

Un ViewModel gestiona los estados de la interfaz gráfica a través de LiveData. Para probarlo de forma aislada sin depender del servidor ni de la base de datos real, se utiliza Mockito para crear un repositorio falso (@Mock).

  • El mock simula respuestas instantáneas (éxito o excepción) y se comprueba que el ViewModel exponga los mensajes correctos a la vista.

Pruebas de validación (AUT-UNIT-03)

Son pruebas de lógica pura creadas con JUnit 4. Evalúan métodos estáticos o utilitarios (ContactoValidador) aplicando clases de equivalencia y valores límite para garantizar que los datos ingresados por el usuario cumplan el formato obligatorio antes de enviar la petición a la red.


2. Capa probada: Lógica de presentación y validación

En el módulo de contacto, las pruebas unitarias cubren el flujo previo al envío de red:

Capa Clase de Test Técnica / Herramienta Qué simula / verifica
ViewModel ContactoViewModelTest (AUT-UNIT-02) Mockito (@Mock) + InstantTaskExecutorRule Simula la respuesta del repositorio y verifica la actualización reactiva del LiveData (mensajeExito / mensajeError).
Validador ContactoValidadorTest (AUT-UNIT-03) JUnit 4 (Lógica pura) Verifica restricciones de formato, vacíos, longitud mínima (3 caracteres) y caracteres permitidos en el campo Nombre.

3. Pruebas implementadas

Suite 1: ContactoViewModelTest (AUT-UNIT-02)

  • Requerimiento / US: REQ-05 / US-RF-05 / CA-CTO-01
ID Automatización Método de Test Caso / Respuesta del Mock Verificación y Criterio de Éxito
AUT-UNIT-02a enviarConsultaExito_actualizaEstadoExitoso El mock del repositorio retorna true. ContactoViewModel expone en mensajeExito el texto "¡Consulta enviada con éxito!".
AUT-UNIT-02b enviarConsultaError_actualizaEstadoError El mock del repositorio lanza una excepción (IOException). ContactoViewModel captura el error y expone en mensajeError el texto "Error al conectar con el servidor".

Suite 2: ContactoValidadorTest (AUT-UNIT-03)

  • Requerimiento / US: CA-CTO-03
ID Automatización Método de Test Dato de entrada evaluado Resultado esperado Criterio de validación
AUT-UNIT-03a valorValido_retornaTrue "Pedro Perez" true Cumple con longitud y caracteres alfabéticos permitidos.
AUT-UNIT-03b valorVacio_retornaFalse " " false Rechaza cadenas compuestas únicamente por espacios en blanco.
AUT-UNIT-03c valorEnLimiteInferior_retornaTrue "Ana" true Cumple con el límite inferior exacto de 3 caracteres.
AUT-UNIT-03d valorFueraDeFormato_retornaFalse "Pedro_#123" false Rechaza caracteres especiales y números no permitidos.

4. Configuración en Gradle

En el archivo app/build.gradle, dentro del bloque dependencies:

testImplementation 'junit:junit:4.13.2'
testImplementation 'org.mockito:mockito-core:4.8.0'
testImplementation 'androidx.arch.core:core-testing:2.1.0' // Regla para ejecutar LiveData de forma síncrona en JVM

Nota: La dependencia core-testing proporciona la regla @Rule public InstantTaskExecutorRule, imprescindible para que los observadores de LiveData respondan de manera síncrona dentro de la prueba unitaria.

5. Ejecución de las pruebas

No requiere encender el backend de Django, ni conectar celular o emulador.

Desde Android Studio

  1. Navegar en la vista de proyecto a app/src/test/java/com/ispc/florappmovil/.
  2. Hacer clic derecho sobre ContactoViewModelTest.java o ContactoValidadorTest.java.
  3. Seleccionar Run 'ContactoViewModelTest' (o presionar Ctrl + Shift + F10).

Desde la terminal (PowerShell / CMD)

  • Ejecutar únicamente la suite del ViewModel:
    .\gradlew.bat :app:testDebugUnitTest --tests "*ContactoViewModelTest"
    
  • Ejecutar únicamente la suite del Validador:
    .\gradlew.bat :app:testDebugUnitTest --tests "*ContactoValidadorTest"
    
  • Ejecutar la suite completa de pruebas unitarias locales:
    .\gradlew.bat :app:cleanTestDebugUnitTest :app:testDebugUnitTest
    

Visualización del reporte HTML

Abrir el archivo en cualquier navegador web descomprimiendo la suite completa o navegando a la siguiente ruta:

app/build/reports/tests/testDebugUnitTest/index.html

6. Resultado de la ejecución

Fecha Entorno de Ejecución Tests Ejecutados Resultado
12/10/2026 Linux Lubuntu / Windows 10 — JVM 17 (Android Studio) 6 de 6 pasaron 100% successful (81 ms)
==============================================================================
BUILD SUCCESSFUL in 2s
21 actionable tasks: 6 executed, 15 up-to-date

Test Results:
[PASSED] ContactoViewModelTest > enviarConsultaExito_actualizaEstadoExitoso
[PASSED] ContactoViewModelTest > enviarConsultaError_actualizaEstadoError
[PASSED] ContactoValidadorTest > valorValido_retornaTrue
[PASSED] ContactoValidadorTest > valorVacio_retornaFalse
[PASSED] ContactoValidadorTest > valorEnLimiteInferior_retornaTrue
[PASSED] ContactoValidadorTest > valorFueraDeFormato_retornaFalse

6 tests completed, 0 failed, 0 skipped.
==============================================================================

7. Problemas frecuentes y soluciones

Síntoma Causa probable Solución
NullPointerException al evaluar LiveData El hilo de LiveData no está sincronizado en la JVM. Agregar la regla @Rule public InstantTaskExecutorRule instantExecutorRule = new InstantTaskExecutorRule(); en la clase de test.
Cannot resolve symbol Mockito Falta la dependencia mockito-core o ejecutar Sync. Revisar app/build.gradle y presionar Sync Now en Android Studio.
Test no detectado por Gradle La clase de prueba quedó guardada en src/main o src/androidTest. Asegurarse de que el archivo se encuentre bajo la ruta app/src/test/java/....