HEADER_lecciones_de_software

Cómo hacer pruebas unitarias (TDD) en iOS usando XCTest

por David Andrés Penagos, el 16 de junio de 2020

Cómo hacer pruebas unitarias (TDD) en iOS usando XCTest

Esta lección pretende explicar de manera fácil y sencilla las pruebas unitarias mediante la experiencia y el trabajo de varios años en proyectos multidisciplinarios, acatando y reuniendo las mejores prácticas del entorno sin perder la costumbre de un buen desarrollo, enfocándolos en una aplicación en Swift.

Requerimientos:

Para poder comenzar a trabajar en las pruebas unitarias, necesitaremos tener lo siguiente:

  • Computadora con sistema operativo MacOS (preferiblemente con la última actualización).
  • Xcode 11.5 (preferiblemente con la última actualización).
  • Git - Viene por defecto cuando instalamos Xcode. Para verificar la versión actual, ejecutamos el siguiente código en la terminal:

git --version

  • Cocoapods - Para realizar la instalación, ejecutamos el siguiente código en la terminal:

sudo gem install cocoapods

Presentación de aplicación

Pruebas unitarias iOS 1Pruebas unitarias iOS 2

Utilizaremos una aplicación ya creada para agilizar el proceso y enfocarnos en las pruebas únicamente. Esta app consiste en el consumo de una API de Marvel Comics, trayendo los cómics más recientes y mostrándolos junto a su portada, fecha de publicación y unos botones para darle like/dislike.

Ejecutando el siguiente código en la terminal, podrás bajar el repositorio:

git clone git@git.pragma.com.co:Practicas/habilitacion-david-penagos.git

Creación de XCTest Class

Para comenzar con nuestras pruebas unitarias utilizando XCTest, necesitaremos crear un target que se encargará de agruparlas, de esta forma, genera un mayor orden dentro de la app.

Seleccionamos File -> New -> Target:

Creación de XCTest Class

Se nos abrirá una ventana para indicar el tipo de target que vamos a crear. En la sección de buscar (marcada en rojo), colocamos “test” y nos aparecerán dos targets:

Creación de XCTest Class 2

Creación de XCTest Class 3

El componente “UI Testing Bundle” sirve para realizar pruebas con interfaz gráfica, pero en estos momentos no trabajaremos con ese. Seleccionamos el componente “Unit Testing Bundle” y le damos “Next” o presionamos Enter.

Nos saldrá otra ventana donde ingresamos el nombre del componente, la organización responsable, el equipo que va a desarrollarlo, el lenguaje y la localización del archivo. Se recomienda que el nombre del componente sea igual que el nombre de la app pero al final terminarlo con la palabra “Tests”, tal como se ve en la siguiente imagen y le damos en “Finish” o presionamos Enter:

Creación de XCTest Class 4

Ahora ya tenemos nuestro target en la parte izquierda de Xcode y observamos que tiene un archivo con extensión .swift, que es el que vamos a utilizar para realizar nuestras pruebas y el archivo info.plist que contiene toda la información necesaria para ejecutar la prueba en nuestro Workspace.

Por lo general, este documento no se debe de modificar a menos que la ruta de Testing sea diferente y este en un Workspace distinto:

Creación de XCTest Class 5

Componentes de XCTest Class

Abrimos el archivo .swift anteriormente mencionado y eliminamos todo su contenido, dejando la clase vacía, como se muestra en la siguiente imagen. Este procedimiento se realiza debido a que las funciones que se están llamando al inicio de la clase son de prueba y no serán las que tenemos que crear realmente.

Componentes de XCTest Class 1

XCTest tiene una estructura básica para realizar las operaciones de testing de la aplicación donde incluye 2 funciones principales, que tiene como propósito crear y destruir los objetos a los que se les van hacer las pruebas.

La primera función es: setUp, donde se crea la instancia del objeto que vamos a probar. Para nuestro caso, utilizaremos la clase HomePresenter, como un objeto denominado SUT (System Under Test).

La segunda función es: tearDown, donde se elimina la instancia del
objeto que vamos a probar para liberar memoria después de que se
ejecuten las pruebas. Aquí, un ejemplo:

Componentes de XCTest Class 2

Por último, están las pruebas que vamos a ejecutar para realizar el testing y el código que vamos a implementar. Estas funciones deben de tener como nombre, la descripción del test que vamos a ejecutar y deben de ser lo mas clara posible para que cualquier persona que vea o revise ese test, pueda entender que es lo que se pretende hacer antes de verificar el código.

De igual forma, se recomienda que al final del nombre del test se indique si es una prueba exitosa o una prueba de error.

Por ejemplo, si vamos a realizar la prueba de una función para transformar la fecha por defecto en una fecha legible para el usuario, se podría llamar: “testFunctionTransformDateToShowSuccess”.

No te asustes si el nombre del test es demasiado largo, lo que importa en realidad es que con solo leer el nombre del test se entienda que es lo que se quiere probar.

Componentes de un test general

En muchos artículos y varias referencias para hacer este tipo de test se encuentran llamados desorganizados e inicializaciones por doquier dando una dificultad alta para entenderlos. Dentro de toda la experiencia, pude observar que hay 3 partes fundamentales que nos ayudarán a entender y realizar los test de manera más fácil y efectiva:

  • Given: En esta sección es donde se crean o se instancia las variables que vamos a trabajar dentro del test. En algunos, se realiza una promesa con respecto al resultado esperado para luego compararlo.
  • When: En esta sección se realiza el llamado de la funciones respectivas a probar o de los elementos que vamos a ejecutar para poder obtener un resultado.
  • Then: En esta sección se realiza la validación con respecto al resultado obtenido en el paso anterior y nuestro resultado esperado.

Testeando una función

Empezaremos implementando el test de nuestro código con los datos anteriormente mencionados, tomando como referencia la función: “transformDateToShow” que se encuentra localizada en: MarvelApp -> HomeView -> Presenter -> HomePresenter.swift.

Testeando una función iOs

Esta función toma como dato de entrada una fecha tipo String para realizar una devolución de la fecha fecha tipo “dd MMM, yyyy” y así, será más legible para el usuario.

Para lo anterior, implementamos el siguiente test donde esperamos que el resultado de la función sea diferente de nulo y sea igual al valor ingresado en la línea 36.:

Testeando una función iOs 2

Para ejecutar nuestro test y empezar a probar sus diferentes resultados, aparecerá un rombo en la parte izquierda de la función. Presionamos ese rombo para ejecutar un simple test de la función, o podemos presionar el rombo al lado de la clase para ejecutar todos los test que la contengan.

Testeando una función con consumo de API

Cumpliendo con la misma estructura, implementaremos el test de una función que llama un servicio API de Marvel Comics para que nos traiga los cómics mas recientes que posee. La función se encuentra en: MarvelApp -> HomeView -> HomeRemoteDataManager.swift.

Antes de ejecutarse la función que nos esta retornando el resultado, realizamos una promesa (linea 46) para que cuando se ejecute el servicio y el resultado sea el esperado, pueda marcarse como cumplida y parar la ejecución del test.

Para esta prueba realizaremos una petición mediante un URLSession y luego nos arrojará que la petición fue exitosa (StatusCode = 200).

Testeando una función con consumo de API 1

Para esta otra prueba, se realiza el mismo ejercicio anterior pero indicando que la respuesta del servicio va a ser un error (diferente de StatusCode = 200).

Testeando una función con consumo de API 2

Y para la última prueba, se utilizan los mismo parámetros anteriores, se verifica que el objeto que nos retorna el servicio y su deserialización son correctas y no son un objeto vacío o nulo.

Testeando una función con consumo de API 3

 

Nuevo llamado a la acción

Temas:Desarrollo de Software

Lecciones Pragma

Lecciones en Academia Pragma

Aquí encontrarás tutoriales técnicos para que apliques en temas de desarrollo de software, cloud, calidad en software y aplicaciones móviles. 

También puedes visitar nuestro Blog con contenido actual sobre Transformación Digital, Marketing, Conocimiento de Usuario y más. 

Blog

Suscríbete a la academia

Descarga la Guía para trabajar con ambientes IBM Websphere Portal