Ejecutar pruebas unitarias de JavaScript de forma directa en una compilación de Integración Continua


Tengo un plan de compilación de webapp que se ejecuta en un sistema de Integración Continua (Atlassian Bamboo 2.5). Necesito incorporar pruebas unitarias de JavaScript basadas en QUnit en el plan de compilación para que en cada compilación se ejecuten las pruebas de Javascript y Bamboo interprete los resultados de la prueba.

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? La CI el sistema que ejecuta el proceso de compilación está en un servidor Ubuntu Linux.

Author: miek, 2010-01-15

7 answers

Como me las arreglé para llegar a una solución yo mismo, pensé que sería una buena idea compartirla. El enfoque puede no ser impecable, pero es el primero que parecía funcionar. Siéntase libre de publicar mejoras y sugerencias.

Lo que hice en pocas palabras: {[13]]}

  • Lanzar una instancia de Xvfb , un framebuffer virtual
  • Utilizando JsTestDriver :
    • inicie una instancia de Firefox en el framebuffer virtual (sin cabeza)
    • capture la instancia Firefox y ejecute el conjunto de pruebas
    • generar resultados de pruebas compatibles con JUnit .XML
  • Utilice Bamboo para inspeccionar el archivo de resultados para pasar o fallar la compilación

Pasaré a continuación 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 su aplicación que se construirá:

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

Crear un archivo de script para ejecutar las pruebas unitarias y generar los resultados de las pruebas (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."

Crear un destino 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, dile al plan de construcción de Bamboo que invoque el objetivo test y busque los resultados de la prueba JUnit. Aquí el valor predeterminado "**/test-reports/*.xml" estará bien.

 55
Author: miek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-15 09:48:26

Para cualquier persona interesada en ejecutar sus especificaciones de Jasmine BDD sin cabeza en maven, puede que le interese el plugin jasmine-maven que mantengo:

Http://github.com/searls/jasmine-maven-plugin

 4
Author: Justin Searls,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-03 16:05:54

Como alternativa, también puedes probar TestSwarm. Lo tengo listo y funcionando usando QUnit para ejecutar mis pruebas JS.

 3
Author: Dom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-10 16:22:18

He jugado con una serie de soluciones durante el último año, pero no encontré nada en el estadio del Karma (anteriormente testacular). Pruébalo

Http://karma-runner.github.com/

 3
Author: Trey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-29 01:24:20

Es posible que pueda usar rhino, el navegador sin cabeza, para ejecutar las pruebas unitarias en su máquina CI. Por supuesto, la desventaja aquí es que no encontrará errores específicos para el navegador X... pero supera la instalación de 2-3 sistemas operativos en su caja de CI, para cubrir todas las plataformas principales...

Pero sí, esto apesta... pero podría funcionar lo suficientemente bien en un escenario de IC.
 0
Author: RyanWilcox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-15 12:34:35

He usado maven y junit para llamar a rhino. No es elegante, pero lo uso para probar servicios básicos y código de utilidad.

Requiere burlarse de clases no soportadas, como XHR con bibliotecas Java.

Encontré que es mejor codificar todo en javascript (pruebas, etc.) y solo usar junit para construir la organización y un gancho en el CI.

Me gustaría ver si JsTestDriver puede hacerlo. O mocha con un reportero de Junit.

 0
Author: jon077,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-23 19:40:54

JS Test Runner es una solución bastante buena. Utiliza PhantomJS y QUnit.

 0
Author: Vivin Paliath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-25 23:34:34