web-dev-qa-db-fra.com

Exécution de tests unitaires JavaScript sans tête dans une version d'intégration continue

J'ai un plan de construction d'application Web fonctionnant sur un système d'intégration continue ( Atlassian Bamboo 2.5). Je dois incorporer des tests unitaires JavaScript basés sur QUnit dans le plan de construction afin que sur chaque construction, les tests Javascript soient exécutés et Bamboo interprète les résultats des tests.

De préférence, je voudrais être en mesure de rendre le processus de construction "autonome" afin qu'aucune connexion à des serveurs externes ne soit nécessaire. De bonnes idées pour y parvenir? Le système CI exécutant le processus de construction se trouve sur un serveur Linux Ubuntu.

59
miek

Comme j'ai réussi à trouver une solution moi-même, j'ai pensé que ce serait une bonne idée de la partager. L'approche n'est peut-être pas parfaite, mais c'est la première qui semble fonctionner. N'hésitez pas à publier des améliorations et des suggestions.

Ce que j'ai fait en un mot:

  • Lancer une instance de Xvfb , un framebuffer virtuel
  • Utilisation de JsTestDriver :
    • lancer une instance de Firefox dans le framebuffer virtuel (sans tête)
    • capturez l'instance Firefox et exécutez la suite de tests
    • générer des résultats de test conformes à JUnit .XML
  • Utilisez Bamboo pour inspecter le fichier de résultats pour réussir ou échouer la compilation

Je passerai ensuite par les phases plus détaillées. Voici à quoi ma structure de répertoires a fini par ressembler:

 lib /
 JsTestDriver.jar 
 test /
 qunit /
 equiv.js 
 QUnitAdapter.js 
 jsTestDriver.conf 
 run_js_tests.sh 
 tests.js 
 test-reports /
 build.xml 

Sur le serveur de construction:

  • Installez Xvfb (apt-get install Xvfb)
  • Installez Firefox (apt-get install firefox)

Dans votre application à construire:

 serveur: http: // localhost: 4224 
 
 load: 
 # Load QUnit adapters (peut être omis si QUnit n'est pas utilisé) 
 - qunit/equiv.js 
 - qunit/QUnitAdapter.js 
 
 # Se teste (vous voudrez ajouter d'autres fichiers) 
 - tests.js 

Créez un fichier script pour exécuter les tests unitaires et générer les résultats des tests (exemple dans 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."

Créez une cible Ant qui appelle le 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>   

Enfin, dites au plan de build Bamboo d'appeler à la fois la cible test et de rechercher les résultats des tests JUnit. Ici, la valeur par défaut "**/test-reports/*.xml" fera très bien.

55
miek

Pour tous ceux qui souhaitent exécuter leurs spécifications Jasmine BDD sans tête dans maven, vous pourriez être intéressé par le plugin jasmine-maven que je maintiens:

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

4
Justin Searls

J'ai joué avec un certain nombre de solutions au cours de la dernière année, mais je n'ai rien trouvé dans le stade approximatif de Karma (anciennement testacular). Essaie

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

3
Trey

Comme alternative, vous pouvez également essayer TestSwarm. Je l'ai opérationnel en utilisant QUnit pour exécuter mes tests JS.

3
Dom

J'ai utilisé maven et junit pour appeler rhinocéros. Ce n'est pas élégant, mais je l'utilise pour tester les services de base et le code utilitaire.

Il nécessite de se moquer des classes non prises en charge, comme XHR avec Java bibliothèques.

J'ai trouvé qu'il est préférable de tout coder en javascript (tests, etc.) et d'utiliser uniquement junit pour l'organisation de la construction et un crochet dans le CI.

J'aimerais voir si JsTestDriver peut le faire. Ou moka avec un journaliste junit.

0
jon077

Vous pourrez peut-être utiliser rhino, le navigateur sans tête, pour exécuter vos tests unitaires sur votre machine CI. Bien sûr, l'inconvénient ici est qu'il ne trouvera pas de bugs spécifiques au navigateur X ... mais il vaut mieux installer 2-3 OS sur votre box CI, pour couvrir toutes les plates-formes principales ...

Mais oui, ce genre de chose est nul ... mais cela pourrait fonctionner assez bien dans un scénario CI.

0
RyanWilcox

JS Test Runner est une très bonne solution. Il utilise PhantomJS et QUnit.

0
Vivin Paliath