¿Qué son las pruebas de instrumentación?
Las pruebas de instrumentación permiten validar los eventos visuales dentro de las aplicaciones Android. A diferencia de las pruebas unitarias, estas utilizan el framework Expresso proporcionado por Android. Expresso ofrece acceso a las vistas, permitiendo acciones comunes como hacer clic, realizar scroll, swipe up y swipe down.
Este tipo de prueba se ejecuta en un emulador, lo cual implica algunas consideraciones:
- Requiere acceso a la interfaz gráfica: Se necesita el sistema operativo de Android, Expresso y un emulador para acceder a elementos visuales como botones y pantallas.
- Velocidad de ejecución moderada: Aunque las pruebas automatizadas son más rápidas que las manuales, estas pueden ser más lentas debido a la ejecución en un entorno de Android.
- Consumo de memoria: Requiere varios recursos del sistema y puede ser más exigente en términos de procesamiento.
Estas pruebas son esenciales para validar la parte media de la pirámide de pruebas, abarcando eventos visuales y logrando una alta cobertura de testeo en las aplicaciones.
¿Cómo se utilizan las pruebas end-to-end?
Las pruebas end-to-end (E2E) son fundamentales para validar todo el flujo de usuario, desde el inicio del proceso hasta su finalización. Ejemplos claros incluyen escenarios completos como el inicio de sesión, hacer una compra, o agregar ítems a un carrito y proceder al pago.
Un framework destacado para las pruebas E2E es Appium. Este framework ofrece varias ventajas:
- Versatilidad de lenguaje: Las pruebas pueden escribirse en distintos lenguajes como Python, Kotlin o Java.
- Multiplataforma: Permite escribir un script que funcione tanto en Android como en iOS, siempre que la aplicación se comporte igual en ambas plataformas.
- Ejecución automatizada: Se describe el flujo de interacción con el dispositivo, que puede hacerse tanto en emuladores como en dispositivos físicos.
Un equipo de automatización suele encargarse de estas pruebas, manteniendo un repositorio separado. Las pruebas E2E requieren más procesamiento debido a la validación de flujos completos.
¿Cuál es el papel del manual testing?
El manual testing sigue siendo vital para validar ciertos aspectos de una aplicación que no pueden ser automatizados, como las animaciones y las transiciones visuales. Estas pruebas dependen del juicio humano y abordan experiencias de usuario más subjetivas.
Por ahora, algunas cosas como las animaciones no se pueden automatizar, por lo que el testing manual complementa a los otros tipos de prueba automatizados. Permite verificar que estas experiencias visuales cumplan con las expectativas de los usuarios y mantengan la esencia visual de la aplicación.
¿Cómo se realiza una prueba unitaria con JUnit 5?
El desarrollo de pruebas unitarias con JUnit 5 es crucial para verificar funciones individuales dentro de una aplicación. Usando un ejemplo de implementación de un repositorio, podemos resaltar algunos pasos clave al crear una prueba unitaria:
- Setup de dependencias: Inicializa las dependencias necesarias para la prueba. Esto incluye dependencias de base de datos o remotas que deben ser configuradas antes de las pruebas.
@Before
fun setup() {
databaseDependency = DatabaseDependencyMock()
remoteDependency = RemoteDependencyMock()
repository = CoursesRepositoryImplementation(databaseDependency, remoteDependency)
}
-
Uso de interfaces y mocks: Se utilizan clases mock para simular el comportamiento de dependencias reales, permitiendo un control total sobre el entorno en el que funciona la prueba.
-
Estructura given-when-then:
- Given: Establecimiento de las condiciones iniciales.
- When: Ejecución del comportamiento que se desea testear.
- Then: Verificación de la salida o comportamiento esperado.
@Test
fun testObtenerListadoDeCursosSinConexion() {
val cursos = repository.obtenerCursos()
assertFalse(cursos.isEmpty(), "Debería obtener cursos del almacenamiento local.")
}
- Ejecución y revisión: Asegúrese de que el código pueda compilarse correctamente antes de ejecutar pruebas. La ejecución se puede realizar en modo normal o en modo debug para realizar análisis detallados. Además, valide los resultados esperados para identificar posibles errores en la lógica.
Con estas metodologías bien implementadas, las pruebas unitarias ofrecen un blindaje robusto que puede ayudar a garantizar que los cambios en el código no introduzcan errores inesperados.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?