Features
SpecTracer generates a single self-contained HTML report with five interactive sections and intelligent health indicators. All CSS and JS are inlined — the report is safe to email, archive, or publish as a CI artifact.
Coverage Progress Dashboard
The first thing visible in the report — designed for daily standup discussion. It answers the single most important question: what percentage of our scenarios actually have test coverage?
● Headline Metric
Tested: X / Y scenarios (Z%) — prominently displayed with color coding:
- Green above the configurable green threshold (default 80%)
- Amber between the amber and green thresholds
- Red below the amber threshold (default 50%)
A scenario counts as tested if at least one test result (across any layer) links to it.
☰ Per-Feature Breakdown
Each feature file gets its own mini progress bar with its own tested/untested count. This makes it easy to see which areas of the application are well-covered and which need attention.
⚙ Health Check Cards
Four health indicator cards sit below the progress bar:
Each card shows its status (pass / warn / fail) at a glance.
Test Pyramid Dashboard
A 3-tier visualization of your test suite distribution. This is the fastest way to spot an inverted pyramid — where you have more E2E tests than unit tests.
▲ Per-Layer Metrics
| Metric | Unit | Integration | E2E |
|---|---|---|---|
| Test count | Individual test cases | Individual test cases | Scenarios |
| Duration | Total execution time | Total execution time | Total execution time |
| Pass / Fail / Skip | Percentages | Percentages | Percentages |
⚠ Health Indicators
- Speed Check: Flags if E2E takes too long (configurable: amber at 10 min, red at 30 min by default)
- Ratio Check: Flags if Unit test count ≤ Integration + E2E count (inverted pyramid)
Feature Traceability & Scenario Matrix
A searchable, sortable tree that shows every feature, every scenario, and every layer's test results:
☰ Tree View
Feature: User Login
[=== 75% coverage ===] (3 of 4 scenarios tested)
├─ Scenario: Successful login (tested)
│ Required: unit ✓ integration ✓ e2e ✓
│ Unit: 3 passed · 0.4s
│ Integration: 1 passed · 2.1s
│ E2E: 2 passed · 12.3s
│
└─ Scenario: Invalid password (no coverage)
Required: none
(No test results found)
🔍 Search & Filter
A text input at the top of the matrix. Type a tag name or scenario name and the matrix filters to show only matching entries. Client-side JavaScript — no page reload needed.
⚙ Sortable Columns
Click any column header to sort by name, status, duration, or coverage. Click again to reverse the sort order.
▼ Expandable Layer Details
Click a layer pill to expand and see individual test names, their pass/fail/skip statuses, and expandable failure stack traces for any failed test.
Failure Breakdown
An accordion-style table listing every failed test across all layers. This is your single triage surface — no more switching between test reports.
⚠ What You See
| Column | Description |
|---|---|
| Layer | Which test layer (Unit, Integration, E2E) |
| Feature | Which feature file the scenario belongs to |
| Scenario | Which scenario the test links to |
| Test Name | The name of the individual test |
| Status | Pass / Fail / Skip |
| Duration | Test execution time |
Click any failed test to expand and see the full <failure> or <error> stack trace from the JUnit XML.
Unlinked Tests
Every test result whose tags didn't match any scenario ends up here. This is invaluable for catching:
- Orphaned tests — tests that were written for a scenario that no longer exists
- Mis-tagged tests — tests with typos in their tags (
@FC-42vs@FC-43) - Coverage gaps — areas where test results exist but no feature file scenario describes them
| Column | Description |
|---|---|
| Layer | Which test layer produced the orphan |
| Test Name | The orphaned test's name |
| Tags Found | All tags on the test result |
| Status | Pass / Fail / Skip |
Health Checks
Four visual health indicators sit at the top of the report. They are purely visual — they never affect the exit code.
Progress
% of scenarios with at least one linked test. Thresholds configured via health_checks in config.
Pyramid Ratio
Pass if Unit count > Integration + E2E count. Fail if the pyramid is inverted.
E2E Runtime
Warns/fails if E2E duration exceeds configurable thresholds. Defaults: 10min amber, 30min red.
Unlinked Tests
Pass at 0, warn at 1–3, fail at 4+. Helps enforce tag hygiene.
Tag Linking System
The heart of SpecTracer. Feature files and test results connect through shared tags on scenarios.
Two Kinds of Tags
| Type | Examples | Purpose |
|---|---|---|
| Linking | @FC-42, @regression |
Shared with test results. Any matching tag links the test to the scenario. |
| Requirement | @require-unit, @require-e2e |
Declares which layers must have coverage. Excluded from linking logic. |
Default Behavior
Scenarios without any @require-* tags default to @require-e2e — because if you wrote a Gherkin scenario but didn't declare requirements, it should at least have E2E coverage.
Module-Scoped Requirements
For teams with multi-module codebases, @require-unit:auth and @require-integration:billing let you pin requirements to specific modules.
How It Works
In your config file:
{
"unit": {
"": ["./reports/unit.xml"],
"auth": ["./reports/auth-unit.xml"],
"billing": ["./reports/billing-unit.xml"]
}
}
In your feature file:
@FC-42 @require-unit:auth
Scenario: Authenticated billing access
The @require-unit:auth requirement is only satisfied by results from the "auth" module key. Unscoped results ("") never satisfy it.
@require-e2e intentionally does not accept a module suffix — E2E scenarios typically span multiple modules by nature.
Edge Case Behavior
| Situation | Behavior |
|---|---|
| No config file found | Errors out — a config file is mandatory |
Missing features or output | Errors out — both are required |
| Empty/missing test result path | Silently ignored (zero tests for that layer) |
| Malformed XML or JSON | Aborts with a clear error message |
| Test matches no scenario | Listed in "Unlinked Tests" |
| Scenario matches no test | Shown as "untested" |
@require-* with no matching test | Layer flagged as missing |
| Feature-level tags | Not inherited by scenarios |
| Tag collisions | Result links to ALL matching scenarios |
| Unicode / special characters | Preserved, HTML-escaped |