Configuración del entorno para ejecutar tests funcionales en un servidor - Bitendian

Posted by | febrero 27, 2018 | How to | No Comments

La calidad del software es el punto más importante del proyecto. El código de un desarrollo, sea complejo o no tiene que estar limpio y funcional manteniéndolo libre de bug y errores, para eso nada puede subirse a producción sin la confirmación de QA (quality assurance).

Los desarrollos más complejos o con muchas versiones tienen que pasar por muchas pruebas y, a veces, de forma repetitiva. En estas ocasiones lo mejor es crear test automáticos que ayuden a la eficacia y eficiencia del QA.

En este articulo explicaremos cómo configurar nuestro entorno de programación para poder ejecutar test funcionales. Tanto en local, como en un servidor.

1. Herramientas
2. Configuración en local
3. Configuración en el servidor
3.1. Archivo pom.xml para el servidor
3.2. Instalación de jenkins
3.3. Instalación de los plugins para jenkins
3.4. Instalación de la las herramientas globales
……3.4.1. JDK
……3.4.2. Maven
3.5. Un proyecto nuevo equivale a una nueva tarea de Jenkins
3.6. Configuración de una nueva tarea para Jenkins
……3.6.1. Seccion general
……3.6.2. Sección Source Code Management
……3.6.3. Sección Build Triggers
……3.6.4. Seccion Build Environment
……3.6.5. Sección Build
4. Referencias
5. Anexo: Dependencias y Plugins
5.1. Dependencias para Junit 4.1
5.2. Dependencias del Selenium 2.29 (HtmlUnitDriver)
5.3. Plugins

1. Herramientas

Necesitaremos las siguientes herramientas:

  • Selenium Como software base para programar test funcionales.
  • Junit Como entorno de ejecución de los test y gestión de los logs de los mismos.
  • Maven Para la gestión de dependencias, y ejecución de todos los test.
  • JenkinsPara poder automatizar la ejecución de los test en un servidor de integración continua.

2. Configuración en local

Lo primero de todo es crear un proyecto Maven. La IDE Eclipse Neon puede ser muy útil para este propósito, ya que trae un plugin para integrarse con Maven instalado. Al crearlo veremos que aparece un archivo llamado pom.xml asociado a nuestro proyecto.

Entorno al pom.xml gira todo el proyecto. Maven, mediante el archivo pom.xml, se encarga de hacer el build del proyecto, gestionar dependencias y usar sus propios plugins para ejecutar los test que le indiquemos.

Lo siguiente que haremos es configurar nuestro archivo pom.xml. En él incluiremos las dependencias, es decir, otro software, el que sea que vayamos a usar, para hacer nuestro proyecto. En este caso, lo básico será incluir el Junit 4.11, como entorno de ejecución de los test y Selenium para realizar los test.

Selenium es un software que nos sirve para hacer test a aplicaciones web. Selenium permite usar el navegador web automáticamente, interactuando con los diferentes elementos de la página web (pulsando enlaces o rellenando formularios, por ejemplo). La función más importante de Selenium es la de controlar un navegador web; mediante un controlador conocido como WebDriver. Como existen diferentes navegadores en el mercado, Selenium incorpora un WebDriver para cada uno de ellos. Es decir, Firefox tiene su WebDriver llamado FirefoxDriver, Chrome tiene el suyo llamado ChromeDriver, etc.

Los diferentes WebDrivers sirven para navegar sobre la aplicación web y así, poder testear las diferentes funcionalidades. A pesar de la gran ventaja de automatizar las acciones a realizar con un navegador, parece que es imprescindible disponer de un ordenador con interfaz gráfica para poder usar los navegadores. Sin embargo no lo es: para el caso en que queremos usar un navegador sin interfaz gráfica, podremos usar otros WebDrivers específicos, como HtmlUnitDriver.

HtmlUnitDriver es un driver que se usa para el navegador HtmlUnit. HtmlUnit es un navegador sin interfaz gráfica para programadores Java. Modela documentos HTML y proporciona una API que le permite invocar páginas, completar formularios, hacer clic en enlaces. Tal como lo haría un navegador con interfaz gráfica. HtmlUnit se usa para tareas muy concretas, como por ejemplo, para hacer testing.

Usaremos HtmlUnitDriver por dos razones.

La primera es la facilidad de configuración. Con que incluyamos su respectiva dependencia en el Maven, ya podremos ejecutar un test que sea por ejemplo navegar a una página usando los métodos genéricos de Selenium get(URL), y luego, obtener el titulo de la misma haciendo getTitle().

La segunda es por que es más rapido. Esto es así porque al no tener una interfaz gráfica, el test se hace más rápido pues no requiere tener que cargar los elementos de la interfaz, hacer el rendering de la página o tareas similares que hacer un navegador con interfaz.

A continuación, mostramos un ejemplo de archivo pom.xml.

Ejemplo de un archivo pom básico con dependencias de  junit y htmlunitdriver para ejecutar test en local

Como nuestro objetivo es muy concreto, es decir, acabar ejecutando los test en un servidor, lo que haremos será usar el driver de un navegador que no tiene interfaz grafica llamado HtmlUnit. Haremos esto ya que, a nivel práctico, no nos hace falta tener una interfaz gráfica, si lo único que tenemos que hacer es verificar que los test están siendo validados correctamente o no.  Es por esto que usamos el navegador HtmlUnit, y consecuentemente, usaremos un WebDriver de selenium llamado HtmlUnitDriver.

Ejemplo de un test básico usando HtmlUnitDriver : Abrir la pagina de google, y obtener su título.

Llegados a este punto, deberíamos ser capaz de ejecutar un test en local a nuestra aplicación web, usando Selenium como software base para programar test funcionales, Junit como framework de ejecución de los tests, y Maven como herramienta de gestión de dependencias del proyecto.

3. Configuración en el servidor

A continuación, y como paso final, configuramos la herramienta Jenkins para poder automatizar la ejecución de los test en el servidor.

Jenkins es una herramienta que sirve para automatizar procesos. Es decir, nos puede servir para poder compilar un programa y ejecutarlo periódicamente. En definitiva, podemos tener Jenkins ejecutando permanentemente en un ordenador (servidor), y así, poder crear tareas para diferentes propósitos y todo ello con la finalidad de automatizar su ejecución.

Con la herramienta Jenkins lo que haremos es reproducir la configuración que hemos hecho en local. Es decir, es esencial que tengamos la configuración local bien hecha y funcionando, ya que es más fácil de depurar y verificar su correcto comportamiento.

Nosotros usaremos Jenkins para automatizar la ejecución de los test.  Basamos nuestra  configuración de Jenkins en tres ideas.

La primera idea es configurar Jenkins para que cada vez que un developer realice un cambio en la aplicación web, y suba código al repositorio, se ejecuten todos los test relativos a ese proyecto. De esta forma, garantizamos que el total de la aplicación web (en todo su conjunto), funcionan correctamente. Además, agilizamos y facilitamos la integración continua del proyecto, ya que en cada cambio, serán detectados los eventuales fallos que puedan haberse producido.

La segunda idea es configurar Jenkins para que cada vez que haya un nuevo test asociado a un proyecto, se ejecute ese nuevo test más todos los test relativos al proyecto. De esta forma, se evita que un test nuevo provoque conflicto entre los otros test, y se descarta completamente que el fallo eventual en la aplicación web, sea realmente de la misma, y no de los tests en si.

La tercera y última es ejecutar test periódicamente, independientemente de si hay un push de algún developer, o un nuevo test de la sección de QA. Esto se hará para garantizar una cierta calidad del software testeado.

Configuraremos cada tarea del Jenkins siendo consecuentes con nuestras tres ideas.

3.1. Archivo pom.xml para el servidor

Antes de empezar a configurar el Jenkins hemos de modificar nuestro pom.xml para que pueda ejecutar test usando Jenkins, es decir, debemos adaptar nuestro archivo pom.xml para el entorno del servidor.

Hacemos especial énfasis en las propiedades del proyecto, y en la sección build del proyecto.

En propiedades se tiene que indicar la versión del compilador para Maven.

En la sección debemos indicar que plugin de Maven usamos para ejecutar los test. El plugin es importante para saber que test queremos ejecutar. En principio van a ser todos, es por eso que indicamos al plugin <include>**/*.java</include>, que indica que queremos ejecutar todos los test que haya en el repositorio de tests.

3.2. Instalación de jenkins

Descargamos el .war (Generic Java Package) de Jenkins 2.98. Podemos instalar el Jenkins si los deseamos, como programa en nuestro SO. Si se ejecuta en un servidor lo ideal es tenerlo instalado en nuestro SO. Para ejecutar el .war de Jenkins estando en Linux.

Nos ubicamos con el terminal en el directorio donde tenemos el .war y tecleamos:

java -jar jenkins.war

Tendremos un Jenkins ejecutando des de zero. Poniendo la URL http://localhost:8080 en el navegador, podremos acceder a la configuración de Jenkins

3.3. Instalación de los plugins para jenkins

Seguimos los pasos de configuración hasta llegar a la pantalla de instalación de plugins.

Instalación de plugins para jenkins

Elegimos hacer la instalación de absolutamente todos los plugins. Para ello, hacemos click en  “Select plugins to install” y alli escogemos instalar todos los plugins. La instalación de todos los plugins, no ocupa mucho, y a nivel práctico es una buena desicion, ya que así dispondremos de todas las herramientas, y la configuración será mucho más simple.

Nos hemos de  aseguramos de que como mínimo tenemos los siguientes plugins: Junit, Maven, Maven Surefire.

3.4 Instalación de la las herramientas globales

Hecha la instalación de los plugins, accederemos al dashboard del Jenkins. Accedemos a configurar las tools generales. Aqui, basicamente lo que tenemos que indicar son las herramientas que se van a usar para compilar nuestros  proyecto, y hacer los  builds de los mismos. Nos dirigimos a http://localhost:8080/configureTools/ . Aquí configuramos las herramientas globales que se usaran para hacer build de nuestros proyectos.

3.4.1. JDK

Podemos hacer que Jenkins instale automaticamente JDK desde internet, o podemos decirle la ruta en local del  JDK. Es más pragmática y cómoda la primera opción. Para nuestros proyectos, usaremos jdk-1.8, con lo cual, hemos de decirle a jenkins des de donde debe ir a buscar el JDK.

Configuración JDK en  Jenkins (Global Tool Configuration)

3.4.2 Maven

Podemos hacer que jenkins instale automáticamente Maven desde internet, o podemos decirle la ruta en local, donde tengamos el maven instalado. Es más pragmática y cómoda la primera opción

Configuracion Maven en  Jenkins ( Global Tool Configuration)

NOTA: Hasta el paso 2, se hace una vez por cada instalación nueva de Jenkins que  se haga. Esencialmente se hara una vez, que sera la primera vez que instalemos Jenkins en el servidor.

3.5. Un proyecto nuevo equivale a una nueva tarea de Jenkins

Cada tarea de Jenkins representa un proyecto. A continuación, se muestran las capturas para crear una tarea nueva, o lo que es lo mismo en este caso, un proyecto maven nuevo.

Vamos a http://localhost:8080/view/all/newJob. Ponemos el nombre de la tarea y escogemos el tipo de tarea , que en este caso es maven.

Creando una nueva tarea jenkins

Pulsamos Ok, y pasamos a configurar la tarea.

3.6. Configuración de una nueva tarea para Jenkins

Este paso es de los más importantes.

Gracias al hecho de haber instalado todos los plugins tendremos muchas opciones de configuración. Pero aquí, vamos a ilustrar solo las que repetiremos para cada tarea nueva que se desee crear.

La configuración de una nueva tarea en Jenkins va por secciones y así la ilustraremos.

3.6.1. Seccion general

Asignamos el nombre de la tarea/proyecto. SI ya lo tenemos puesto, pasamos a la siguiente sección.

Configuración general: Asignando nombre a la tarea.

3.6.2. Sección Source Code Management

Seleccionamos Git . Indicamos el link de repositorio en el cual tenemos el código de los test. Que es el código que se tiene que ejecutar cada vez que se haga el build de nuestra tarea/proyecto.

Selección del código fuente desde un repositorio

3.6.3. Sección Build Triggers

Seleccionamos las opciones pertinentes para hacer el build del proyecto . En este caso tenemos puesto Build whenever a SNAPSHOT dependency is built

Selección de las opciones/acciones que hacen de triggers para hacer el build

3.6.4. Seccion Build Environment

En este caso hemos marcado: Delete workspace before build starts Jenkins coge el código que desea ejecutar, y se lo copia en su workspace. Y desde allí se compila y ejecuta. Del resultado de la ejecución, se generan archivos basura. Con esta opción lo que hacemos es limpiar el workspace para así garantizar que en una nueva compilación , se generan archivos actualizados para la nueva compilación.

Selección de las opciones/acciones para configurar el entorno para hacer el Build

3.6.5. Sección  Build

En esta indicamos a jenkins que pom deseamos que se use para hacer el build del proyecto. También hemos de indicar la meta del build , que en este caso es ejecutar los test.

Root POM : pom.xml

Goals and options : test

Selección de las opciones/acciones para hacer el build

Si nuestro build requiere de algunos pasos previos, como por ejemplo, crear algún archivo antes de hacer el build  o recoger el resultado de la ejecución en algun archivo, podemos definir estas tareas, como comandos de bash/cmd, en los pasos “pre/post build”.

Llegados a este punto, ya tendremos nuestra tarea de Jenkins programada y lista para ser ejecutada.

Finalmente, damos a aplicar configuración y guardar. Nos dirigimos al dashboard (http://localhost:8080/ ), donde tendremos una nueva tarea creada . Clickeamos sobre el nombre de la tarea y luego sobre “build now. Hará el build del proyecto usando nuestro pom.xml y ejecutara los test que le hayamos indicado en el plugin de maven-surefire. Cuando haya acabado, nos mostrara un “log/reporte” con los test pasados y fallados usando el plugin de Junit.

4. Referencias

Referencia Comentario
https://github.com/SeleniumHQ/htmlunit-driver Descarga y instalación del HtmlUnitDriver. La última versión
https://updates.jenkins-ci.org/download/plugins/ Repositorio con todos los plugins para Jenkins
http://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html Manual para usar el plugin de maven llamado surefire para ejecutar test con Junit.
http://toolsqa.com/ Tutorial para aprender sobre el testing automático

5. Anexo: Dependencias y Plugins

5.1. Dependencias para Junit 4.1

</dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>

5.2. Dependencias delSelenium 2.29 (HtmlUnitDriver)

<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>htmlunit-driver</artifactId>
<version>2.29.0</version>
</dependency>

5.3. Plugins

<plugins>
<plugin>
……<groupId>org.apache.maven.plugins</groupId>
……<artifactId>maven-surefire-plugin</artifactId>
……<version>2.20.1</version>
………<configuration>
…………<includes>
……………<include>**/*.java</include>
…………</includes>
…………</configuration>
</plugin>
</plugins>