Saturday, May 11, 2024
80
rated 0 times [  81] [ 1]  / answers: 1 / hits: 18826  / 15 Years ago, fri, january 15, 2010, 12:00:00

I have a webapp build plan running on a Continuous Integration system (Atlassian Bamboo 2.5). I need to incorporate QUnit-based JavaScript unit tests into the build plan so that on each build, the Javascript tests would be run and Bamboo would interpret the test results.



Preferably I would like to be able to make the build process standalone so that no connections to external servers would be required. Good ideas on how to accomplish this? The CI system running the build process is on an Ubuntu Linux server.


More From » unit-testing

 Answers
47

As I managed to come up with a solution myself, I thought it would be a good idea to share it. The approach might not be flawless, but it's the first one that seemed to work. Feel free to post improvements and suggestions.



What I did in a nutshell:




  • Launch an instance of Xvfb, a virtual framebuffer

  • Using JsTestDriver:


    • launch an instance of Firefox into the virtual framebuffer (headlessly)

    • capture the Firefox instance and run the test suite

    • generate JUnit-compliant test results .XML


  • Use Bamboo to inspect the results file to pass or fail the build



I will next go through the more detailed phases. This is what my my directory structure ended up looking like:




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


On the build server:




  • Install Xvfb (apt-get install Xvfb)

  • Install Firefox (apt-get install firefox)



Into your application to be built:






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


Create a script file for running the unit tests and generating test results (example in 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.


Create an Ant target that calls the 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>


Finally, tell the Bamboo build plan to both invoke the test target and look for JUnit test results. Here the default **/test-reports/*.xml will do fine.


[#97823] Tuesday, January 12, 2010, 15 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
anais

Total Points: 672
Total Questions: 118
Total Answers: 121

Location: Oman
Member since Fri, Dec 23, 2022
1 Year ago
anais questions
Fri, Jul 29, 22, 00:00, 2 Years ago
Mon, Jul 19, 21, 00:00, 3 Years ago
Tue, May 11, 21, 00:00, 3 Years ago
Fri, Apr 2, 21, 00:00, 3 Years ago
;