A tiny test runner focused on simplicity and speed
$ xv ./src
src/add.test.js: 0.103ms
src/sub.test.js: 0.064ms
Extracted from lowdb. One of the fastest test runner according to this benchmark.
With so many existing alternatives, why another test runner?
I wanted and needed something dead simple. Usually test runner/frameworks require to read multi-page documentation, hide logs and transform errors, can have complex configuration to support a wide variety of cases.
xv
takes the opposite approach and makes you productive faster by being simpler. In fact, the complete documentation about xv
fits this page and its code is only ~80 lines. Give it a try.
npm install xv --save-dev
Create a test file and use Node's built-in assert
module:
// src/add.test.js
import assert from 'node:assert/strict'
import add from './add.js'
// This is plain Node code, there's no xv API
export function testAdd() {
assert.equal(add(1, 2), 3)
}
Edit package.json
:
{
"scripts": {
"test": "xv src"
}
}
Run tests:
npm test # run all test files in ./src
npx xv src/add.test.js # run a single test file
By default, xv will look for files named: *.test.js
, test.js
, *.test.ts
and test.ts
With TypeScript + ts-node
npm install ts-node --save-dev
{
"scripts": {
"test": "xv --loader=ts-node/esm src"
}
}
Compile your .ts
files using tsc
and run xv
on compiled .js
files.
For example, assuming your compiled files are in lib/
, edit package.json
to run xv
after tsc
:
{
"scripts": {
"test": "tsc && xv lib"
}
}
If you're publishing to npm, edit package.json
to exclude compiled test files:
{
"files": [
"lib",
"!lib/**/*.test.js",
"!lib/**/test.js"
]
}
// src/add.test.js
const assert = require('assert').strict;
const add = require('./add')
exports.testAdd = function() {
assert.equal(add(1, 2), 3)
}
xv doesn't have a watch mode. If the feature is needed, it's recommended to use tools like watchexec or chokidar-cli to re-run xv when there are changes.