Inventario de pruebas 3 - sjfuentes-uniandes/ing-sw-app-moviles GitHub Wiki
Historia de Usuario: HU-008
Funcionalidad: Agregar Track a un Álbum
Versión del documento: 1.0
Fecha: 29 de Noviembre de 2025
La historia de usuario HU-008 permite a los coleccionistas agregar nuevas canciones (tracks) a un álbum existente en su catálogo. La funcionalidad incluye:
- Navegación desde el detalle de un álbum hacia un formulario de creación de track
- Captura de datos del track: nombre de la canción y duración
- Validación de campos obligatorios y formato de duración (M:SS o MM:SS)
- Persistencia del track mediante integración con API REST
- Confirmación visual del éxito de la operación
- Actualización de la lista de tracks en el detalle del álbum
Las pruebas de UI con Espresso para HU-008 tienen los siguientes objetivos:
- Validar el flujo de navegación completo desde la lista de álbumes hasta la pantalla de agregar track y viceversa
- Verificar la presencia y correcta visualización de todos los elementos de interfaz
- Comprobar las validaciones de campos obligatorios y formatos de entrada
- Asegurar la integración correcta con el backend para la persistencia de datos
- Detectar regresiones en funcionalidades relacionadas (navegación, detalle de álbum)
- Establecer una línea base de calidad automatizada para futuros cambios
ID: TC-HU008-001
Descripción: Verificar la navegación desde la lista de álbumes hasta la pantalla de agregar track
Precondiciones:
- Aplicación instalada en el dispositivo de prueba
- Backend accesible y con datos de prueba
- Al menos un álbum disponible en el catálogo
Pasos:
- Iniciar la aplicación
- Navegar a la pestaña "Albums"
- Esperar la carga completa de la lista de álbumes
- Seleccionar el primer álbum de la lista
- Verificar que se muestra el detalle del álbum
- Verificar que el botón FAB de agregar track está visible
- Pulsar el botón FAB
- Verificar que se abre la pantalla de agregar track
Resultado Esperado:
- La pantalla de agregar track se muestra correctamente
- Todos los elementos de la interfaz están presentes: imagen del álbum, nombre del álbum, campos de entrada, botón "Save Song"
Estado: ✅ PASS
ID: TC-HU008-002
Descripción: Validar que todos los elementos de la pantalla de agregar track están presentes y visibles
Precondiciones:
- Usuario ubicado en la pantalla de agregar track
Pasos:
- Verificar presencia de imagen del álbum (ImageView)
- Verificar presencia del nombre del álbum (TextView)
- Verificar presencia del campo "Nombre de la canción" (EditText)
- Verificar presencia del campo "Duración" (EditText)
- Verificar presencia del botón "Save Song" (Button)
Resultado Esperado:
- Todos los elementos están presentes y visibles en pantalla
- Los campos de entrada tienen hints apropiados
- El botón tiene el texto correcto según strings.xml
Estado: ✅ PASS
ID: TC-HU008-003
Descripción: Verificar que no se puede guardar un track sin llenar los campos obligatorios
Precondiciones:
- Usuario en la pantalla de agregar track
- Campos de formulario vacíos
Pasos:
- Dejar ambos campos vacíos (nombre y duración)
- Pulsar el botón "Save Song"
- Verificar que no se navega a otra pantalla
- Verificar que los campos siguen visibles
Resultado Esperado:
- La validación previene el guardado
- Usuario permanece en la pantalla de agregar track
- No se realiza llamada al backend
Estado: ✅ PASS
ID: TC-HU008-004
Descripción: Comprobar que se rechaza un formato de duración inválido
Precondiciones:
- Usuario en la pantalla de agregar track
Pasos:
- Ingresar un nombre válido en el campo "Nombre de la canción" (ej: "Test Track")
- Ingresar un formato de duración inválido (ej: "999", "abc", "12:999")
- Pulsar el botón "Save Song"
- Verificar que la validación falla
Resultado Esperado:
- El track no se guarda
- Usuario permanece en la pantalla de agregar track
- La validación detecta el formato incorrecto
Estado: ✅ PASS
ID: TC-HU008-005
Descripción: Validar el flujo exitoso de agregar un track con datos correctos
Precondiciones:
- Usuario en la pantalla de agregar track
- Backend disponible
Pasos:
- Ingresar nombre de track: "Espresso Test Track"
- Ingresar duración válida: "3:45"
- Pulsar el botón "Save Song"
- Esperar confirmación visual (Snackbar)
- Verificar regreso al detalle del álbum
Resultado Esperado:
- El track se guarda exitosamente en el backend
- Se muestra un Snackbar con mensaje de éxito
- Navegación automática de regreso al detalle del álbum
- El nuevo track aparece en la lista de tracks del álbum
Estado: ✅ PASS
ID: TC-HU008-006
Descripción: Verificar que el botón de regreso funciona correctamente
Precondiciones:
- Usuario en la pantalla de agregar track
Pasos:
- Pulsar el botón de navegación "back" del sistema
- Verificar que regresa al detalle del álbum
- Verificar que los elementos del detalle están visibles
Resultado Esperado:
- Navegación correcta al detalle del álbum
- Estado de la pantalla anterior se mantiene
- Botón FAB visible nuevamente
Estado: ❌ FAIL (requiere corrección - ver sección 5.1)
ID: TC-HU008-007
Descripción: Comprobar que la lista de tracks se muestra en el detalle del álbum
Precondiciones:
- Álbum seleccionado tiene al menos un track
Pasos:
- Navegar al detalle de un álbum
- Esperar carga completa
- Verificar presencia del RecyclerView de tracks
- Verificar visibilidad del header "Tracks"
Resultado Esperado:
- RecyclerView de tracks está visible
- Header "Tracks" se muestra correctamente
- Lista contiene al menos un elemento si el álbum tiene tracks
Estado: ❌ FAIL (timing issue - ver sección 5.1)
ID: TC-HU008-008
Descripción: Verificar que el botón FAB aparece en el detalle de todos los álbumes
Precondiciones:
- Al menos 3 álbumes disponibles en el catálogo
Pasos:
- Navegar al detalle del primer álbum
- Verificar presencia del FAB
- Regresar a la lista
- Navegar al detalle del segundo álbum
- Verificar presencia del FAB
- Regresar a la lista
- Navegar al detalle del tercer álbum
- Verificar presencia del FAB
Resultado Esperado:
- El botón FAB está presente en todos los detalles de álbum
- El comportamiento es consistente
Estado: ✅ PASS
ID: TC-HU008-009
Descripción: Validar que los textos y etiquetas son correctos según localización
Precondiciones:
- Usuario en la pantalla de agregar track
Pasos:
- Verificar texto del botón "Save Song" según strings.xml
- Verificar hints de los campos de entrada
- Verificar que el nombre del álbum se muestra correctamente
Resultado Esperado:
- Todos los textos coinciden con los definidos en strings.xml
- La localización es correcta
- No hay textos hardcodeados
Estado: ✅ PASS
ID: TC-HU008-010
Descripción: Verificar que se aceptan diferentes formatos válidos de duración
Precondiciones:
- Usuario en la pantalla de agregar track
Pasos:
- Ingresar nombre: "Edge Case Track"
- Ingresar duración en formato M:SS: "5:30"
- Guardar track
- Verificar éxito
Resultado Esperado:
- El formato M:SS se acepta correctamente
- El track se guarda exitosamente
- Navegación de regreso funciona
Estado: ✅ PASS
ID: TC-HU008-011
Descripción: Comprobar que no se acepta un nombre con solo espacios
Precondiciones:
- Usuario en la pantalla de agregar track
Pasos:
- Ingresar solo espacios en el campo nombre: " "
- Ingresar duración válida: "3:00"
- Intentar guardar
- Verificar que la validación falla
Resultado Esperado:
- La validación detecta espacios vacíos
- El track no se guarda
- Usuario permanece en la pantalla
Estado: ✅ PASS
ID: TC-HU008-012
Descripción: Verificar estabilidad al navegar múltiples veces entre pantallas
Precondiciones:
- Usuario en detalle de álbum
Pasos:
- Abrir pantalla de agregar track (FAB)
- Regresar con botón back
- Volver a abrir pantalla de agregar track
- Verificar que todo funciona correctamente
Resultado Esperado:
- Navegación múltiple funciona sin errores
- Estado de las pantallas se mantiene
- No hay memory leaks o crashes
Estado: ❌ FAIL (timing issue - ver sección 5.1)
ID: TC-HU008-013
Descripción: Validar que el nombre del álbum se muestra en la pantalla de agregar track
Precondiciones:
- Usuario en pantalla de agregar track desde un álbum conocido
Pasos:
- Verificar que el TextView del nombre del álbum está visible
- Verificar que contiene texto (no está vacío)
Resultado Esperado:
- El nombre del álbum es visible
- Proporciona contexto al usuario sobre qué álbum está editando
Estado: ✅ PASS
ID: TC-HU008-014
Descripción: Verificar que se pueden agregar varios tracks seguidos
Precondiciones:
- Usuario en detalle de álbum
- Backend disponible
Pasos:
- Agregar primer track: "Track 1", "3:00"
- Esperar regreso al detalle
- Abrir nuevamente pantalla de agregar track
- Agregar segundo track: "Track 2", "4:15"
- Verificar regreso al detalle
Resultado Esperado:
- Ambos tracks se agregan exitosamente
- No hay conflictos entre operaciones consecutivas
- Lista de tracks se actualiza cada vez
Estado: ✅ PASS
ID: TC-HU008-015
Descripción: Comprobar que la lista de tracks se actualiza después de agregar uno nuevo
Precondiciones:
- Álbum con tracks existentes
Pasos:
- Navegar al detalle del álbum
- Observar número de tracks actual
- Agregar un nuevo track: "New Test Track", "2:30"
- Verificar regreso al detalle
- Verificar que el RecyclerView está visible
Resultado Esperado:
- La lista de tracks sigue visible después de agregar
- El nuevo track aparece en la lista (requiere refresh o recarga)
Estado: ✅ PASS
ID: TC-HU008-016
Descripción: Validación de otros casos límite no cubiertos anteriormente
Precondiciones:
- Variadas según sub-caso
Casos incluidos:
- Duración con segundos en límite superior (59)
- Nombres de tracks muy largos
- Caracteres especiales en nombres
Resultado Esperado:
- Comportamiento robusto ante diferentes entradas
- Validaciones apropiadas funcionan
Estado: ✅ PASS
Las pruebas de Espresso para HU-008 están implementadas en el paquete:
app/src/androidTest/java/com/example/vinilos/HU-008-AgregarTrack/
Este paquete contiene dos clases principales de prueba:
Clase enfocada en validar el flujo principal de la funcionalidad:
Responsabilidades:
- Navegación completa desde álbumes hasta agregar track
- Verificación de elementos UI
- Validaciones de formulario (campos vacíos, formato inválido)
- Flujo exitoso de agregar track
- Navegación de regreso
- Visualización de lista de tracks
Características técnicas:
- Anotación
@LargeTestpara pruebas de integración - Uso de
ActivityScenarioRulepara gestión del ciclo de vida - Implementación de
ViewActionpersonalizado para clicks en RecyclerView - Esperas explícitas con
Thread.sleep()para sincronización con backend
Número de tests: 7
Clase enfocada en pruebas de reconocimiento y edge cases:
Responsabilidades:
- Reconocimiento de elementos en múltiples contextos
- Validación de labels y hints
- Edge cases (formatos límite, espacios, navegación múltiple)
- Operaciones consecutivas
Características técnicas:
- Patrón similar a
AddTrackFlowTest - Mayor énfasis en iteraciones y casos límite
- Reutilización de métodos auxiliares
Número de tests: 9
@Rule
@JvmField
var activityRule = ActivityScenarioRule(MainActivity::class.java)Utiliza ActivityScenarioRule para:
- Iniciar automáticamente la
MainActivity - Gestionar el ciclo de vida de la Activity
- Limpiar recursos después de cada test
-
withId(): Localización de vistas por ID de recurso -
withText(): Verificación de textos -
isDisplayed(): Validación de visibilidad -
isCompletelyDisplayed(): Verificación de visibilidad completa (sin recortes)
-
click(): Simulación de clicks -
typeText(): Ingreso de texto en campos -
closeSoftKeyboard(): Cierre del teclado virtual -
clearText(): Limpieza de campos de texto -
scrollTo(): Scroll hacia elementos no visibles
onView(withId(R.id.viewId))
.check(matches(isDisplayed()))Patrón estándar de verificación:
- Localizar vista con
onView() - Aplicar assertion con
.check() - Usar matcher con
matches()
Método helper que encapsula la navegación completa:
private fun navigateToAddTrackScreen() {
onView(withId(R.id.navigation_albums)).perform(click())
Thread.sleep(3000)
onView(withId(R.id.albumsRv))
.perform(clickOnRecyclerViewItem(0))
Thread.sleep(2000)
onView(withId(R.id.fabAddTrack)).perform(click())
Thread.sleep(1000)
}Propósito: Reducir duplicación de código en tests que requieren estar en la pantalla de agregar track.
ViewAction personalizado para interactuar con RecyclerView:
private fun clickOnRecyclerViewItem(position: Int): ViewAction {
return object : ViewAction {
override fun getConstraints(): Matcher<View> {
return isAssignableFrom(RecyclerView::class.java)
}
override fun perform(uiController: UiController, view: View) {
val recyclerView = view as RecyclerView
val viewHolder = recyclerView.findViewHolderForAdapterPosition(position)
viewHolder?.itemView?.performClick()
}
}
}Propósito: Hacer click en items de RecyclerView sin depender de espresso-contrib.
Las pruebas utilizan esperas explícitas debido a:
- Carga de datos desde backend: El backend puede estar en cold start
- Animaciones de navegación: Transiciones entre fragments requieren tiempo
- Renderizado de RecyclerView: Poblado de listas requiere espera
Tiempos de espera utilizados:
- 3000ms: Carga de listas desde backend
- 2000ms: Navegación y carga de detalles
- 1000ms: Transiciones simples
Mejora futura: Implementar IdlingResources para esperas más inteligentes.
- Android Studio: Arctic Fox (2020.3.1) o superior
- Gradle: 8.12
- Android Gradle Plugin (AGP): 8.7.3
- Kotlin: 2.0.21
- JDK: Java 11 o superior
-
Dispositivo físico o emulador con:
- Android API Level 24 (Android 7.0) mínimo
- API Level 35 (Android 15) recomendado
- Modo de desarrollador activado
- Depuración USB habilitada (para dispositivos físicos)
- Acceso a Internet requerido
- Backend accesible: https://vinilos-backend-5f9h.onrender.com/
- Datos de prueba: Al menos un álbum disponible en el catálogo
-
En el Project Explorer, navegar a:
app/src/androidTest/java/com/example/vinilos/HU-008-AgregarTrack/ -
Clic derecho en la carpeta
HU-008-AgregarTrack -
Seleccionar: "Run 'Tests in 'HU-008-AgregarTrack''"
-
Seleccionar dispositivo/emulador de destino
-
Esperar resultados en la ventana "Run"
-
Abrir el archivo
AddTrackFlowTest.ktoAddTrackRecognitionTest.kt -
Hacer clic en el ícono verde (
▶️ ) junto al nombre de la clase -
Seleccionar: "Run 'AddTrackFlowTest'"
-
Ubicar el método de test específico (ej:
addTrack_withValidData_succeeds()) -
Hacer clic en el ícono verde junto al método
-
Seleccionar: "Run 'addTrack_withValidData_succeeds'"
# En la raíz del proyecto
./gradlew connectedAndroidTestResultado: Ejecuta TODAS las pruebas de instrumentación del proyecto (todas las HU).
# Opción 1: Ejecutar una clase específica
adb shell am instrument -w -r -e class \
'com.example.vinilos.HU_008_AgregarTrack.AddTrackFlowTest' \
com.example.vinilos.test/androidx.test.runner.AndroidJUnitRunner
# Opción 2: Ejecutar ambas clases de HU-008
adb shell am instrument -w -r -e package \
'com.example.vinilos.HU_008_AgregarTrack' \
com.example.vinilos.test/androidx.test.runner.AndroidJUnitRunneradb shell am instrument -w -r -e class \
'com.example.vinilos.HU_008_AgregarTrack.AddTrackFlowTest#addTrack_withValidData_succeeds' \
com.example.vinilos.test/androidx.test.runner.AndroidJUnitRunner# Todas las pruebas de instrumentación
.\gradlew connectedAndroidTest
# Solo pruebas de HU-008 (usando adb)
$ADB = "C:\Users\[usuario]\AppData\Local\Android\Sdk\platform-tools\adb.exe"
& $ADB shell am instrument -w -r -e package `
'com.example.vinilos.HU_008_AgregarTrack' `
com.example.vinilos.test/androidx.test.runner.AndroidJUnitRunnerEl proyecto utiliza AndroidJUnitRunner como test runner predeterminado.
Configuración en build.gradle.kts:
android {
defaultConfig {
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
}No requiere configuración adicional para ejecutar las pruebas de HU-008.
Después de la ejecución, Gradle genera reportes HTML en:
app/build/reports/androidTests/connected/debug/index.html
Contenido del reporte:
- Resumen de tests ejecutados, pasados y fallidos
- Tiempo de ejecución por test
- Stack traces detallados de fallos
- Screenshots (si están configurados)
Formato JUnit XML compatible con Jenkins, GitLab CI, etc.:
app/build/outputs/androidTest-results/connected/
Durante la ejecución, se muestran logs en tiempo real:
> Task :app:connectedDebugAndroidTest
Starting 16 tests on CPH2699 - 15
CPH2699 - 15 Tests 1/16 completed. (0 skipped) (0 failed)
CPH2699 - 15 Tests 2/16 completed. (0 skipped) (0 failed)
...
Fecha de última ejecución: 29 de Noviembre de 2025
Dispositivo utilizado: Oppo Reno 13F (CPH2699) - Android 15
Tiempo total de ejecución: 4 minutos 1 segundo
| Métrica | Valor |
|---|---|
| Tests ejecutados | 16 |
| Tests pasados | 12 |
| Tests fallidos | 4 |
| Tests omitidos | 0 |
| Tasa de éxito | 75% |
- Total: 7 tests
- Pasados: 5 (71.4%)
- Fallidos: 2
- Total: 9 tests
- Pasados: 7 (77.8%)
- Fallidos: 2 (incluyendo 1 compartido con AddTrackFlowTest)
Test afectado: addTrackScreen_backButton_navigatesToAlbumDetail()
Severidad: Media
Estado: Identificada - Requiere corrección
Descripción:
El test intenta hacer click en toolbar para regresar, pero el selector es demasiado genérico y no encuentra el elemento correcto después de la navegación.
Causa raíz:
Uso de selector withId(R.id.toolbar) en lugar de pressBack() o withId(R.id.btnBack).
Solución propuesta:
// Cambiar:
onView(withId(R.id.toolbar)).perform(click())
// Por:
Espresso.pressBack()Impacto: No afecta la funcionalidad, solo la prueba automatizada.
Test afectado: albumDetail_displaysTracksList()
Severidad: Baja
Estado: Identificada - Timing issue
Descripción:
El RecyclerView de tracks puede no estar completamente visible cuando se ejecuta la verificación, causando que falle la assertion de isDisplayed().
Causa raíz:
- El RecyclerView puede estar fuera del viewport inicial
- Timing entre carga de datos y renderizado de UI
- Falta de scroll antes de la verificación
Solución propuesta:
// Agregar scroll o espera:
Thread.sleep(1000)
onView(withId(R.id.tracksRecyclerView))
.perform(scrollTo())
.check(matches(isDisplayed()))Impacto: Menor - El RecyclerView funciona correctamente en uso real.
Test afectado: navigation_multipleNavigations_workCorrectly()
Severidad: Baja
Estado: Identificada - Timing issue
Descripción: Después de múltiples navegaciones rápidas, el FAB puede no estar visible inmediatamente al regresar al detalle del álbum.
Causa raíz:
Tiempo insuficiente de espera después de navegación pressBack().
Solución propuesta:
// Aumentar tiempo de espera:
Espresso.pressBack()
Thread.sleep(2000) // Era 1000ms
onView(withId(R.id.fabAddTrack)).check(matches(isDisplayed()))Impacto: Cosmético - No afecta uso real.
Test afectado: AlbumDetailFlowTest.navigateToAlbumDetail_and_backToList (de otra HU)
Severidad: Media
Estado: Identificada - Requiere actualización
Descripción:
Los cambios de layout de HU-008 (eliminación del label descriptionLabel en detalle de álbum) afectaron tests de HU-02.
Acción requerida:
Actualizar tests de HU-02 para reflejar el nuevo layout sin descriptionLabel.
Impacto: No afecta HU-008 directamente, pero requiere coordinación entre equipos.
| Incidencia | Prioridad | Estado | ETA |
|---|---|---|---|
| Navegación con Toolbar | Alta | Pendiente | Sprint actual |
| Visibilidad RecyclerView | Media | Pendiente | Sprint actual |
| Navegación Múltiple | Baja | Pendiente | Próximo sprint |
| Impacto HU-02 | Alta | Pendiente | Sprint actual |
A pesar de los 4 tests fallidos, la funcionalidad HU-008 opera correctamente según:
- ✅ Validación manual: Todos los flujos funcionan en dispositivo real
- ✅ 12 de 16 tests pasaron: 75% de cobertura automatizada exitosa
- ✅ Fallos son de prueba, no de funcionalidad: Problemas de timing/selectores
- ✅ Validaciones core pasaron: Campos vacíos, formato, guardado exitoso
Conclusión: HU-008 está lista para producción. Las correcciones de tests son recomendadas pero no bloqueantes.
- Cobertura automatizada establecida: 16 casos de prueba cubren el flujo completo de HU-008
- Funcionalidad validada: El flujo principal de agregar tracks funciona correctamente
- Calidad de código: Tests bien estructurados siguiendo patrones del proyecto
- Fallos menores identificados: Problemas de timing y selectores, fácilmente corregibles
⚠️ Corregir los 4 tests fallidos según soluciones propuestas (estimado: 2-3 horas)⚠️ Actualizar tests de HU-02 para compatibilidad con nuevos layouts⚠️ Re-ejecutar suite completa después de correcciones
-
Implementar IdlingResources: Eliminar
Thread.sleep()con esperas basadas en estado de la aplicación - Agregar tests de performance: Medir tiempos de respuesta y detectar regresiones
- Screenshots automáticos: Capturar pantallas en fallos para debugging más rápido
- Integración CI/CD: Ejecutar tests automáticamente en cada Pull Request
- Timing es crítico: Backend en cold start requiere esperas generosas
-
Selectores específicos: Usar IDs específicos en lugar de clases genéricas como
toolbar - RecyclerView requiere scroll: No asumir visibilidad automática de items
- Impacto cross-HU: Cambios de layout pueden afectar tests de otras historias
-
Pruebas:
app/src/androidTest/java/com/example/vinilos/HU-008-AgregarTrack/ -
Código fuente:
app/src/main/java/com/example/vinilos/ui/albums/ -
Layouts:
app/src/main/res/layout/fragment_add_track.xml -
Strings:
app/src/main/res/values/strings.xml
Historia de Usuario: HU-006
Funcionalidad: Ver Detalle de Coleccionista
Versión del documento: 1.0
Fecha: 29 de Noviembre de 2025
La historia de usuario HU-006 permite a los usuarios visualizar la información detallada de un coleccionista específico seleccionado desde la lista principal. La funcionalidad incluye:
- Navegación desde el listado de coleccionistas hacia la vista de detalle
- Visualización de datos de contacto: Nombre completo, Teléfono y Email
- Visualización de la lista de álbumes favoritos asociados al coleccionista
- Navegación de regreso al listado general
Las pruebas de UI con Espresso para HU-006 tienen los siguientes objetivos:
- Validar el flujo de navegación desde la pestaña de coleccionistas hasta el detalle individual
- Verificar la presencia y correcta visualización de los datos del coleccionista (Email, Teléfono)
- **Comprobar la carga de la lista de álbum