Test de UI en Swift con KIF

Yodra López
Lean Mind
Published in
5 min readAug 27, 2018
Photo by Med Badr Chemmaoui on Unsplash

¿Cuántos de nosotros hemos tenido que añadir una nueva funcionalidad y pasamos más tiempo probándola que implementándola?

En mi caso me he topado con varios proyectos de este tipo, en los cuales hemos tenido que lidiar con aplicaciones nativas, ausentes de test.

Aunque muchas veces nos digan que puede ser una pérdida de tiempo, los tests, son una parte vital para entregar un código de calidad, más limpio y con menos errores.

En este artículo comentaremos como hemos testado la interfaz de usuario, qué estructura, factores a tener en cuenta y herramientas estamos utilizando.

¿Cómo lo estamos haciendo?

En primer lugar, hemos incorporado en el proyecto el modelo MVP (model — view — presenter). Con esta estructura, podemos realizar los test con un scope más amplio, ya que probaremos desde la view, hasta justo antes de la llamada al repository (API, BBDD, etc).

Esta parte es la única que dejaremos fuera de nuestros tests, y lo que haremos con el repository será crear un doble de test, pero eso, lo veremos más adelante en el paso a paso.

¿Por qué MVP?

Hemos tomado esta decisión ya que este modelo ayuda a organizar mejor el código y nos permite realizar test con un scope amplio, ya que partimos de una aplicación heredada que carece de tests.

MVP

La librería KIF

Para facilitarnos la tarea de escribir test de UI, estamos usando la librería KIF (Keep It Functional).

Esta librería nos permitirá interactuar con la aplicación como lo haría el usuario:

  • Hacer clicks en botones, filas y otros elementos
  • Rellenar campos de texto
  • Limpiar campos de textos
  • Movernos por las vistas
  • Hacer pull refresh
  • Hacer swipe
  • Validación de textos y vistas

Es importante saber que esta librería funciona mediante el uso de los accessibility labels, por lo tanto si nuestra aplicación no los usa tendremos que añadirlos.

Éstos, no son más que unos textos que hacen nuestra aplicación más accesible a todo tipo de usuarios. Algunas vistas, como los UILabel, tienen ya por defecto este tipo de textos.

Nosotros estamos utilizando los mismos textos que se ven en la pantalla como valor de los accessibility labels, de modo que no existe diferencia entre ver la pantalla y que la lea el intérprete. Además, como estos textos ya los tenemos traducidos en dos idiomas (español e inglés) ofreciendo mayor soporte.

Configurando KIF

La configuración de KIF es muy sencilla de realizar.

Hemos usado CocoaPods para gestionar las librerías de terceros. Además de ésta, en el repositorio de KIF hay otras formas de configuración.

Estos son los pasos que hemos seguido:

  • Crear un target de Testing
    Importante: este target tiene que ser de test unitarios. Sí, aunque estamos haciendo test de UI es necesario que los hagamos en el target de test unitarios, por exigencias de KIF.
  • Añadir la siguiente dependencia en el Podfile
  • Ejecutar pod install para descargar la librería.
  • Crear extensiones.

Como las palabras claves tester y system son pre-procesadas en C, y no están disponibles para Swift, es necesario incluir algunas extensiones, tal cual indica el repositorio de KIF. Es simplemente copiar y pegar lo siguiente:

Usando KIF

Lo primero que tenemos que hacer es preparar la vista que vamos a probar, para ello instanciamos el view correspondiente.

Como usamos MVP, ya estamos creando también el presenter y con este el caso de uso correspondiente.

Ahora solo tenemos que hacer un doble de test del repository y pasárselo al caso de uso.

¿Qué es un doble de test? No es más, que una copia de nuestra clase “real” en la cual reescribimos los métodos y las propiedades que nos interesen.

En el caso del repository, lo que hacemos es crearnos una nueva clase MockOurRepository, la cual extiende de OurRepository.

Para instanciar el view nosotros creamos un método llamado openOurViewController tal que así:

Además también incluyo el código de la clase que extenderemos en los test, para poder usar KIF:

Funciones de KIF

La primera función que vamos a utilizar será waitForAnimationsToFinish() esta función se queda esperando a que no hayan más peticiones en el hilo de ejecución.

Con esto ya tenemos preparado todo para empezar a desarrollar nuestros tests, para ello usaremos el método tester(), para hacer las llamadas a KIF.

KIF nos provee de multitud de funciones para comprobar el estado de la UI. Algunas de las funciones más útiles son:

  • waitForView(withAccessibilityLabel:label) hace una espera activa hasta que la vista con el accessibility label aparezca. La espera que hace KIF es de 10 segundos, si en ese tiempo no aparece el test falla.
  • waitForAbsenceOfView(withAccessibilityLabel:label) hace justo lo contrario, esperar a que la vista desaparezca de la pantalla.
  • Con waitForSoftwareKeyboard() y waitForAbsenceOfSoftwareKeyboard() podemos comprobar el estado del teclado.

Para interactuar sobre la vista tenemos algunas funciones como:

  • tapView(withAccessibilityLabel:label) simula que el usuario a seleccionado la vista. Se suele utilizar en los botones, pero funciona con cualquier vista que reaccione a esta acción.
  • Con estas podemos actuar sobre vistas más especificas:
    tapStepper(withAccessibilityLabel: label, increment: increment)
    tapStatusBar
    choosePhoneInAlbum(albumName, row, column)
    selectDatePickerValue(values)
  • enterText(text, intoViewWithAccessibilityLabel: label) simula la introducción de textos en los formularios.
  • clearTextFromView(withAccessibilityLabel: label) elimina el texto de los formularios.

Conclusiones

Una aplicación que usa patrones de diseño como MVP es más fácil de testear.
KIF es una librería cómoda de usar, potente y fácil de usar.

Así estamos realizando pruebas con un scope bastante amplio. Recordemos que de esta forma cubrimos desde nuestro viewController hasta justo antes del repository (ya que este lo estamos mockeando).

Con estos tests ahorramos mucho tiempo de testing de UI manual, pero no por ello debemos de olvidarnos del trabajo y el feedback constante de nuestro equipo de UX/UI.

Me ha ayudado mucho el curso UI Testing en iOS con KIF de CodelyTV y Karumi. También una charla, corta pero intensa, a la que tuve el honor de asistir, en la TLP Innova impartida por Jorge Barroso.

--

--