Herramientas y Métodos en Ingeniería del Software Version.2022. Joaquín Cañadas <jjcanada@ual.es>
Tests de Selenium JUnit WebDriver en Jenkins.
-
Ejecutar los test de Selenium JUnit Webdriver en Jenkins utilizando el navegador en modo headless.
1. Selenium WebDriver y Jenkins
Selenium WebDriver permite ejecutar los tests de Selenium como tests de JUnit, permitiendo así su ejecución en Eclipse y Jenkins.
La ejecución de los tests de Selenium en Jenkins debe hacerse en modo headless ya que la máquina Jenkins no tiene instalada una interfaz gráfica, más comúnmente conocida como X o X11 en Linux. A pesar de ello, podremos hacerlo instalando un entorno de visualización simulado (xvfb
). Veamos los pasos necesarios. Lo primero es descargar los drivers de los navegadores en la máquina de Jenkins.
1.1. Configuración
-
Conecta por SSH a la máquina Jenkins. En la carpeta JENKINS_HOME (si no recuerdas cual es, la predeterminada es
/var/lib/jenkins
, puedes verla en http://mi-jenkins-url/systemInfo) crea una carpetaselenium-drivers
y descarga ahí los drivers de los navegadores Firefox y Chrome para Ubuntu. Para ello, ejecuta los siguientes comandos en la máquina Jenkins.
1
2
3
4
5
6
7
8
9
10
11
12
cd
JENKINS_HOME=/var/lib/jenkins (1)
echo $JENKINS_HOME
sudo mkdir $JENKINS_HOME/selenium-drivers (2)
wget https://github.com/mozilla/geckodriver/releases/download/v0.31.0/geckodriver-v0.31.0-linux64.tar.gz
sudo tar -C $JENKINS_HOME/selenium-drivers/ -xvf geckodriver*.tar.gz (3)
wget https://chromedriver.storage.googleapis.com/102.0.5005.61/chromedriver_linux64.zip (4)
sudo apt-get install unzip -y
sudo unzip chromedriver_linux64.zip -d $JENKINS_HOME/selenium-drivers/ (5)
ls -la $JENKINS_HOME/selenium-drivers/ (6)
sudo chown jenkins:jenkins $JENKINS_HOME/selenium-drivers/ (7)
sudo chown jenkins:jenkins $JENKINS_HOME/selenium-drivers/*
1 | Declara la variable de entorno JENKINS_HOME |
2 | Crea la carpeta donde guardar los drivers de los navegadores. Asegúrate que tienes permisos suficientes. Si necesitas usar sudo , deberás de cambiar los permisos y grupos de los archivos al usuario jenkins:jenkins (ver paso 6). |
3 | Con wget descarga la última versión de geckodriver para linux en la carpeta home , y con tar -xvf descomprime en la carpeta deseada. |
4 | Con wget descarga chromedriver para linux en la carpeta home, pero antes revisa la última versión estable de Chrome para Ubuntu y usa la URL de descarga de chromedriver_linux64.zip adecuada para la versión estable de Chrome |
5 | Con unzip descomprime en la carpeta deseada. Además has tenido que instalar unzip |
6 | Lista los archivos en la carpeta selenium-drivers . Comprueba que los permisos no son adecuados para que Jenkins pueda lanzar los ejecutables de los drivers. |
7 | Asigna el grupo jenkins:jenkins a la carpeta y los archivos. Como resultado los archivos deben tener los permisos correctos |
-
Instala
firefox
en tu máquina Jenkins. También deberás instalarxvfb
que hace de entorno de visualización simulado para ejecutar los tests headeless de Selenium. Recuerda que la maquina Jenkins no tiene una interfaz gráfica, así que aunque firefox se va a ejecutar en modo headless, es necesario tener un entorno de visualización simulado, y esto lo proporcionaxvfb
.
1
sudo apt-get install -y xvfb firefox
1.2. Creación del pipeline en Jenkins
-
Crea en Jenkins un nuevo proyecto pipeline. Incluye la fase (stage) con nombre
Firefox tests
, donde llames a maven. Utilizaxvfb-run
que se encarga de iniciar y pararxvfb
por ti.xvfb-run mvn test -Dwebdriver.gecko.driver=${JENKINS_HOME}/selenium-drivers/geckodriver
El pipeline tendrá esta forma:
pipeline {
agent any
environment {
DRIVERS_LOC = "$JENKINS_HOME/selenium-drivers/"
}
tools {
// Usa aquí el nombre de tu instalación de Maven en Jenkins Tools
maven "Default maven"
}
stages {
stage('Git clone') {
steps{
// Update the URL to your repo
git 'https://github.com/tu-usuario/tu-repo-selenium.git'
}
}
stage('Firefox tests') {
steps {
// Run Maven on xvfb environment display.
// Update the path/to/your/pom.xml as necessary
sh "xvfb-run mvn -f path/to/pom.xml clean test -Dwebdriver.gecko.driver=${DRIVERS_LOC}/geckodriver"
}
post {
// If Maven was able to run the tests, even if some of the test
// failed, record the test results
success {
junit '**/target/surefire-reports/TEST-*.xml'
}
}
}
}
}
Comprueba que en el código de los tests Selenium en JUnit estás usando |
Recuerda que en el código debes comentar las lineas donde se definen las property con las rutas de los drivers. // System.setProperty("webdriver.gecko.driver", "drivers/geckodriver.exe"); |
-
Publica la gráfica de los tests en un bloque
post
del pipeline.
A partir de aquí es optativo
-
Para probar la ejecución con Chrome, debes instalar Chrome en la máquina Jenkins. Para ello sigue los pasos: Instalar Google Chrome en Ubuntu 18.04 LTS desde la línea de comandos (No instales al versión beta, tampoco podrás ejecutarlo, simplemente instalarlo). Después, crea una nueva fase donde llames a los tests con el driver de Chrome. Tendrás que modificar el driver en el código, y llamar a maven con el siguiente parámetro para Chrome Driver:
mvn test -Dwebdriver.chrome.driver=${DRIVERS_LOC}/chromedriver
-
Habrás implementado dos alternativas de ejecución en Jenkins de los test de Selenium en modo headless. Sin embargo, el diseño de clases JUnit y uso de los distintos drivers tiene varias desventajas:
-
Para ejecutar con un navegador u otro tenemos que tocar el código fuente y modificar el driver "a mano"
-
Esto implica que no se puede lanzar la ejecución en los dos navegadores en el mismo pipeline: o ejecutamos con Firefox o ejecutamos con Chrome.
-
Lo ideal es poder diseñar el pipeline para lanzar en paralelo la ejecución en estos dos, o cuantos navegadores sean necesarios, tal y como se muestra en la siguiente imagen:
EJERCICIOS (Optativos)
|
2. Más info
-
https://github.com/shailendravaichalkar/Selenium-Maven-Template
-
Buenas prácticas: Selenium con Java