Skip to main content

VelvetReport — Universal JUnit XML to self-contained offline HTML test reporter. Works with pytest, Playwright, Maven, Jest, Cypress, Robot Framework.

Project description

UniReport — Universal Test Reporter

PyPI npm Maven Central License: MIT Tests

One install. Any language. Beautiful reports. Zero server.

UniReport turns any JUnit XML into a stunning, self-contained HTML dashboard — automatically after every test run. No upload. No internet required. 100% offline.


Install

pip install unireport                          # Python
npm install unireport --save-dev               # Node.js
# Java: dev.unireport:unireport:2.0.0 in pom.xml

Quickstart

Python (pytest)

# pytest.ini
[pytest]
vReport_Title               = My Project
vReport_output              = reports
vReport_history             = reports/.history
vReport_email_report_enable = false
pytest tests/
# → reports/velvetreport.html  ✓

Node.js

{ "scripts": { "posttest": "unireport generate junit.xml ./reports" } }
npm test
# → reports/unireport.html  ✓

Java

UniReport.generate("target/surefire-reports", "target/unireport");
mvn test
# → target/unireport/unireport.html  ✓

Report Features

Metrics & KPIs

  • 12 KPI cards — Total, Passed, Failed, Errors, Skipped, Retry Count, Pass Rate, Avg Test Time, Total Duration, Stability Score (0–100), Flaky %, Failure Reproducibility
  • Risk badge — STABLE / UNSTABLE / HIGH RISK
  • Pass rate visual bar with exact counts

Test Details

  • Expandable suite tree with per-test tabs: Error, Steps, Logs, Console, Attachments, stderr, Info
  • Run history dots — last 5 statuses (🟢🔴🟡) per test
  • FLAKY badge — auto-detected vs previous run
  • Live search + filter by status (All / Passed / Failed / Skipped / Flaky)

Visual Analysis

  • Result Heatmap — test × spec file grid, colour-coded by status
  • Mind Map (sidebar) — Root → Suite → Describe → Test, always visible, collapsible
  • Individual Test History Cards — one card per test, mini bar chart (last 15 runs) + collapsible run table
  • Failure Analysis — auto-classified: Assertion / Timeout / Network / Script

Charts (10 total)

Pass/Fail donut · Duration histogram · Test Volume & Outcome Trends (line) · Execution Duration Trends (area) · Duration by Spec File (bar) · Duration by Describe Block (stacked column) · Worker Distribution (bar) · Browser Distribution (pie) · Top 10 Slowest · Suite Health

History & Trends

  • Auto-saved to .history/ — up to 30 runs, ~3 KB each
  • Pass rate trend line + run breakdown bar
  • Commit .history/ to git for team-wide trends

Environment Detection

  • Local / CI / Sharded environment display
  • Worker count, browser list, framework auto-detection

Export

  • Download as HTML, CSV, JSON, or lightweight Email HTML summary

Configuration Reference

Python

Key CLI flag Default Description
vReport_Title --vReport-title XML filename Report title
vReport_output --vReport-output reports Output folder
vReport_history --vReport-history reports/.history History folder
vReport_xml --vReport-xml .velvetreport_junit.xml XML path
vReport_open --vReport-open false Auto-open browser
vReport_disable --vReport-disable false Skip generation
vReport_email_report_enable --vReport-email-report-enable false Attach email-ready HTML summary

Node.js CLI

unireport generate <xml> [output] [--title text] [--history dir] [--open]
unireport clear-history [dir]
unireport info / --version

Java API

UniReport.builder()
    .xmlPath("target/surefire-reports")
    .outputDir("target/unireport")
    .historyDir("target/unireport/.history")
    .title("My Suite")
    .openBrowser(false)
    .generate();

Embedding Attachments

# Python
import base64
b64 = base64.b64encode(page.screenshot()).decode()
print(f"[[ATTACHMENT|screenshot.png|{b64}]]")
// Node.js
const b64 = (await page.screenshot()).toString('base64');
process.stdout.write(`[[ATTACHMENT|screenshot.png|${b64}]]\n`);
// Java
byte[] shot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);
System.out.println("[[ATTACHMENT|screenshot.png|" + Base64.getEncoder().encodeToString(shot) + "]]");

Architecture — One Change, All Platforms

core/src/template-parts/ ← Modular HTML, CSS, and browser runtime source
core/src/parser.js       ← JUnit XML parser
core/src/history.js      ← History + email
        ↓
node scripts/build.js    ← Compiles to all 3 platforms
        ↓
packages/pip/            → PyPI
packages/npm/            → npmjs.com
packages/maven/          → Maven Central

Making changes:

# Edit core/src/template-parts/* (or parser.js / history.js)
node scripts/build.js          # rebuild all platforms
node scripts/build.js --verify # rebuild + run 24 self-tests

Publishing

node scripts/build.js                   # build all 3
npm run publish:pip                     # → PyPI
npm run publish:npm                     # → npmjs.com
cd packages/maven && mvn deploy         # → Maven Central

Supported Frameworks

pytest · Playwright · Robot Framework · Jest · Cypress · Mocha · JUnit 5 · TestNG · Maven Surefire · Gradle · RSpec · PHPUnit · gotestsum · xUnit · NUnit · and any tool that outputs JUnit XML.


License

MIT © UniReport Contributors


Keywords: junit xml report generator, html test report, pytest html report, playwright test report, jest html reporter, cypress report, allure alternative, extent report alternative, offline html test report, self-contained test report, CI test dashboard, test history tracking, flaky test detection, test automation reporting, java test report, python test report, junit 5 report, maven surefire report

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

velvet_report-2.1.0.tar.gz (118.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

velvet_report-2.1.0-py3-none-any.whl (124.3 kB view details)

Uploaded Python 3

File details

Details for the file velvet_report-2.1.0.tar.gz.

File metadata

  • Download URL: velvet_report-2.1.0.tar.gz
  • Upload date:
  • Size: 118.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.6

File hashes

Hashes for velvet_report-2.1.0.tar.gz
Algorithm Hash digest
SHA256 0ab2f22eddb61cbd2c55456b0507fbb82a240d4250ed638d7a7f141770db9072
MD5 81adbc35ee664cdd227afae5ac28425b
BLAKE2b-256 4ea84b77d88d80922c69647a80d5e613f739ed4a58ab6087004565e548e9848d

See more details on using hashes here.

File details

Details for the file velvet_report-2.1.0-py3-none-any.whl.

File metadata

  • Download URL: velvet_report-2.1.0-py3-none-any.whl
  • Upload date:
  • Size: 124.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.6

File hashes

Hashes for velvet_report-2.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8df3d95185ec239bc78bb524fe6749c38c6d61e335ae18b5635adfe512c27a6c
MD5 53b1017635466e634eb1c5004c6823ed
BLAKE2b-256 cc4fbb978f18969b433598ca3087f36922fcbb6cd415262aefed8740ae0a6209

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page