The easiest way to run tests in a browser from the command line. Just pipe some JS into this command. A spiritual successor to tape-run.
This uses playwright under the hood.
Usage: tapout [options]
Options:
-t, --timeout <ms> Timeout in milliseconds (default: 10000)
-b, --browser <name> Browser to use: chromium, firefox, webkit, edge (default: chromium)
-r, --reporter <name> Output format: tap, html (default: tap)
--outdir <path> Output directory for HTML reports (default: current directory)
--outfile <name> Output filename for HTML reports (default: index.html)
-h, --help Show this help message
Examples:
cat test.js | tapout --timeout 5000
cat test.js | tapout --browser firefox
cat test.js | tapout -b webkit -t 3000
cat test.js | tapout --browser edge
cat test.js | tapout --reporter html
cat test.js | tapout --reporter html --outdir ./reports
cat test.js | tapout --reporter html --outfile my-test-results.html
npm i -D @substrate-system/tapout
Pipe some Javascript to this command.
cat ./test/index.js | npx tapout
Use shell redirection
npx esbuild --bundle ./test/index.ts | npx tapout | npx tap-spec
window.testsFinished
The test browser will automatically close within few seconds of no activity.
To explicitly end the tests, set a property on window
.
import { test } from '@substrate-system/tapzero'
test('example test', (t) => {
t.ok(true)
})
test('all done', () => {
// This will cause the tests to exit immediately.
// @ts-expect-error tests
window.testsFinished = true
})
After npm install
, you will need to do an npx playwright install
.
For example, in Github CI,
# ...
- name: npm install, build
run: |
npm install
npm run build --if-present
npm run lint
npx playwright install --with-deps
env:
CI: true
# ...
By default writes to stdout
.
cat ./test/index.js | npx tapout --reporter html > index.html
open index.html # View the generated report
--reporter html
with no other options -> output HTML to stdout--reporter html --outfile filename.html
-> save to filename.html
in
current directory--reporter html --outdir ./reports
-> save to ./reports/index.html
--reporter html --outdir ./reports --outfile custom.html
-> save to
./reports/custom.html
-b
, --browser
Pass in the name of a browser to use. Default is Chrome.
Possibilities are chromium
, firefox
, webkit
, or edge
.
-t
, --timeout
Pass in a different timeout value. The default is 10 seconds.
The timeout respects the auto-finish behavior:
-t
flag): Auto-finish triggers after a short delay (1-2 seconds) when no test activity is detected-t
): Auto-finish uses 80% of the specified timeout, giving tests more time to complete naturallycat test.js | npx tapout --timeout 5000
Error Detection: tapout automatically detects and reports test failures from:
Tests will exit with code 1 if any errors are detected, making it perfect for CI/CD pipelines.
-r
, --reporter
Choose the output format. Default is TAP.
For HTML output, you will want to redirect stdout to a file.
cat test.js | npx tapout --reporter html > test-output.html
Available reporters:
tap
- TAP output (default) - Standard Test Anything Protocol formathtml
- Generate an HTML report file with beautiful, responsive design# Generate HTML report
cat test.js | npx tapout --reporter html
# Generate HTML and output to stdout
cat test.js | npx tapout --reporter html > my-report.html
# Use TAP output (default)
cat test.js | npx tapout
# Customize output location
cat test.js | npx tapout --reporter html --outdir ./reports
cat test.js | npx tapout --reporter html --outfile my-test-results.html
cat test.js | npx tapout --reporter html --outdir ./reports --outfile custom-report.html
The HTML reporter generates an index.html
file by default with:
Output Control:
--outdir <path>
- Specify where to save the HTML report
(default: current directory)--outfile <name>
- Specify the filename for the HTML report
(default: index.html)--outdir
nor --outfile
is specified, HTML output is sent
to stdoutGitHub Pages Integration: The generated HTML file is self-contained and can be easily hosted on GitHub Pages or any static hosting service. Simply commit the HTML file to your repository.
# Example CI workflow
npm test 2>&1 | npx tapout --reporter html --outfile test-results.html
git add test-results.html
git commit -m "Update test results"
git push
Write tests for the browser environment.
End the tests explicity with window.testsFinished = true
.
Else they time out naturally, which is ok too.
// test/index.ts
import { test } from '@substrate-system/tapzero'
test('example', t => {
t.ok(document.body, 'should find a body tag')
})
test('all done', t => {
// @ts-expect-error explicitly end
window.testsFinished = true
})
Run the tests on the command line.
npx esbuild ./test/index.ts | npx tapout
See the test/
directory.
npm test
# HTML reporter examples
npm run test:simple -- --reporter html # Generate HTML report
npm run test:complex -- --reporter html # Complex test HTML report