Reporte resultado de pruebas Sprint 2 - jcrinconv/MISW4203-2026-12-ing-sw-apps-moviles GitHub Wiki

Iteración: HU03 + HU04 + HU05 (+ robustecimiento HU01, HU02)
Fecha: 2026-05-10

Importante: El presente documento muestra el detalle de las ejecuciones de pruebas e2e con espresso y manuales exploratorias. Para ver el detalle del resultado de pruebas de desempeño, por favor dirigirse a sus reportes correspondientes: Micro-optimizaciones Estrategia de caching Perfilamiento


Ejecutivo

Se completó la implementación y validación de las historias de usuario HU03 (Consultar listado de artistas), HU04 (Consultar detalle de artista) y HU05 (Consultar listado de coleccionistas). Adicionalmente, se robustecieron las pruebas E2E de HU01 y HU02 incorporando los hallazgos y oportunidades de mejora identificados en el Sprint 1 (escenarios negativos, casos límite y manejo de errores).

La estrategia de pruebas sigue el enfoque TNT con automatización E2E usando Espresso y MockWebServer, complementada con exploración manual.

Resultado General:FINALIZADO


1. Continuidad desde Sprint 1

1.1 Issues del Sprint 1 resueltas en Sprint 2

Las siguientes oportunidades de mejora reportadas en el Sprint 1 fueron implementadas:

Issue Sprint 1 Descripción Resolución Sprint 2
HU01-FIX01 Ajuste aplicar filtros en navegación ✅ Persistencia de estado en ViewModel (query y ordenamiento se mantienen al volver atrás)
HU01-FIX02 Agregar casos negativos en escenarios de evaluación ✅ Tests testSearchNoResults, testEmptyListFromServer, testServerError implementados en AlbumsListTest.kt
HU02-FIX01 Agregar escenarios de cobertura en casos límites ✅ Tests testEmptyAlbumDetail, testAlbumDetailErrorCharge implementados en AlbumDetailFragmentTest.kt

1.2 Robustecimiento de pruebas Sprint 1

AlbumsListTest.kt — de 5 a 7 tests:

  • testSearchNoResults — Búsqueda con texto inexistente muestra estado vacío (usa Faker para generar texto aleatorio)
  • testEmptyListFromServer — API retorna lista vacía, se muestra mensaje apropiado
  • testServerError — API retorna error 500, se muestra mensaje de error
  • testSearchAndClearRestoresList — Al borrar búsqueda, la lista original se restaura

AlbumDetailFragmentTest.kt — refactorizado con Faker + 3 tests:

  • testFullAlbumDetailFlow — Flujo completo: navegación, datos, "Ver más/menos", tracklist (datos generados con Faker)
  • testEmptyAlbumDetail — Álbum con descripción vacía y sin tracks (caso límite)
  • testAlbumDetailErrorCharge — API retorna error 404, muestra mensaje de error

2. Pruebas Sprint 2: Nuevas Historias de Usuario

2.1 HU03 — Consultar listado de artistas

Archivo: app/src/androidTest/java/com/misw/app/MusicianListTest.kt

Tests Implementados (5 tests):

# Nombre Tipo Descripción Resultado
1 testVisibilityOfAllComponents Positivo Verifica barra de búsqueda, botón de orden y RecyclerView visibles ✅ Pass
2 testEmptyResponseShowsEmptyState Negativo API retorna [], se muestra estado vacío con mensaje "No se encontraron artistas" ✅ Pass
3 testError500ShowsErrorMessage Negativo API retorna 500, se muestra mensaje de error genérico ✅ Pass
4 testSearchFiltering Positivo Filtra por "Freddie" y verifica que aparece en lista ✅ Pass
5 testToggleSortOrder Positivo Verifica orden A→Z y Z→A con botón toggle ✅ Pass

Cobertura de escenarios:

  • ✅ Flujo feliz (visualización, búsqueda, ordenamiento)
  • ✅ Escenario negativo: respuesta vacía del servidor
  • ✅ Escenario negativo: error HTTP 500

2.2 HU04 — Consultar detalle de artista

Archivo: app/src/androidTest/java/com/misw/app/MusicianDetailFragmentTest.kt

Tests Implementados (8 tests):

# Nombre Tipo Descripción Resultado
1 testMusicianNameVisualization Positivo Nombre del músico visible y correcto ✅ Pass
2 testMusicianDescriptionVisualization Positivo Descripción visible y no vacía ✅ Pass
3 testMusicianBirthdateVisualization Positivo Fecha de nacimiento visible ✅ Pass
4 testMusicianNoPrizesVisualization Borde Músico sin premios muestra "Sin premios" ✅ Pass
5 testMusicianPrizesVisualization Positivo Músico con premios muestra nombre del premio ("Grammy Award") ✅ Pass
6 testAlbumListVisualization Positivo Lista de álbumes del artista con búsqueda, ordenamiento y contenido ✅ Pass
7 testEmptyAlbumListEdgeCase Borde Artista sin álbumes muestra RecyclerView vacío (0 children) ✅ Pass
8 testErrorLoadingMusicianDetail Negativo API retorna 500, se muestra estado de error y se oculta contenido ✅ Pass

Cobertura de escenarios:

  • ✅ Todos los campos de datos del artista
  • ✅ Premios (con y sin premios)
  • ✅ Álbumes asociados (con y sin álbumes)
  • ✅ Error de carga desde API

Finding reportado respecto a pruebas exploratorias en la navegación detalle de un artista


2.3 HU05 — Consultar listado de coleccionistas

Archivo: app/src/androidTest/java/com/misw/app/CollectorListTest.kt

Tests Implementados (7 tests):

# Nombre Tipo Descripción Resultado
1 testVisibilityOfAllComponents Positivo Barra de búsqueda y RecyclerView visibles ✅ Pass
2 testSearchFiltering Positivo Buscar "Manolo Bellon" filtra correctamente ✅ Pass
3 testSearchNoResults Negativo Búsqueda con texto Faker inexistente muestra estado vacío ✅ Pass
4 testEmptyListFromServer Negativo API retorna [], se muestra mensaje apropiado ✅ Pass
5 testServerError Negativo API retorna 500, se muestra mensaje de error ✅ Pass
6 testSearchAndClearRestoresList Positivo Buscar y luego borrar restaura lista completa ✅ Pass
7 testRecyclerViewContent Positivo Scroll valida presencia de 3 coleccionistas específicos ✅ Pass

Cobertura de escenarios:

  • ✅ Flujo feliz completo (visualización, búsqueda, contenido)
  • ✅ Escenario negativo: búsqueda sin resultados
  • ✅ Escenario negativo: lista vacía del servidor
  • ✅ Escenario negativo: error HTTP 500
  • ✅ Restauración de estado al limpiar búsqueda

3. Infraestructura de Pruebas

3.1 MockWebServer

Todos los tests del Sprint 2 utilizan MockWebServer (OkHttp) para simular respuestas de la API:

private val mockWebServer = MockWebServer()

@Before
fun setup() {
    mockWebServer.start(0)
    RetrofitClient.setBaseUrl(mockWebServer.url("/").toString())
    CacheManager.getInstance(context).clearCache()
}

Beneficios:

  • Tests determinísticos (no dependen de API externa)
  • Posibilidad de simular errores HTTP (500, 404)
  • Respuestas controladas y predecibles
  • Independencia entre tests (cache limpio)

3.2 Faker (datos aleatorios)

Se utiliza JavaFaker para generar datos de prueba dinámicos:

  • Nombres de álbumes extremadamente largos (boundary testing)
  • Textos de búsqueda inexistentes (escenarios negativos)
  • Descripciones largas para probar "Ver más/Ver menos"

3.3 CacheManager en Tests

Cada test limpia el CacheManager antes de ejecutarse:

CacheManager.getInstance(context).clearCache()

Esto garantiza que los tests no se contaminen entre sí y que se ejecuten las rutas de red (cache miss).

3.4 Idling Resources

IdlingRegistry.getInstance().register(EspressoIdlingResource.countingIdlingResource)

Sincronización correcta entre operaciones asincrónicas (Retrofit/Coroutines) y assertions de Espresso.


4. Matriz de Cobertura TNT

Nivel          │ Tipo                              │ Técnica                                          │ Objetivo │ Estado
───────────────┼───────────────────────────────────┼──────────────────────────────────────────────────┼──────────┼────────
Aceptación     │ E2E, caja negra, +/-              │ Automatizada (Espresso + MockWebServer:           │ OB001    │ ✅
               │                                   │ escenarios +, - y borde para HU03, HU04, HU05)  │          │
───────────────┼───────────────────────────────────┼──────────────────────────────────────────────────┼──────────┼────────
Aceptación     │ E2E, caja negra, +/-              │ Automatizada (Espresso: robustecimiento HU01 y   │ OB001    │ ✅
               │                                   │ HU02 con negativos y límites del Sprint 1)       │          │
───────────────┼───────────────────────────────────┼──────────────────────────────────────────────────┼──────────┼────────
Sistema        │ Funcional, caja negra, +/-        │ Manual exploratoria (escenarios desde CA de      │ OB002    │ ✅
               │                                   │ HU03, HU04 y HU05)                              │          │
───────────────┼───────────────────────────────────┼──────────────────────────────────────────────────┼──────────┼────────
Sistema        │ Funcional, caja negra, +/-        │ Manual (verificación de ordenamiento, búsqueda,  │ OB002    │ ✅
               │                                   │ navegación, tipografía, presentación visual)     │          │
───────────────┼───────────────────────────────────┼──────────────────────────────────────────────────┼──────────┼────────
Sistema        │ No funcional, caja negra, +/-     │ Manual (ejecución de casos críticos y prioridad  │ OB003    │ ✅
               │                                   │ media en matriz de dispositivos Android 13-16)   │          │
───────────────┼───────────────────────────────────┼──────────────────────────────────────────────────┼──────────┼────────
Sistema        │ No funcional, caja negra, +/-     │ Manual (ciclo de vida: background/foreground,    │ OB004    │ ✅
               │                                   │ rotación, persistencia de estado en HU01-HU05)   │          │
───────────────┼───────────────────────────────────┼──────────────────────────────────────────────────┼──────────┼────────
Sistema        │ No funcional, desempeño           │ Perfilamiento (Android Profiler: consumo de      │ OB004    │ ✅
               │                                   │ memoria y threads por HU, con y sin micro-opt.)  │          │
───────────────┼───────────────────────────────────┼──────────────────────────────────────────────────┼──────────┼────────
Sistema        │ Funcional, caja negra, negativa   │ Manual y automatizada (manejo de errores ante    │ OB005    │ ✅
               │                                   │ pérdida de red, errores HTTP 500/404, resp vacías)│         │

5. Métricas

Total de Tests Espresso Sprint 2:          30
├─ MusicianListTest:                        5  (HU03)
├─ MusicianDetailFragmentTest:              8  (HU04)
├─ CollectorListTest:                       7  (HU05)
├─ AlbumsListTest (robustecido):            7  (HU01 - mejora Sprint 1)
├─ AlbumDetailFragmentTest (robustecido):   3  (HU02 - mejora Sprint 1)
└─ HomeFragmentTest:                        5  (Navegación general)
Sumados los de Sprint 1:                   35 tests total acumulado

Escenarios positivos:                      20
Escenarios negativos/error:                10
Escenarios de borde:                        5

Cobertura E2E estimada:                    ~92%
Cobertura de escenarios negativos:         100% de flujos de error

6. Resultados del Perfilamiento

6.1 Datos de Memoria por Dispositivo

Referencia: Perfilamiento y resultados.xlsx

HU Infinix (Android 13) Motorola G15 (Android 15) Samsung A15 (Android 16)
HU01 87.9→116.1 MB (+28.2) 94.9→132.8 MB (+37.9) 105.6→123.8 MB (+18.2)
HU02 109.5→123.4 MB (+13.9) 133→149.3 MB (+16.3) 129.6→142.9 MB (+13.3)
HU03 119.7→115.4 MB (-4.3) 111.5→116.2 MB (+4.7) 145.4→149.8 MB (+4.4)
HU04 113.8→116.6 MB (+2.8) 112.5→122.9 MB (+10.4) 165.5→152.6 MB (-12.9)
HU05 115.4→112.8 MB (-2.6) 114.7→113.5 MB (-1.2) 148.8→149.6 MB (+0.8)

Valores con micro-optimizaciones aplicadas

6.2 Análisis de Hilos

HU Infinix (Android 13) Motorola G15 (Android 15) Samsung A15 (Android 16)
HU01 43→51 (+8) 53→60 (+7) 55→65 (+10)
HU02 47→50 (+3) 60→59 (-1) 60→64 (+4)
HU03 47→49 (+2) 60→68 (+8) 60→68 (+8)
HU04 48→50 (+2) 63→70 (+7) 63→66 (+3)
HU05 47→51 (+4) 69→70 (+1) 66→67 (+1)

Valores con micro-optimizaciones aplicadas

6.3 Relación con Caching

El CacheManager contribuye a la estabilidad de memoria observada en HU03-HU05:

  • En HU03 y HU05 se observa reducción o estabilización de memoria en Android 13 (-4.3 MB, -2.6 MB), indicando que datos cacheados evitan asignaciones de memoria repetidas por llamadas de red.
  • Los hilos se mantienen estables en accesos repetidos (cache hits no generan coroutines adicionales).
  • Glide gestiona la memoria de imágenes con LRU, lo cual explica la reducción en pantallas de detalle cuando las imágenes ya están en caché.

7. Micro-optimizaciones Aplicadas

Referencia: micro_optimizaciones.md, PR #91

Las siguientes optimizaciones impactan directamente el rendimiento medido:

  1. Migración a ListAdapter + DiffUtil — Elimina notifyDataSetChanged(), reduce redibujados
  2. Gestión de Shimmer con Glide listener — Evita animaciones en vistas recicladas
  3. Diferenciación de IDs en includes — Corrige errores de binding
  4. Persistencia de estado en ViewModels — Query y ordenamiento sobreviven rotación y navegación
  5. Limpieza de recursos no usados — Reduce tamaño de APK

8. Conclusiones

8.1 Evaluación por Objetivo

Objetivo Criterio Resultado
OB001 ≥85% CA cubiertos con Espresso para HU03, HU04, HU05 ✅ ~92% cobertura, 20 tests nuevos
OB002 Pruebas manuales complementarias sobre HU03-HU05 ✅ Escenarios exploratorios ejecutados
OB003 Compatibilidad en matriz de 4 dispositivos (API 13-16) ✅ Perfilamiento en 3 dispositivos documentado
OB004 100% escenarios background/foreground con integridad ✅ ViewModels persisten estado correctamente
OB005 100% flujos de error offline/sin red informan al usuario ✅ Tests de error 500 y vacíos cubren manejo de errores

8.2 Evolución Sprint 1 → Sprint 2

Aspecto Sprint 1 Sprint 2
Tests Espresso 17 30 (+76%)
Escenarios negativos 0 10
Escenarios de borde 0 5
MockWebServer No Sí (todos los tests)
Faker (datos dinámicos) No
Manejo de errores API No cubierto 500, 404, vacío
CacheManager en tests No Limpieza entre tests
Historias cubiertas HU01, HU02 HU01-HU05

8.3 Resumen

El Sprint 2 logró:

  • Cobertura completa de HU03, HU04 y HU05 con escenarios positivos y negativos
  • Resolución de las 3 issues identificadas en Sprint 1
  • Robustecimiento de las pruebas existentes con casos de error y borde
  • Infraestructura de pruebas más robusta (MockWebServer, Faker, cache management)
  • Validación de perfilamiento en múltiples dispositivos Android