Integración continua usando Jenkins para test automáticos en iOS

La integración continua es un modo de trabajo, inicialmente mencionada por Martin Fowler que consiste en la integración automática de un proyecto a menudo con el fin de detectar errores tan pronto como sea posible. Es posible lograr la integración continua usando Jenkins. Este post trata de un ejemplo práctico para ejecutar pruebas automáticas para una aplicación iOS cada vez que queramos (siempre que alguien suba código al repositorio, todos los días a la misma hora …)

Vamos a necesitar dos tareas para ejecutar los tests en jenkins. Una para compilar el proyecto de iOS y otra para ejecutar los tests en el proyecto compilado.

Integración continua usando Jenkins

Job en Jenkins para compilar un proyecto iOS (JOB-TEST)

Cosas a tener en cuenta

  •  El proyecto necesita tener un esquema.
  • El app que se genera compilando el proyecto usando el plugin de xcode de jenkins no se puede instalar en el simulador a través de instruments, así que es mejor hacerlo utilizando el comando xcodebuild.

Es importante añadir los caracteres adecuados al comando xcodebuild, de manera que se pueda instalar la aplicación a través de instruments.
Aquí vemos un ejemplo de como hacerlo:

xcodebuild -project "projectName.xcodeproj" \
-scheme "schemeName" \
-sdk iphonesimulator7.0 \
-configuration Release \
SYMROOT="./build" \
DSTROOT="./build" \
install

En este tarea, después de compilar el proyecto, debemos guardar el archivo .app como un artefacto.

Artifacts in Jenkins

Y después ejecutar la segunda tarea.

Continuous integration

 

Job de Jenkins para ejecutat los tests (JOB-TEST-INSTRUMENTS)

Antes de empezar esta tarea, se deben haber hecho los tests. En esta tarea, se va a instalar la aplicación en el simulador y luego ejecutar los tests usando instruments.

Es posible incluir en una tarea el commando de instruments para ejecutar un test y luego viendo como finaliza la tarea, saber si el test ha acabado correctamente o no. El problema es que necesitarías tantas tareas como test quieres ejecutar.
Jasmine nos ayuda a evitar eso:

  • añadiendo todos los tests en un solo archivo javascript
  • guardando el resultado de cada test en un fichero xml. Utilizando el plugin jUnit para jenkins podemos ver el resultado de los test de manera sencilla.

¿Qué es jasmine?

Jasmine es un framework de desarrollo dirigido por comportamiento para probar código javaScript. Las casos de pruebas de iOs están en javaScript, lo que hace posible utilizar este framework.

Esta librería está preparada para que se puedan ejecutar test en iOs usando jasmine

  • runTest.sh: el comando para ejecutar instruments por linea de comando está en este fichero. Comprueba que la ruta de instruments es correcta.
  • Dentro de la carpeta specs, se debe incluir el archivo test.js (puede tener este nombre u otro) el cual contiene los casos de pruebas.
  • En el fichero ci.js, se debe indicar la ruta y el nombre del archivo javaScript donde están los casos de prueba, por ejemplo test.js.
  • Cuando los test terminen, el fichero test-result.xml estará dentro de la carpeta test-report. Este fichero tendrá el resultado de los test.
Test.js

En test.js, debemos incluir los casos que fueron generados usando instruments.Es sencillo.

describe(“TestSuite1”, function() {
         it(“test1”, function() {
                 ...
         });
         it(“test2”, function() {
                ...
         });
         ...
});

En cada “it”, se añadirá un caso de prueba generado por instruments.
En instruments, cómo recordareis, se añadía código para validar si la prueba termino correctamente.
Ahora debemos incluir los comandos de jasmine para validar que finalizo del modo esperado.

Si tuviésemos un código como esto

if(target.frontMostApp().navigationBar().isValid() ){

deberíamos añadir esto arriba

expect(target.frontMostApp().navigationBar().isValid()).toBeTruthy();

Además de toBeTruthy(), en jasmine hay más funciones para validar

  • toBeEqual()
  • toContain()
  • toBeNull()

Tambien existe not. Por ejemplo: expect(x).not.toEqual(y)

Una vez que se modifica el código y lo hemos subido al repositorio, en el job de jenkins deberemos guardar el artefacto dentro de la tarea

Continuous integration jenkins

Después se accede al script y se ejecuta este comando para instalar la aplicación y ejecutar las pruebas

./runTests.sh ci.js "/Users/job/aplication.app"

una vez que se haya terminado, comprobamos el resultado utilizando jUnit

Continuous integration jenkins

Cuando todos los test han pasado, por ejemplo

Continuous integration jenkins

Y cuando algunos de ellos fallan

Continuous integration jenkins

¿Vas a integrar tus test automáticos usando Jenkins?

 

Deja un comentario

Responsable » Solidgear.
Finalidad » Gestionar los comentarios.
Legitimación » Tu consentimiento.
Destinatarios » Los datos que me facilitas estarán ubicados en los servidores SolidgearGroup dentro de la UE.
Derechos » Podrás ejercer tus derechos, entre otros, a acceder, rectificar, limitar y suprimir tus datos.

¿Necesitas una estimación?

Calcula ahora