Las pruebas o tests unitarios nos permiten verificar de forma ágil y segura que nuestra app hace lo que debe hacer. Para verificarlo se basa en los casos de prueba que hayamos definido previamente.
Normalmente se usan para verificar pruebas de regresión, es decir, que nuestra app sigue haciendo lo que antes hacía tras incorporar los nuevos cambios. Es importante tenerlo en cuenta porque Apple puede rechazar una actualización de nuestra app debido a que ésta produzca errores no controlados que podríamos evitar con estas pruebas.
Las pruebas unitarias son la base para el desarrollo guiado por pruebas o Test-Driven Development (TDD), que es un estilo de programación que impone la creación de los casos de prueba con antelación al código que va a ser verificado.
En Xcode existen principalmente dos tipos de pruebas unitarias:
- Pruebas unitarias lógicas: verifican el correcto funcionamiento de un fragmento de código de forma independiente.
- Pruebas unitarias de aplicación: verifican el correcto funcionamiento de fragmentos de código dentro del contexto de nuestra app, y verificar funcionalidades específicas de un dispositivo, como el uso de la geolocalización, acelerómetro, etc.
Los casos de pruebas deben ser:
- Automatizables: que no requieran intervención humana para su verificación.
- Completas: deben cubrir el mayor código posible, es decir que debemos tener casos de prueba que cubran cuántos más métodos de nuestra app mejor.
- Repetibles: un caso de prueba no debe tener ninguna dependencia que impida ser ejecutado varias veces con el mismo resultado.
- Independencia: un caso de prueba no puede depender del resultado de otro caso.
Tan necesarias son las pruebas unitarias como lo es la práctica de la integración continua.
La integración continua consiste en tener un proceso automatizado en el que, después de que cada developer suba código al repositorio, se obtiene la última versión, se compila, se ejecutan el conjunto de pruebas unitarias seleccionado, y se dejan los binarios/resultados en una ubicación conocida.
Con la integración continua evitaríamos el posible problema de que no compile o que de repente fallen funcionalidades dependientes de referencias externas, nos ahorraría tiempo en los desarrollos y nos permitiría centrarnos en lo importante de la aplicación: su funcionalidad.
Existen dos sistemas de integración continua:
- Travis CI: especialmente diseñado para construir y testear proyectos en Github de forma automática.
- Jenkins: es gratuito, open-source y actualmente uno de los más empleados para esta función. Además es muy fácil de utilizar y permite actualizaciones fáciles.
Todos esto lo puedes profundizar en el siguiente workshop “TESTING, PROTOCOLOS Y EXTENSIONES”, impartido por Alberto Irurueta y Alejandro García, que se hizo con el objetivo de:
- Entender el funcionamiento de los protocolos
- Aprender a crear tests unitarios
- Generar informes de resultados de tests y de cobertura de código
- Integración continua (Travis vs. Jenkins)
Puedes descargar la presentación aquí.