Introducción al Testing en Swift
Introducción al Testing en Swift

Introducción CURSO TESTING en SWIFT (Parte 1)

¿Cómo crear tests en Swift?¿Por qué son importantes los tests en Swift? ¿Qué beneficios hay? Estas preguntas te las respondo en esta pequeña introducción al Testing en Swift. Creamos una app desde cero en SwiftUI y luego añadimos Unit Tests, Integration Tests, Snapshot Tests y UITests.

SwiftBeta

Tabla de contenido


👇 SÍGUEME PARA APRENDER SWIFTUI, SWIFT, XCODE, etc 👇

Hoy en SwiftBeta vamos a iniciar la serie para aprender a crear nuestros primeros tests en Swift. Para que sea mucho más didáctico, práctico y divertido e incluso para que te sirva en tu portafolio para buscar trabajo vamos a crear una aplicación de notas, de lista de tareas (una TODO app) con todo lo nuevo de Apple, es decir vamos a crear una aplicación con Xcode 15, SwiftData y SwiftUI. Durante esta serie de Testing vamos a ver diferentes tipos de tests: Unit Tests, Integration Tests, Snapshot Tests y UI Tests. Cada uno tiene su propósito, y lo veremos paso por paso en este y los siguientes videos del canal.

Vamos a crear desde 0 esta aplicación, donde podemos crear, modificar y eliminar notas. Una vez creada nos centraremos en cubrir diferentes capas de testing, y para ello seguiremos la pirámide del testing, crearemos una base de Unit Tests, luego continuaremos con Test de Integración y más tarde abordaremos y crearemos Tests E2E. Cada uno los explicaré a su debido tiempo, pero te quería mostrar lo que vamos a cubrir en esta nueva serie. Y para darte más contexto:

  • Crearemos nuestra aplicación de tareas en SwiftUI
  • Añadiremos nuestros primeros Tests Unitarios
  • También añadiremos nuestros Tests de Integración
  • Explicaré qué son los mocks y crearemos varios ejemplos en nuestra aplicación
  • Resolveremos ejercicios de Tests Unitarios, de integración y mocks
  • Crearemos Snapshot Tests
  • Y finalmente crearemos tests End 2 End, tests de UI usando directamente Xcode.
Introducción al Testing en Swift y SwiftUI
Introducción al Testing en Swift y SwiftUI

Va a ser una serie de introducción muy sencilla pero realmente completa, iremos poco a poco evolucionando nuestra aplicación, primero guardaremos los datos en memoria y cuando abordemos los tests de integración añadiremos una capa extra llamada UseCases (casos de uso) para persistir la información usando SwiftData. Esta serie ten por seguro que te ayudará a defenderte en prueba técnicas y podrás aplicar todo lo aprendido dentro de tus aplicaciones.

Vamos a seguir con la introducción al testing en Swift y SwiftUI

¿Qué son los tests en Swift? ¿Para qué sirven?

Pero, ¿Qué son los tests? ¿Para qué sirven? Los tests son fundamentales para el desarrollo de nuestra aplicación, con ellos lo que hacemos es saber que nuestro código se comporta tal y como esperamos (o más bien nos permite detectar cuando nuestro código NO se comporta como esperamos). Con los tests añadimos calidad dentro del proceso de creación de nuestra aplicación, ya que si los tests son creados correctamente, podemos detectar bugs antes de que nuestra aplicación llegue a producción, es decir antes de que saquemos una nueva versión en el App Store (Y si te estás preguntando que es un bug, de forma muy simplificada, es un error o crash que se ha encontrado en alguna funcionalidad de tu aplicación).

Al crear una aplicación no puedes confiar solo en tu código (somos humanos y nos equivocamos) para ellos tienes que añadir tests para asegurarte que todo funciona como debería. Imagina que creas una aplicación de transferencias de dinero, aquí un usuario A le transfiere dinero al usuario B, al hacerlo la cuenta del usuario A se ha decrementado, y la cuenta del usuario B se ha incrementado. Puedes crear un test para comprobar que este es el comportamiento que ocurre al hacer una transferencia.

Si el usuario A tiene en su cuenta 100 Euros, y el usuario B tiene 200. Si el usuario A hace una transferencia al usuario B de 50 Euros, el usuario A pasa a tener en su cuenta 50 Euros y el usuario B pasa a tener 150 Euros

Puedes crear tests para verificar este comportamiento.

Beneficios de testear el código

Estamos acostumbrados a crear código de producción de nuestra aplicación, código que forma parte del bundle de nuestra aplicación, lo que al final acaba usando el usuario que descarga nuestra aplicación del App Store. Los tests siempre son algo secundario porque pensamos que no aportan valor, y que nos ralentizan pero es todo lo contrario:

  • Incrementan la confianza al modificar código que existe en tu aplicación: Al tener tests puedes modificar el cógido existente con la seguridad de que si algo se rompe, los tests te lo harán saber (fallaran)
  • Menos tiempo dedicado al debugging: Cuando un error se introduce en el código, puede ser muy difícil de encontrar y arreglar. Los tests permiten encontrar muchos de estos errores antes de que lleguen a producción. Además, cuando los tests fallan, suelen ofrecer pistas claras sobre qué es lo que va mal, facilitando la localización y correción del error.
  • Crear tests nos permite tener una documentación clara. Si miras un tests puedes ver de un simple vistazo qué hace un tipo o cómo se comporta, es un tipo de documentación "viva". Si otro developer quiere entender qué hace una parte del código puede mirar los tests para ver qué comportamiento se espera de esa parte del código.
  • Mejor diseño de Software:, al escribir tests, es posible que te encuentras con dificultades para testear ciertas partes del código. A menudo, esto es una señal de que ese código podría estar mejor diseñado.

Hay más beneficios, pero ya vas cogiendo una idea de la importancia de los tests.

Los tests cuanto más pequeños mejor, son más estables y en general menos dolorosos. Queremos tests que abarquen poco contenido y que lo que testeen lo testeen bien. Queremos tests deterministas, esto significa que aunque los ejecutes 1000 veces siempre te den el mismo resultado, todo lo contrario a los flaky tests, estos tests son costoso ya que fallan aleatoriamente y puedes perder mucho tiempo arreglándolos (esto puede deberse por fallos de conexión bbdd, peticiones http, etc).

Proceso de crear tests

Esta introducción sobre el testing en Swift está muy bien, pero, una vez tengo creados los tests, ¿cómo los ejecuto? ¿cada cuánto los ejecuto?. Los tests en Xcode se ejecutan con el atajo de teclado COMMAND+U, y a medida que desarrollamos nueva funcionalidad en nuestra aplicación debemos ir ejecutándolos en LOCAL para ver que todo funciona bien y no hemos roto ningún test. ¿Por qué menciono LOCAL? Porque los tests se pueden ejecutar en el entorno de desarrollo de tu máquina local, lo cual es muy útil durante el desarrollo de una nueva funcionalidad para verificar que todo funciona bien y que no hemos roto ningún test existente. Pero también se pueden ejecutar en REMOTO, en un servidor o en la nube, lo cual forma parte del proceso de Integración Continua (CI) y Despliegue Continuo (CD).

La integración contínua es una práctica del desarrollo del software en la que los developers integran su código en un repositorio (por ejemplo usando GIT, que lo veremos más adelante en el canal ya que es indispensable para todo developer). Imagina que has creado una nueva funcionalidad para tu aplicación, por ejemplo la funcionalidad de poder hacer trasancciones dentro de tu aplicación, en este caso harías:

  • Commit y Push de tu rama
  • Crearías una Pull Request para meter los cambios de tu rama en main (o como llames a tu rama principal), y justo en ese momento se ejecutarían ciertas pruebas, como por ejemplo, se ejecutarían todos los tests para detectar que los cambios que intentas meter en tu rama main son correctos y no rompen nada de la aplicación.
  • Si el control pasa, mergearías o harías rebase de tus cambios para introducirlos en main (tu rama principal).

Fíjate que en este caso los tests han sido los que nos han dicho que todo está OK y hemos mergeado tranquilamente los cambios, hemos integrado la nueva funcionalidad en main.

Y luego tenemos el despliegue contínuo, esta práctica nos proporciona poder sacar releases, sacar nuevas versiones de tu aplicación al App Store (este paso solo puede ocurrir si han pasado todos los checks correctamente, como por ejemplo que pasen todos los tests).

Y por último, antes de crear el proyecto en Xcode, mencionarte que existe la figura de QA en las empresas. De forma muy muy resumida, el QA se encarga de verificar que la aplicación funciona perfectamente y da luz verde para sacar nuevas versiones en el App Store.

Y ahora sí, ya estamos listos para crear nuestro proyecto en Xcode. Y es justo lo que haremos en el siguiente video.

Conclusión

Hoy hemos hecho un breve repaso a diferentes tipos de tests que podemos crear dentro de nuestra aplicación. Los tests nos aportan calidad a lo largo de nuestro desarrollo, y depende de nosotros escoger el grado de calidad que queremos aportar, cuanto antes encuentres un error en tu aplicación, mucho más barato será de arreglarlo.

Y hasta aquí el video de hoy!