2 * Qt+WebKit powered headless test runner using Phantomjs
4 * Phantomjs installation: http://code.google.com/p/phantomjs/wiki/BuildInstructions
7 * phantomjs runner.js [url-of-your-qunit-testsuite]
10 * phantomjs runner.js http://localhost/qunit/test
13 var url
= phantom
.args
[0];
15 var page
= require('webpage').create();
17 // Route "console.log()" calls from within the Page context to the main Phantom context (i.e. current "this")
18 page
.onConsoleMessage = function(msg
) {
22 page
.onInitialized = function() {
23 page
.evaluate(addLogging
);
25 page
.open(url
, function(status
){
26 if (status
!== "success") {
27 console
.log("Unable to access network: " + status
);
30 // page.evaluate(addLogging);
31 var interval
= setInterval(function() {
33 clearInterval(interval
);
41 return page
.evaluate(function(){
42 return !!window
.qunitDone
;
46 function onfinishedTests() {
47 var output
= page
.evaluate(function() {
48 return JSON
.stringify(window
.qunitDone
);
50 phantom
.exit(JSON
.parse(output
).failed
> 0 ? 1 : 0);
53 function addLogging() {
54 window
.document
.addEventListener( "DOMContentLoaded", function() {
55 var current_test_assertions
= [];
57 QUnit
.testDone(function(result
) {
58 var name
= result
.module
+ ': ' + result
.name
;
62 console
.log('Assertion Failed: ' + name
);
64 for (i
= 0; i
< current_test_assertions
.length
; i
++) {
65 console
.log(' ' + current_test_assertions
[i
]);
69 current_test_assertions
= [];
72 QUnit
.log(function(details
) {
79 response
= details
.message
|| '';
81 if (typeof details
.expected
!== 'undefined') {
86 response
+= 'expected: ' + details
.expected
+ ', but was: ' + details
.actual
;
89 current_test_assertions
.push('Failed assertion: ' + response
);
92 QUnit
.done(function(result
){
93 console
.log('Took ' + result
.runtime
+ 'ms to run ' + result
.total
+ ' tests. ' + result
.passed
+ ' passed, ' + result
.failed
+ ' failed.');
94 window
.qunitDone
= result
;