Test Analysis
Analyze test results, triage failures, and track known issues across builds.
Test Launches
UReport provides three view modes for browsing test execution results:
List View
Tabular display with sorting and detailed test information.
- Sortable columns (name, status, duration, start time)
- Configurable column visibility
- Group by failure message, tracking number, issue type, or date
Tree View
Hierarchical display showing package/class/method structure.
- Expandable/collapsible folder hierarchy
- Folder-based organization by file path
Timeline View
Chronological visualization of test execution over time.
- Time-based visualization of parallel test execution
- Identify performance bottlenecks
In addition to the three view modes, a Comparison toggle is available in the Launches toolbar. Enabling it opens a split-panel overlay that shows the same test results side-by-side across multiple product lanes — it works alongside any of the three views above.
The toolbar above the test list gives you several ways to narrow down results:
Text Search
- Search by test name
- Instant filter as you type
Status Filter
- Multi-select pass/fail/skip statuses
- Filter triaged, outage, or custom state tests
Speed Filter
- Filter by Fast, Medium, Slow, Very Slow
- See average and total duration
Behavior Insights
- Click tags in the info bar to filter by behavior
- New Failures, Recently Fixed, Intermittent, Consistently Failing
The Display Settings button (sliders icon) controls history mode, sort order, and visible columns. The Filter button (funnel icon) controls quarantine visibility, speed, group-by, and pinned-only mode.
Quarantine filter modes
The quarantine filter has three modes:
| Mode | Behaviour |
|---|---|
| Hide (default) | Quarantined tests are excluded from the test list |
| Only | Show only quarantined tests — useful when triaging the quarantine backlog |
| Both | Show all tests regardless of quarantine status |
Test Detail Panel
Click any test to open the detail panel on the right. It contains four tabs (or five when multiple lanes are selected in comparison mode):
| Tab | Contents |
|---|---|
| Overview | Status banners (triaged, assigned, quarantined), error message, stack trace, AI analysis, test metadata, quick info |
| Steps | Setup, body, and teardown steps with search and rerun comparison |
| Analytics | Duration history chart with min/avg/max stats |
| Issue History | Full triage history — all past triage records for this test UID |
| Comparison | Per-lane status, metadata, and step diff against the base run — only visible when multiple lanes are selected in the product-lane selector |
At the top of the panel, the ⋮ button opens the test actions menu with options to triage, link as outage, link as custom state, assign, pin, and more.
If the test has been triaged and has a tracking ticket, a tracking number button appears in the header — click it to open the linked issue directly in your issue tracker.
Triage
When a test fails and you know why, you triage it. This records the root cause (issue type + tracking ticket) and attaches it to the failure pattern. Any future test run that fails with the same pattern is automatically matched to the same triage record — so you never have to re-triage the same known issue twice.
Triaged tests are excluded from the "new failures" count and are visually distinguished so the team can focus on genuinely unknown failures.
Open the test actions menu
Click the failed test to open the detail panel, then click the ⋮ button at the top of the panel.
The ⋮ menu is only available to admin and operator roles.
Select an issue type
Hover over "Triage" — a submenu lists the configured issue types (e.g. Defect, Automation Issue). Click the one that describes the root cause.
Issue types are configured in Product Lane Settings → Issue Types. If none are configured, the defaults (Defect and Automation Issue) are used.
Fill in the dialog
The "Triage Test" dialog opens. Fields:
| Field | Description |
|---|---|
| Issue Type | Pre-selected from the submenu. Change if needed. |
| Tracking Ticket | Required. Enter the ticket number (e.g. JIRA-1234). An autocomplete dropdown shows previously used tickets for quick lookup. |
| Compare By Strategy | Controls how future failing tests are matched to this investigation. See "Compare By Strategy" below. |
Apply to similar tests (optional)
The dialog shows other tests in the same build that have the same failure message. Check the ones you want to link together in one step.
Apply to history tests (optional)
Toggle Similarity Matching to also link matching tests from previous builds. Adjust the similarity percentage (60–100%) to control how strict the match is. Matched history tests are shown with their similarity score and error text before you confirm.
Submit
Click "Link Test". The test immediately shows a blue "Triaged test with known issue" banner with the issue type badge. The tracking ticket appears as a button in the detail panel header — click it to open the issue in your tracker.
After linking, the overview tab shows impact counts: how many tests were matched to this investigation this week and in total. Click "Show list" to see all affected tests.
When you triage a test, UReport stores a matching strategy on the record. Every subsequent failing test is compared against all triage records using that strategy to decide if it is already a known issue.
By default, the Compare By selector is not shown in the modal — it is an opt-in feature. An admin must enable it under Settings → Advanced Analysis → Allow Compare By Selection. Until then, every triage record uses the default automatic cascade described below.
Default behavior — automatic cascade
When no explicit strategy is stored, UReport tries each rule in order and stops at the first match:
| Priority | Condition | Match rule |
|---|---|---|
| 1 | Both tests have a token | Token must be identical (exact string match) |
| 2 | Both tests have a failure message | Failure message must be identical; if messages differ but both also have a stack trace, fall back to exact stack trace match |
| 3 | Both tests have a stack trace (no failure message) | Stack trace must be identical |
This cascade means providing a token is the most reliable way to get consistent matching — once a token is present, the failure message is ignored entirely.
Explicit strategies (admin opt-in)
When "Allow Compare By Selection" is enabled, a Compare By selector appears in the triage modal. Users can override the cascade per triage record:
| Strategy | How it matches | Best for |
|---|---|---|
| Failure Message | Exact failure message match only | Stable, deterministic assertions — e.g. Expected 200 but got 404 |
| Token & Stack Trace | Token match first; if no token, falls back to exact stack trace match | Errors whose message varies per run (IDs, timestamps) but always originate from the same code location |
The token field
The token is an optional string you include in the test failure payload. UReport stores and compares it exactly as provided.
Auto-token support by reporter:
| Reporter | Auto-token | Format |
|---|---|---|
| Playwright | Yes — enabled by default (autoToken: true) |
relative/path/file.spec.ts:line — source file and failure line number |
| Jest | No | Set token manually in the failure payload |
| pytest | Yes — enabled by default (ureport_auto_token = true) |
path/to/file.py:line — derived from stack trace, same format as Playwright |
| Mocha / Cypress | No | Set via the ureport({ token }) helper |
| TestNG | No | Not supported — @UReport has no token field |
Choosing a good token value
A useful token identifies the failure's origin in a stable, run-independent way:
- Source file and line number — e.g.
"payment.spec.ts:42" - Error code — e.g.
"ERR_TIMEOUT"or"checkout.payment.null_response" - Class and method name — e.g.
"CheckoutService.processPayment"
Keep tokens stable across runs. Avoid including dynamic values (IDs, timestamps) in the token.
Similarity matching lets you back-fill investigations onto historical failures in previous builds. This is separate from the current-build "similar tests" checkboxes.
- Toggle on Enable Similarity Matching
- Adjust the percentage slider (60–100%) — higher means stricter match
- The dialog shows all history tests that meet the threshold, with a percentage score and highlighted diff of the error message
- On submit, those history tests are also triaged with the same tracking ticket
Similarity matching is not available in the Outage dialog — outage matching is done by exact failure message string.
To update a test that is already triaged, open the ⋮ menu — the "Triage" submenu is still available. Choosing a different issue type re-opens the dialog pre-filled with the existing data.
To remove the triage, open the ⋮ menu and click "Remove Triage". This deletes the triage record immediately.
Link as Outage
An outage is for failures caused by an infrastructure or environment problem — not a bug in the application or test code. Examples: database down, network timeout, CI agent misconfiguration, third-party service unavailable.
When you link a test as an outage, UReport creates an Outage record with the failure message as the match pattern. Every test in that build that produces the same failure message is automatically marked as outage-affected — even tests you did not open individually.
Outage-affected tests are excluded from pass rate calculations, so your quality metrics stay clean during infrastructure incidents.
Outages are scoped to a single build run. When you link a test as an outage, the outage record is stored on that specific build. It does not carry over to future builds — even if the same test fails again with the exact same error message in the next run, it will not be automatically marked as outage.
This is the key difference from "Triage": triaged tests persist globally and automatically match future failing tests across all subsequent builds until removed. Outages must be re-applied each time the infrastructure issue recurs.
Use outages for one-off incidents (a CI environment was down during build #123). Use triage for recurring known failures that need to be suppressed across many builds.
Open the test actions menu
Click the failed test → ⋮ button → hover over "Link as Outage" → select the issue type from the submenu.
Fill in the dialog
The "Link Test as Outage" dialog shows the test's error message for context, then asks for:
- Issue Type — pre-selected, change if needed
- Tracking Ticket — required (e.g. an incident ticket
INC-567)
Review similar tests
The dialog lists other tests in the same build that share the same failure message. These tests will automatically be marked as outage-affected when you submit.
If any of those tests should not be marked as outage (for example, they failed for an unrelated reason), deselect them. Deselected tests are added to an exception list and will not receive the outage tag.
Submit
Click "Link Test". All selected tests are immediately tagged as outage-affected. Their status icons update to reflect the outage state.
If a test is already triaged when you apply an outage, the triage record is removed first and the outage takes precedence.
Open the ⋮ menu on the outage-affected test and click "Remove Outage". This does not delete the outage record — it adds the test to the exception list so only that test is no longer affected. Other tests matched by the same outage pattern remain unaffected.
Link as Custom State
Custom states are product-lane-specific categories you can apply to failing tests when neither "Triaged" nor "Outage" fits your workflow. They are useful for temporary or workflow-specific classifications.
TTL (Time to Live)
Each custom state has a TTL that automatically clears the state after a configured number of days. This prevents tests from being stuck in temporary states indefinitely.
Custom Labels and Colors
Each state has a configurable label, icon color, and key. Custom states appear as colored badges in the test list and detail panel.
The "Link as Custom State" menu item only appears if at least one custom state is configured for the product lane. If you don't see it, ask your admin to configure states in Product Lane Settings.
Custom states are configured per product lane in Settings → Product Lanes → Edit Lane → Custom States:
Go to Settings → Product Lanes
Find the lane you want to configure and click Edit.
Add Custom States
In the Custom States section, add states with:
- Label — display name (e.g. "Under Review", "Waiting for Fix", "Deferred")
- Color — hex color for the badge
- TTL — number of days until the state auto-expires
Example custom states
Open the test actions menu
Click the failed test → ⋮ button → hover over "Link as Custom State" → select the state from the submenu.
Fill in the dialog
The "Link Test as Custom State" dialog opens. Fields:
- Custom State — pre-selected from the submenu
- Tracking Ticket — required
Apply to similar and history tests (optional)
Same as the triage dialog — you can select similar tests in the current build and use similarity matching to back-fill into history.
Submit
Click "Link Test". The state badge appears on the test immediately.
Custom states share the same underlying storage as investigations — a test can only have one active investigation record at a time. Applying a custom state replaces an existing investigation, and vice versa.
Assign Tests
Assigning a test marks a specific person as responsible for investigating or fixing a failure. This is separate from investigating — you can assign without knowing the root cause yet.
Email notification on assignment only works if SMTP is configured. Without email set up, the assignment is still recorded and visible in the UI — but the assignee receives no notification. Configure SMTP in Settings → Notification → Email.
Open the test actions menu
Click the failed test → ⋮ button → click "Assign Test".
Select a user
An assignment dialog opens. Select the team member to assign and confirm.
View assignment
An "Assigned to [username]" banner appears in the test detail panel. To unassign, open the ⋮ menu and click "Unassign Test".
Test Relations
Test relations are metadata labels you attach to tests — teams, components, tags, and custom key-value pairs. Once attached, relations become a first-class dimension you can slice data by across the entire platform:
- Filter tests in Launches — narrow down results to tests owned by a specific team or covering a specific component
- Dashboard widgets — build pass-rate charts, failure trend charts, and heat maps scoped to a team, component, or tag
- Comparison analysis — compare quality across teams or components side by side
- Accountability — assign ownership so the right team sees their failures immediately
Without relations, dashboards and filters can only work at the product lane level. With relations, you get granular visibility into which part of the system is failing and who owns it.
Teams
Associate tests with the team responsible for them.
- Filter failures by team
- Per-team pass rate widgets on dashboards
Components
Tag tests by the application module they cover.
- Authentication, Payment, User Management
- Component health widgets and trend charts
Tags
Flexible labels for test categories.
- Smoke, Regression, Critical, etc.
- Filter and chart by test category
Custom Relations
Arbitrary key-value metadata for org-specific grouping.
- Business domain, priority, feature flag
- Use as filter dimensions in dashboards
All official reporters let you attach relation metadata directly in test code. How those relations are saved to UReport differs by reporter:
| Reporter | Inline (with test result) | Auto-save to relation store | Syntax |
|---|---|---|---|
| Playwright | Yes | Yes — saveRelations: true (default) |
test.info().annotations.push({ type: 'components', description: 'Auth' }) |
| Jest | Yes | Yes — saveRelations: true (default) |
ureport({ components: ['Auth'], teams: ['Frontend'] }) |
| pytest | Yes | Yes — ureport_save_relations = true (default) |
@pytest.mark.ureport_components("Auth", "Payment") |
| Mocha / Cypress | Yes | Yes — saveRelations: true (default) |
ureport({ components: ['Auth'] }) |
| TestNG | Yes | Yes — ureport.saveRelations=true (default) |
@UReport(components = "Auth", teams = "Frontend") |
Inline means relations are submitted with each test result. Auto-save to relation store means the reporter additionally calls POST /api/test_relation after the run, storing relations once per uid. To disable auto-save: set saveRelations: false (Playwright/Jest/Mocha), ureport_save_relations = false (pytest), or ureport.saveRelations=false (TestNG).
There are two ways to add relations:
Option 1: Inline with test results
Include an info object in each test when calling POST /api/test/multi.
- Takes effect per-submission
- Best for dynamic relations that change per run
- Overrides pre-configured relations if both exist
Option 2: Pre-configured relations
Create a relation record once via POST /api/test_relation.
- Stored once per product + type + uid
- Automatically matched on every submission
- Best for stable relations that rarely change
Option 1: Inline with test results
{
"tests": [
{
"build": "65abc123def456789",
"uid": "checkout-payment-001",
"name": "CheckoutTest.testPaymentFlow",
"status": "PASS",
"info": {
"file": "tests/checkout/payment.spec.ts",
"path": "tests/checkout",
"components": ["Checkout", "Payment"],
"teams": ["E-Commerce"],
"tags": ["smoke", "critical"],
"priority": "P1"
}
}
]
}
Option 2: Pre-configured relations
{
"uid": "checkout-payment-001",
"product": "ECommerce",
"type": "E2E",
"file": "tests/checkout/payment.spec.ts",
"path": "tests/checkout",
"components": [{"name": "Checkout"}, {"name": "Payment"}],
"teams": [{"name": "E-Commerce"}],
"tags": [{"name": "smoke"}, {"name": "critical"}],
"customs": {
"priority": "P1",
"feature": "Payment Processing"
}
}
If you use both methods, inline relations (Option 1) take priority and override pre-configured relations for that test run.
Test Behavior Analysis
UReport automatically analyzes test execution history to surface patterns. Behavior tags appear as clickable chips in the filter bar — click one to filter to only those tests.
| Behavior | Description | Use Case |
|---|---|---|
| New Failures | Tests that recently started failing | Identify regressions from recent changes |
| Recently Fixed | Tests that were recently resolved | Track successful bug fixes |
| Intermittent | Tests with inconsistent results across runs | Identify flaky tests needing stabilization |
| New Tests | Recently added test cases | Monitor new test coverage |
| Consistently Failing | Tests that fail across multiple consecutive builds | Identify persistent issues with no active investigation |
| Stable | Tests with consistent pass/fail patterns | Identify reliable tests |
Performance Insights
UReport automatically categorizes test speed based on duration. Thresholds differ between API and UI tests:
API Test Thresholds
| Category | Duration |
|---|---|
| Fast | Under 1 second |
| Medium | 1–3 seconds |
| Slow | 3–5 seconds |
| Very Slow | Over 5 seconds |
UI Test Thresholds
| Category | Duration |
|---|---|
| Fast | Under 30 seconds |
| Medium | 30–60 seconds |
| Slow | 60–120 seconds |
| Very Slow | Over 120 seconds |
Test type is determined from the product lane's type field. Types containing "UI", "WEB", or "BROWSER" use UI thresholds. Types containing "API", "REST", or "SERVICE" use API thresholds. Unknown types default to API thresholds.
Comparison Analysis
Comparison View shows the same test side-by-side across multiple product lanes. Use it to isolate environment-, browser-, or version-specific failures.
Cross-Browser
Compare results across different browsers to identify browser-specific failures.
Environment
Compare Dev, Staging, and Production to validate environment parity.
Team Performance
Compare pass rates across teams to surface quality patterns.
Version
Compare across application versions to track regressions.
In the test detail panel, the Comparison tab (visible when multiple lanes are selected) shows per-lane status, metadata, and a step-by-step diff against the base run.
User Favorites & Pinning
Pinning marks a test so you can easily find it again. Pin status is personal and saved to your account on the server — it persists permanently until you manually unpin, surviving logout, browser refresh, and device changes.
Pin a test
- Click the test → ⋮ button → "Pin Test"
- To unpin, open the same menu → "Unpin Test"
- Pinned tests show a thumbtack indicator
Show only pinned tests
- Click the Filter button (funnel icon)
- Enable "Show Pinned Only"
- Combine with other filters as needed
Use pinning to track critical tests you are actively monitoring or investigating across multiple build runs.