The Tesults web app is designed for desktop browsers. Sign up and configure your project on a laptop or desktop. Use the iOS app or Android app to view results on the go.

How to Group and Categorize Failing Tests by Root Cause

When a CI run shows dozens of failures, label each one with a root cause category and group them to see how many distinct problems you actually have

blog-title-image

When you are triaging a CI run with a lot of failures, it helps to know how many of them share a single root cause. Tesults already gives you the failure reason and automated AI analysis for each failing test, so you can see why any individual test failed. Failure Categories, a new feature added at the request of a customer, adds a manual layer on top of that: assign a root cause category to a failing test case, then group your failures by category to see at a glance how many distinct problems you are actually dealing with.

Why add a root cause category to a failure?

Per test, you already have good information. The failure reason and the AI test case analysis tell you why each individual test failed. What that does not show you is how the failures relate to each other across the run. Twenty failures caused by one expired credential is a five minute fix. Twenty failures from twenty unrelated bugs is a bad day. Looking at each failure on its own, the two can be hard to tell apart, and you can end up working through failures one at a time to figure out which share an underlying cause and which are genuinely separate.

A category is a label you apply once, while you are triaging, that captures your judgement about the root cause. Once failures are labelled, you can group by that label and let the view do the counting for you, rather than holding the grouping in your head.

How do you assign a category to a failing test?

Open a failing test case in the results view to bring up its detail drawer. The drawer has a dropdown picker for assigning a category. If the one you want already exists, select it, and the assignment reflects immediately in the results list with no page refresh.

If the category does not exist yet, you can create it inline without leaving the drawer. Type a label, choose its scope, and confirm. The new category is created and assigned to the current test case in a single action, so adding a new category as you triage is one short step rather than a trip into settings.

Categories are organised by scope. A target level category applies to one target (one test job), which suits causes specific to a single suite. A project level category applies across all targets in a project, which suits causes that can show up anywhere, such as infrastructure or environment issues. You can keep up to 100 categories per scope, which leaves plenty of room for a meaningful set without getting unwieldy.

Failing test case drawer in the Tesults results view with the Failure Category dropdown picker open, showing the option to assign or create a category

How do you see failures grouped by category?

The results view header already has sort options for Suite, Name, Result, and Priority. There is now a Failure Category option alongside them. Select it and the view groups the failing test cases by their assigned category. Failures you have not labelled yet collect under an Uncategorized group, so nothing is hidden, and passing tests are left out, keeping the grouped view focused on failures.

This is where the labelling pays off. A run with a long list of failures resolves into a handful of categories, and you can see how the failures distribute across them, which root cause accounts for the most, and how many genuinely separate problems remain. As with assignment, the grouping updates as you label, so the picture comes together while you triage rather than after.

Tesults results view sorted by Failure Category, with failing tests grouped under category headings and an Uncategorized group

Managing categories

Categories are managed from the Tesults configuration menu, where you can rename them as your understanding of a problem sharpens, or remove ones you no longer use. Renaming is separate from assignment, so you can relabel a category without disturbing the test cases already assigned to it, and your set of categories can evolve over time without rework.

Why categorize failures over time?

Grouping a single run is handy. Tracking categories across runs is where the longer term value sits. When the same category keeps reappearing, that is a signal worth acting on. An infrastructure category that shows up every release points at a systemic problem better fixed properly than worked around each time. Categorizing also helps you prioritise: when failures are grouped by root cause, you can see which category is causing the most disruption and address that first, rather than working through a flat list in whatever order it happens to be in. Combined with a retained history of results, the categories build up into a recurring picture of what tends to break. (If you are not yet keeping that history, see how to keep a history of test results instead of losing them after each CI run.)

Failure Categories are available now in the results view. Open a failing test case, assign a category from the drawer, and sort by Failure Category to group your failures by root cause. Full detail is in the results documentation.

Test automation reporting and failure intelligence

Consolidated test reporting for engineering teams. Store, track, and understand test results across every run and system.

Latest Posts

How AI Coding Agents Use Test Results to Verify Their Own Work
How AI Coding Agents Use Test Results to Verify Their Own Work
Why a raw pass or fail is not enough for an agent to trust its own change, and how failure intelligence closes the self-verification loop
Store and View Pytest Results Over Time
Store and View Pytest Results Over Time
Why pytest results vanish after each CI run, and how to keep a durable history you can view, compare, and track over time
How to Group and Categorize Failing Tests by Root Cause
How to Group and Categorize Failing Tests by Root Cause
When a CI run shows dozens of failures, label each one with a root cause category and group them to see how many distinct problems you actually have
How to View JUnit XML Test Results in a Dashboard
How to View JUnit XML Test Results in a Dashboard
Upload JUnit XML to a dashboard in one step, and why a test framework library gives you richer reporting with logs, screenshots, and full history
How to Keep a History of Test Results Instead of Losing Them After Each CI Run
How to Keep a History of Test Results Instead of Losing Them After Each CI Run
Why CI logs and artifacts disappear, what you lose when they do, and how to retain a durable history of every test run
How to Query Test Results With AI Agents Using MCP
How to Query Test Results With AI Agents Using MCP
How to query your CI test data failures, flaky tests and regressions with AI agents using the Model Context Protocol
ROS 2 Test Reporting with Tesults
ROS 2 Test Reporting with Tesults
Native support for the full ROS 2 testing stack — C++, Python, Rust, and beyond
Cypress Test Reporting - Beyond the Built-in Reporters
Cypress Test Reporting - Beyond the Built-in Reporters
What Cypress's built-in reporters give you and where they fall short
Playwright Test Reporting: Beyond the Built-in Reporters
Playwright Test Reporting: Beyond the Built-in Reporters
What Playwright's built-in reporters give you and where they fall short
How AI is Transforming Software Testing and Automation
How AI is Transforming Software Testing and Automation
AI is impacting software testing and automation in a big way. Here’s how AI is reshaping the testing landscape.
What is Automated Regression Testing and How to Do It
What is Automated Regression Testing and How to Do It
Learn about what automated regression testing is, how to do it, benefits, why it matters, tooling, reporting and best practices
Guide to API Automation Testing
Guide to API Automation Testing
What is api automation testing, how to do it, best practices and how to report and analyze test results