procesos - Ejecutar pruebas de unidad de JavaScript sin cabeza en una construcción de integración continua
pipeline integracion continua (7)
Como alternativa, también puedes probar TestSwarm. Lo tengo funcionando usando QUnit para ejecutar mis pruebas JS.
Tengo un plan de compilación de aplicaciones en ejecución en un sistema de integración continua ( Atlassian Bamboo 2.5). Necesito incorporar pruebas de unidades de JavaScript basadas en QUnit en el plan de compilación para que en cada compilación se ejecuten las pruebas de Javascript y que Bamboo interprete los resultados de las pruebas.
Preferiblemente, me gustaría poder hacer que el proceso de compilación sea "independiente" para que no se requieran conexiones a servidores externos. Buenas ideas sobre cómo lograr esto? El sistema de CI que ejecuta el proceso de compilación se encuentra en un servidor Linux de Ubuntu.
Como logré encontrar una solución, pensé que sería una buena idea compartirla. El enfoque puede no ser perfecto, pero es el primero que parece funcionar. Siéntase libre de publicar mejoras y sugerencias.
Lo que hice en pocas palabras:
- Lanzar una instancia de Xvfb , un framebuffer virtual
- Usando JsTestDriver :
- lanzar una instancia de Firefox en el framebuffer virtual (sin cabeza)
- capturar la instancia de Firefox y ejecutar el conjunto de pruebas
- Generar resultados de pruebas compatibles con JUnit .XML
- Use Bamboo para inspeccionar el archivo de resultados para aprobar o anular la construcción
A continuación, pasaré por las fases más detalladas. Esto es lo que mi estructura de directorios terminó pareciendo:
lib/ JsTestDriver.jar test/ qunit/ equiv.js QUnitAdapter.js jsTestDriver.conf run_js_tests.sh tests.js test-reports/ build.xml
En el servidor de compilación:
- Instalar Xvfb (
apt-get install Xvfb
) - Instalar Firefox (
apt-get install firefox
)
En tu aplicación que se construirá:
- Instale JsTestDriver: JsTestDriver
- agregue los adapters QUnit
equiv.js
yQUnitAdapter.js
- configurar JsTestDriver (
jsTestDriver.conf
):
- agregue los adapters QUnit
server: http://localhost:4224 load: # Load QUnit adapters (may be omitted if QUnit is not used) - qunit/equiv.js - qunit/QUnitAdapter.js # Tests themselves (you''ll want to add more files) - tests.js
Cree un archivo de script para ejecutar las pruebas unitarias y generar resultados de prueba (ejemplo en Bash, run_js_tests.sh
):
#!/bin/bash
# directory to write output XML (if this doesn''t exist, the results will not be generated!)
OUTPUT_DIR="../test-reports"
mkdir $OUTPUT_DIR
XVFB=`which Xvfb`
if [ "$?" -eq 1 ];
then
echo "Xvfb not found."
exit 1
fi
FIREFOX=`which firefox`
if [ "$?" -eq 1 ];
then
echo "Firefox not found."
exit 1
fi
$XVFB :99 -ac & # launch virtual framebuffer into the background
PID_XVFB="$!" # take the process ID
export DISPLAY=:99 # set display to use that of the xvfb
# run the tests
java -jar ../lib/JsTestDriver.jar --config jsTestDriver.conf --port 4224 --browser $FIREFOX --tests all --testOutput $OUTPUT_DIR
kill $PID_XVFB # shut down xvfb (firefox will shut down cleanly by JsTestDriver)
echo "Done."
Cree un objetivo Ant que llame al script:
<target name="test">
<exec executable="cmd" osfamily="windows">
<!-- This might contain something different in a Windows environment -->
</exec>
<exec executable="/bin/bash" dir="test" osfamily="unix">
<arg value="run_js_tests.sh" />
</exec>
</target>
Finalmente, indique al plan de compilación de Bamboo que invoque el objetivo de la test
y busque los resultados de la prueba de JUnit. Aquí el valor predeterminado "**/test-reports/*.xml"
bien.
Es posible que pueda usar rhino, el navegador sin cabeza, para ejecutar las pruebas de su unidad en su máquina CI. Por supuesto, la desventaja aquí es que no encontrará errores específicos del navegador X ... pero supera la instalación de 2-3 sistemas operativos en su cuadro de CI, para cubrir todas las plataformas principales ...
Pero sí, esto es una mierda ... pero podría funcionar lo suficientemente bien en un escenario de CI.
He jugado varias soluciones durante el año pasado, pero no encontré nada en el estadio de Karma (anteriormente testacular). Darle una oportunidad
He usado maven y junit para llamar al rinoceronte. No es elegante, pero lo uso para probar los servicios básicos y el código de utilidad.
Requiere burlarse de clases no compatibles, como XHR con bibliotecas Java.
Descubrí que es mejor codificar todo en javascript (pruebas, etc.) y solo usar junit para la organización de compilación y un enlace a la IC.
Me gustaría ver si JsTestDriver puede hacerlo. O mocha con un reportero de junio.
Para cualquier persona interesada en ejecutar sus especificaciones Jasmine BDD sin cabeza en maven, puede que le interese el plugin jazmín-maven que mantengo:
JS Test Runner es una solución bastante buena. Utiliza PhantomJS y QUnit.