Awesome
QUnit-TAP
A TAP Output Producer Plugin for QUnit
DESCRIPTION
QUnit-TAP is a simple plugin for QUnit to produce TAP output.
QUnit-TAP provides TAP output feature for ANY version of QUnit (But there are some exceptions. See TESTED ENVIRONMENTS section below). With QUnit-TAP you can run your QUnit test scripts on your terminal, use TAP Consumers like prove for test automation, pass test output to Jenkins, and so on.
QUnit-TAP runs under headless browsers like PhantomJS, command-line js environments (like SpiderMonkey or Rhino), and CommonJS environments like Node.js, and of cource, runs on your real browser too.
CHANGELOG
- (2016/06/20) Release 1.5.1: Supports QUnit 2.0.0 and above.
- (2014/12/10) Release 1.5.0: Now supports QUnit 1.15.0 and above. Drops support for too old QUnit versions (before-1.0.0).
- (2013/08/08) Release 1.4.0: Now QUnit-TAP exports single
qunitTap
function asmodule.exports
. Therefore,require("qunit-tap")
returnsqunitTap
function itself. Please fix your code if you are using Node.js (or any CommonJS env). Provide tap#unsubscribe method to unsubscribe specified logging events. - (2013/01/10) Release 1.3.0: Deprecate
noPlan
option: Now QUnit-TAP works as withnoPlan: true
by default. If you want to delare plan explicitly, please useQUnit.config.requireExpects
option instead. Stop usingQUnit.tap
as namespace:qunitTap
function now returns an object that represents QUnit-TAP API and customization subject. - (2012/09/13) Release 1.2.0: Reorganize configuration options. Some options are marked as deprecated (with safe fallbacks). Changed output message format a little.
CAUTION for Node.js users
- BC BREAK: Since 1.4.0, QUnit-TAP exports single
qunitTap
function asmodule.exports
. Therefore,require("qunit-tap")
returnsqunitTap
function itself. Please fix your code if you are usingqunit-tap
module via npm.
TESTED ENVIRONMENTS
QUnit version | PhantomJS | Node.js | Rhino |
---|---|---|---|
1.0.0 | OK | OK | OK |
1.1.0 | OK | OK | OK |
1.2.0 | OK | OK | OK |
1.3.0 | OK | OK | OK |
1.4.0 | OK | OK | OK |
1.5.0 | OK | OK | OK |
1.6.0 | OK | OK | OK |
1.7.0 | OK | OK | OK |
1.8.0 | OK | OK | OK |
1.9.0 | OK | OK | OK |
1.10.0 | OK | OK | OK |
1.11.0 | OK | NG | NG |
1.12.0 | OK | NG | NG |
1.13.0 | OK | OK | OK |
1.14.0 | OK | OK | OK |
1.15.0 | OK | OK | OK |
1.16.0 | OK | OK | OK |
1.17.0 | OK | OK | OK |
1.17.1 | OK | OK | OK |
1.18.0 | OK | OK | OK |
1.19.0 | OK | OK | NG |
1.20.0 | OK | OK | NG |
1.21.0 | OK | OK | NG |
1.22.0 | OK | OK | NG |
1.23.0 | OK | OK | NG |
1.23.1 | OK | OK | NG |
2.0.0 | OK | OK | NG |
2.0.1 | OK | OK | NG |
2.1.0 | OK | OK | NG |
2.1.1 | OK | OK | NG |
2.2.0 | OK | OK | NG |
2.2.1 | OK | OK | NG |
2.3.0 | OK | OK | NG |
DOWNLOAD
- Just download qunit-tap.js
- or download archives from qunit-tap tags
- or
git clone git://github.com/twada/qunit-tap.git
- or
npm install qunit-tap
if you use npm. - or
bower install qunit-tap
if you use bower.
You can use QUnit-TAP,
- as a single file, copy lib/qunit-tap.js to anywhere you like.
- as git submodule.
- as a node.js package (via npm).
- as a bower component (via bower).
USAGE
Simple steps to use QUnit-TAP.
- load/require qunit.js
- load/require qunit-tap.js
- Call
qunitTap
function with two or three arguments. The first argument is QUnit object reference, the second is print-like function for TAP output. And the third argument is object to customize default behavior. (Note that the first and second argument is mandatory, and the third argument is optional.) - (optional)
qunitTap
function returns an object that represents QUnit-TAP API.
usage example 1 : embed QUnit-TAP in your HTML (e.g. to run with PhantomJS)
<script type="text/javascript" src="path/to/qunit.js"></script>
<script type="text/javascript" src="path/to/qunit-tap.js"></script>
<script>
qunitTap(QUnit, function() { console.log.apply(console, arguments); });
</script>
<script type="text/javascript" src="path/to/your_test.js"></script>
<script type="text/javascript" src="path/to/your_test2.js"></script>
usage example 2 : use QUnit-TAP with Node.js
First, declare qunitjs and qunit-tap as devDependencies in your package.json, then run npm install
.
{
. . .
"devDependencies": {
"qunitjs": "2.3.0",
"qunit-tap": "1.5.1",
. . .
},
. . .
}
Next, require and configure them.
var QUnit = require('qunitjs');
var qunitTap = require('qunit-tap');
qunitTap(QUnit, function() { console.log.apply(console, arguments); });
QUnit.config.autorun = false;
// your tests
QUnit.load();
usage example 3 : use QUnit-TAP with Rhino/SpiderMonkey
load("path/to/qunit.js");
load("path/to/qunit-tap.js");
// enable TAP output
qunitTap(QUnit, print); //NOTE: 'print' is Rhino/SpiderMonkey's built-in function
// or customize default behavior
// qunitTap(QUnit, print, {showExpectationOnFailure: true, showSourceOnFailure: false});
// configure QUnit to run under non-browser env.
QUnit.config.autorun = false;
load("path/to/your_test.js");
load("path/to/your_test2.js");
QUnit.load();
CONFIGURATION OPTIONS
QUnit-TAP is already configured with reasonable default. To customize, qunitTap
function takes third optional argument as options object to override default behavior. Customization props are,
initialCount
: Initial number for TAP plan line. Default is 1.showExpectationOnFailure
: If true, show 'expected' and 'actual' on failure. Default is true.showTestNameOnFailure
: If true, show test name on failure (supported since QUnit 1.10.0). Default is true.showModuleNameOnFailure
: If true, show module name on failure (supported since QUnit 1.10.0). Default is true.showSourceOnFailure
: If true, show source file name and line number on failure if stack trace is available. Default is true.
Related config option on QUnit
QUnit.config.requireExpects
: If true, QUnit-TAP prints expected assertion count as plan line at the bottom after all the test points have run. Otherwise, QUnit-TAP prints actual assertion count as plan line at the bottom after all the test points have run.
More on customization
You can even override moduleStart
, testStart
, log
, done
, testDone
method in object returned from qunitTap
function. In these methods, this
refers to the object returned from qunitTap
function.
var tap = qunitTap(QUnit, function() { console.log.apply(console, arguments); });
. . .
tap.moduleStart = function(arg) {
// 'this' refers to tap object
this.note('customized: ' + arg.name);
};
TAP OUTPUT EXAMPLE
QUnit-TAP produces output based on TAP specification.
# module: math module
# test: add
ok 1
ok 2
ok 3 - passing 3 args
ok 4 - just one arg
ok 5 - no args
not ok 6 - expected: 7, got: 1, test: add, module: math module
not ok 7 - with message, expected: 7, got: 1, test: add, module: math module
ok 8
ok 9 - with message
not ok 10 - test: add, module: math module
not ok 11 - with message, test: add, module: math module
# module: incr module
# test: increment
ok 12
ok 13
# module: TAP spec compliance
# test: Diagnostic lines
ok 14 - with\r
# multiline
# message
not ok 15 - with\r
# multiline
# message, expected: "foo\r
# bar", got: "foo
# bar", test: Diagnostic lines, module: TAP spec compliance
not ok 16 - with\r
# multiline
# message, expected: "foo
# bar", got: "foo\r
# bar", test: Diagnostic lines, module: TAP spec compliance
1..16
Configuration for this example is,
qunitTap(QUnit, function() { console.log.apply(console, arguments); }, {
showSourceOnFailure: false
});
Explicitly, it's same as,
qunitTap(QUnit, function() { console.log.apply(console, arguments); }, {
initialCount: 1,
showExpectationOnFailure: true,
showTestNameOnFailure: true,
showModuleNameOnFailure: true,
showSourceOnFailure: false
});
RUNNING EXAMPLES
prepare
$ git clone git://github.com/twada/qunit-tap.git
$ cd qunit-tap
to run with PhantomJS
# assume you have built and installed phantomjs
$ cd sample/js/
$ ./phantomjs_test.sh
# with prove
$ prove --exec=sh phantomjs_test.sh
for details, see phantomjs_test.sh
to run with Rhino/SpiderMonkey
# assume you are using rhino
$ cd sample/js/
$ java -jar /path/to/js.jar run_tests.js
for details, see sample/js/
to run under CommonJS environment (includes Node.js)
# assume you are using node.js
$ cd sample/commonjs/
$ node test/math_test.js
$ node test/incr_test.js
# with prove
$ prove --exec=/path/to/node test/*.js
for details, see sample/commonjs/
TROUBLE SHOOTING
qunitjs loading problem on Node
If you are using Node.js (or any CommonJS env) and have an error like this,
$ node test/incr_test.js
node.js:201
throw e; // process.nextTick error, or 'error' event on first tick
^
Error: should pass QUnit object reference. Please check QUnit's "require" path if you are using Node.js (or any CommonJS env).
at qunitTap (/path/to/qunit-tap.js:22:15)
at Object.<anonymous> (/path/to/using_qunit_via_require_module.js)
....
$
Check QUnit's version you are using. QUnit's module export path has changed since QUnit 1.3.0, so you should fix 'require' path to get QUnit Object from 'require' module.
var util = require("util"),
- QUnit = require('./path/to/qunit').QUnit,
+ QUnit = require('./path/to/qunit'),
qunitTap = require('qunit-tap').qunitTap;
qunitTap(QUnit, util.puts);
QUnit.config.autorun = false;
Official QUnit npm module is available since QUnit version 1.9.0, so the best way to get QUnit Object is just use 'qunitjs' module.
var util = require("util"),
- QUnit = require('./path/to/qunit').QUnit,
+ QUnit = require('qunitjs'),
qunitTap = require('qunit-tap').qunitTap;
qunitTap(QUnit, util.puts);
QUnit.config.autorun = false;
for details, see my fix.
qunit-tap loading problem on Node
Similarly, QUnit-TAP exports single qunitTap
function as module.exports
since 1.4.0. Therefore, require("qunit-tap")
returns qunitTap
function itself. Please fix your code if you are using Node.js (or any CommonJS env).
HOW TO RUN REGRESSION TESTS FOR DEVELOPMENT
to run version compatibility suite for PhantomJS
- download and install PhantomJS
- run
./test/version_compatibility_phantomjs.sh
to run version compatibility suite for Node.js
- install Node.js
- install test modules by
npm install
- run
./test/version_compatibility_node.sh
to run version compatibility suite for Rhino
- run
./test/download_rhino.sh
- run
./test/version_compatibility_rhino.sh