test-all-versions
Run your test suite against all published versions of a given dependency.
Usage
Use the tav command to run the tests:
$ tav [options] [<module> <semver> <command> [args...]]Example running node test.js against all versions of the mysql module
that satisfies the ^2.0.0 semver:
tav mysql ^2.0.0 node test.jsoptions
-h/--help- Output usage info-v/--version- Output the tav version-q/--quiet- Don't output stdout from tests unless an error occors--registry=<url>- Use a custom registry (e.g.--registry=https://registry.example.com)--verbose- Output a lot of information while running--dry-run- Run in dry-run mode (no tests will be executed)--compat- Output just module version compatibility - no errors--ci- When runningtavtogether with a.tav.ymlfile, use this argument to only run the tests on a CI server. This allows you to addtavto yournpm testcommand without spending time running tav tests in development.
.tav.yml
If tav is run without specifying a module, it will instead look for a
.tav.yml file in cwd and expect that to contain all its
configuration. This is similar to how Travis CI works with
.travis.yml.
The following is an example .tav.yml file that runs a subset of tests
against all versions of the mysql module that satisfies ^2.0.0 and
all versions of the pg module that satisfies *:
mysql:
versions: ^2.0.0
commands: tape test/mysql/*.js
pg:
versions: "*"
commands:
- node test/pg1.js
- node test/pg2.jsNode.js version
You can optionally specify a node key in case you want to limit which
verisons of Node.js the tests for a specific package runs under. The
value must be a valid semver range:
mysql:
node: ">=1.0.0"
versions: ^2.0.0
commands: node test/mysql.jsPeer Dependencies
If a package or a test needs certain peer dependencies installed in
order to be able to run, use the peerDependencies key. The value can
be either a single value like shown below, or a list of values just like
with the commands key:
graphql-express:
peerDependencies: graphql@0.9.2
versions: ^0.6.1
commands: node test/graphql-express.jsSetup and Teardown
If you need to run a script before or after a command, use the
preinstall, pretest and posttest keys:
graphql:
versions: ^0.7.0
preinstall: rm -fr node_modules/graphql-express
commands: node test/graphql.jsUsage:
preinstall: runs beforenpm installpretest: runs before each command in thecommandslistposttest: runs after each comamnd in thecommandslist
Multiple test-groups per module
If you need multiple test-groups for the same module, use - to specify
an array of test-groups:
mysql:
- versions: ^1.0.0
commands: node test/mysql-1x.js
- versions: ^2.0.0
commands: node test/mysql-2x.jsTest matrix
If you specify environment variables using the env key, the test
commands will be run once per element in the env array. In the
following example node test/mysql.js will run twice for each version
matching ^2.0.0 - once with MYSQL_HOST=server1.example.net
MYSQL_PWD=secret! and once with MYSQL_HOST=server2.example.net.
mysql:
env:
- MYSQL_HOST=server1.example.net MYSQL_PWD=secret!
- MYSQL_HOST=server2.example.net
versions: ^2.0.0
commands: node test/mysql.jsIf more than one test-case is needed for a given module, the environment variables can shared between them using the following syntax:
mysql:
env:
- MYSQL_HOST=server1.example.net MYSQL_PWD=secret!
- MYSQL_HOST=server2.example.net
jobs:
- versions: ^1.0.0
commands: node test/mysql-1x.js
- versions: ^2.0.0
commands: node test/mysql-2x.jsAdvanced versions usage
The versions field takes two types of arguments:
- A string representing a semver-range (e.g.
^2.0.0) - An object with the following properties:
include(required): The semver-range to include in testing. Same effect as theversionsstring.exclude(optional): The semver-range of versions to exclude. Versions matching this range would be removed from theincludelist if present.mode(optional): The way you want to pick versions from the ones resolved based oninclude/exclude. Possible values are:all(default): All versions matching the desired range.latest-majors: Only pick the latest version of each major matching the desired range.latest-minors: Only pick the latest version of each minor matching the desired range.max-{N}(-<algo>): Only pickNnumber of versions within the desired range, where{N}is a number larger than2. The optional-<algo>postfix can be used to specify the algorithm used for picking the versions inbetween. Possible algorithmes are:evenly(default): Evenly space out which versions to pick, always including the first and last version in the desired range.random: PickNversions at random within the desired range.latest: Pick the latestNversions within the desired range.popular: Pick theNmost popular versions based on last weeks download count from npm.
Exampels
Test all versions within ^1.0.0, except 1.2.3:
mysql:
versions:
include: ^1.0.0
exclude: 1.2.3
commands: node test/mysql.jsTest 5 versions in the ^1.0.0 range (evenly spaced within the range):
mysql:
versions:
include: ^1.0.0
mode: max-5
commands: node test/mysql.jsTest the 5 most popular versions in the ^1.0.0 range (based on download count within the last week):
mysql:
versions:
include: ^1.0.0
mode: max-5-popular
commands: node test/mysql.jsExternal registries
Install a module from a custom registry (the default is the npm public registry):
my-custom-module:
registry: https://registry.example.com/
versions: ^2.0.0
commands: node test.jsA registry provided using the command line argument --registry takes precedence.
Whitelist tests with environment variables
You can use the enironment variable TAV to limit which module from the
.tav.yml file to test:
TAV=mysql
This allows you to create a build-matrix on servers like Travis CI where
each module in your .tav.yml file is tests in an individual build. You
can also comma separate multiple names if needed:
TAV=mysql,pg
To see an example of this in action, check out the
.travis.yml
and
.tav.yml
files under the Elastic APM Node.js Agent module.