tap-producing test harness for node and browsers
var test = require('tape');
test('timing test', function (t) {
t.plan(2);
t.equal(typeof Date.now, 'function');
var start = Date.now();
setTimeout(function () {
t.equal(Date.now() - start, 100);
}, 100);
});
$ node example/timing.js
TAP version 13
# timing test
ok 1 should be equal
not ok 2 should be equal
---
operator: equal
expected: 100
actual: 107
...
1..2
# tests 2
# pass 1
# fail 1
The assertion methods in tape are heavily influenced or copied from the methods in node-tap.
var test = require('tape')
Create a new test with an optional name
string. cb(t)
fires with the new
test object t
once all preceeding tests have finished. Tests execute serially.
If you forget to t.plan()
out how many assertions you are going to run and you
don't call t.end()
explicitly, your test will hang.
Generate a new test that will be skipped over.
Declare that n
assertions should be run. t.end()
will be called
automatically after the n
th assertion. If there are any more assertions after
the n
th, or after t.end()
is called, they will generate errors.
Declare the end of a test explicitly.
Generate a failing assertion with a message msg
.
Generate a passing assertion with a message msg
.
Generate an assertion that will be skipped over.
Assert that value
is truthy with an optional description message msg
.
Aliases: t.true()
, t.assert()
Assert that value
is falsy with an optional description message msg
.
Aliases: t.false()
, t.notok()
Assert that err
is falsy. If err
is non-falsy, use its err.message
as the
description message.
Aliases: t.ifError()
, t.ifErr()
, t.iferror()
Assert that a === b
with an optional description msg
.
Aliases: t.equals()
, t.isEqual()
, t.is()
, t.strictEqual()
,
t.strictEquals()
Assert that a !== b
with an optional description msg
.
Aliases: t.notEquals()
, t.notStrictEqual()
, t.notStrictEquals()
,
t.isNotEqual()
, t.isNot()
, t.not()
, t.doesNotEqual()
, t.isInequal()
Assert that a
and b
have the same structure and nested values using
node's deepEqual() algorithm
with strict comparisons (===
) on leaf nodes and an optional description
msg
.
Aliases: t.deepEquals()
, t.isEquivalent()
, t.same()
Assert that a
and b
do not have the same structure and nested values using
node's deepEqual() algorithm
with strict comparisons (===
) on leaf nodes and an optional description
msg
.
Aliases: t.notEquivalent()
, t.notDeeply()
, t.notSame()
,
t.isNotDeepEqual()
, t.isNotDeeply()
, t.isNotEquivalent()
,
t.isInequivalent()
Assert that a
and b
have the same structure and nested values using
node's deepEqual() algorithm
with loose comparisons (==
) on leaf nodes and an optional description msg
.
Aliases: t.looseEqual()
, t.looseEquals()
Assert that a
and b
do not have the same structure and nested values using
node's deepEqual() algorithm
with loose comparisons (==
) on leaf nodes and an optional description msg
.
Aliases: t.notLooseEqual()
, t.notLooseEquals()
Assert that the function call fn()
throws an exception.
Assert that the function call fn()
does not throw an exception.
Create a subtest with a new test handle st
from cb(st)
inside the current
test t
. cb(st)
will only fire when t
finishes. Additional tests queued up
after t
will not be run until all subtests finish.
Create a new test harness instance, which is a function like test()
, but with
a new pending stack and test state.
By default the TAP output goes to console.log()
. You can pipe the output to
someplace else if you htest.createStream().pipe()
to a destination stream on
the first tick.
Like test(name, cb)
except if you use .only
this is the only test case
that will run for the entire process, all other test cases using tape will
be ignored
Create a stream of output, bypassing the default output stream that writes
messages to console.log()
. By default stream
will be a text stream of TAP
output, but you can get an object stream instead by setting opts.objectMode
to
true
.
You can create your own custom test reporter using this createStream()
api:
var test = require('tape');
var path = require('path');
test.createStream().pipe(process.stdout);
process.argv.slice(2).forEach(function (file) {
require(path.resolve(file));
});
You could substitute process.stdout
for whatever other output stream you want,
like a network connection or a file.
Pass in test files to run as arguments:
$ node tap.js test/x.js test/y.js
TAP version 13
# (anonymous)
not ok 1 should be equal
---
operator: equal
expected: "boop"
actual: "beep"
...
# (anonymous)
ok 2 should be equal
ok 3 (unnamed assert)
# wheee
ok 4 (unnamed assert)
1..4
# tests 4
# pass 3
# fail 1
Here's how you can render an object stream instead of TAP:
var test = require('tape');
var path = require('path');
test.createStream({ objectMode: true }).on('data', function (row) {
console.log(JSON.stringify(row))
});
process.argv.slice(2).forEach(function (file) {
require(path.resolve(file));
});
The output for this runner is:
$ node object.js test/x.js test/y.js
{"type":"test","name":"(anonymous)","id":0}
{"id":0,"ok":false,"name":"should be equal","operator":"equal","actual":"beep","expected":"boop","error":{},"test":0,"type":"assert"}
{"type":"end","test":0}
{"type":"test","name":"(anonymous)","id":1}
{"id":0,"ok":true,"name":"should be equal","operator":"equal","actual":2,"expected":2,"test":1,"type":"assert"}
{"id":1,"ok":true,"name":"(unnamed assert)","operator":"ok","actual":true,"expected":true,"test":1,"type":"assert"}
{"type":"end","test":1}
{"type":"test","name":"wheee","id":2}
{"id":0,"ok":true,"name":"(unnamed assert)","operator":"ok","actual":true,"expected":true,"test":2,"type":"assert"}
{"type":"end","test":2}
With npm do:
npm install tape
MIT