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.
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:
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:
apt-get install Xvfb
)apt-get install firefox
)Dans votre application à construire:
equiv.js
et QUnitAdapter.js
jsTestDriver.conf
):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.
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:
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
Comme alternative, vous pouvez également essayer TestSwarm. Je l'ai opérationnel en utilisant QUnit pour exécuter mes tests JS.
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.
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.
JS Test Runner est une très bonne solution. Il utilise PhantomJS et QUnit.