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 apropiadotestServerError— API retorna error 500, se muestra mensaje de errortestSearchAndClearRestoresList— 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:
- Migración a ListAdapter + DiffUtil — Elimina
notifyDataSetChanged(), reduce redibujados - Gestión de Shimmer con Glide listener — Evita animaciones en vistas recicladas
- Diferenciación de IDs en includes — Corrige errores de binding
- Persistencia de estado en ViewModels — Query y ordenamiento sobreviven rotación y navegación
- 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 | Sí |
| 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