See why every test failed, in one HTML file.
For .NET and Python. Install one package and every test run writes a report that automatically captures the API calls, screenshots, logs and retries behind each result.
dotnet add package AceReports.Xunit
A real report from a Reqnroll run, not a screenshot. Open a scenario to see its steps, logs, API calls and attempts.
Everything you need to debug a failure, already captured.
You don't add logging code to get a useful report. Ace Reports records what happened while each test ran, and keeps every retry separate.
-
Install and run
The package hooks itself into your test framework. Run
dotnet testorpytestas usual and the report appears in aTestResultsfolder. -
Every API call, automatically
No code needed: every request made with
HttpClientin .NET, orrequestsandhttpxin Python, is captured with method, URL, bodies, status and duration.Authorizationand cookie headers are redacted. -
Screenshots when a test fails
Taken automatically from Playwright, Selenium or Puppeteer. Add your own named screenshots at any step with
Ace.TakeScreenshot("After login")orace.take_screenshot("After login"). -
Retries and flaky tests
Each attempt keeps its own logs, API calls, error and screenshots. A test that passes after an earlier attempt failed is marked flaky, so it doesn't hide.
-
Step-by-step logs
Write
Ace.Info(...)in C# orace.info(...)in Python from anywhere in a test, and each line lands on the test that's running. Gherkin steps from Reqnroll and pytest-bdd are logged for you. -
Search, filter and categories
Filter by status or category, search by test name or argument, and click a bar in the category chart to narrow the table.
-
One file, no server
Styles, data and screenshots are inside a single HTML file. Email it, attach it to a ticket, or publish it as a CI artifact. It opens in any browser.
-
Same report, every language
.NET and Python teams get the identical report, so mixed stacks read results one way. Light, dark or system theme, and anyone reading it can switch.
Your first report in three steps
Ace Reports needs .NET 10. These steps use xUnit; swap the package name for your framework.
Ace Reports needs Python 3.9+ and pytest 7+. pytest-bdd scenarios are covered by the same package.
-
Add the package
In your test project:
dotnet add package AceReports.Xunitpip install pytest-acereports -
Run your tests
From Visual Studio, Rider, or the command line:
From PyCharm, VS Code, or the command line:
dotnet testpytest -
Open the report
The path is printed at the end of the run:
TestResults/AceReport_<timestamp>.html
using AceReports; using AceReports.Configuration; internal sealed class AceReportsStartup : IAceReportsStartup { public void Configure(AceReportsConfiguration options) { Ace.SuiteName("Checkout Regression"); Ace.EnvironmentName("UAT"); Ace.DarkTheme(); } }
Ace.Info("Submitting payment"); Ace.Pass("Payment authorized"); Ace.Fail("Refund should have been rejected"); // Screenshots: automatic on failure, or whenever you like Ace.TakeScreenshot("After login"); // Page created inside the test? Hand it over once. Ace.UseScreenshotSource(page); // Turn reporting off for a project (.csproj): // <EnableAceReports>false</EnableAceReports>
# conftest.py from acereports import ace def pytest_acereports_configure(options): ace.suite_name("Checkout Regression") ace.environment_name("UAT") ace.dark_theme() # Or in pytest.ini: # acereports_suite_name = Checkout Regression
from acereports import ace ace.info("Submitting payment") ace.pass_("Payment authorized") # Screenshots: automatic on failure (pytest-playwright's page # is found by itself), or whenever you like ace.take_screenshot("After login") # Retries (pytest-rerunfailures): # @pytest.mark.flaky(reruns=3) # Turn reporting off for one run: pytest --no-acereports
Pick the package for your framework
Every package produces the same report. Each one hooks into its framework in the way that framework expects, so your existing tests don't change.
| Framework | Package | What gets recorded |
|---|---|---|
| xUnit v3 | AceReports.Xunit | Facts and theories with their arguments, [Trait("Category", …)] tags, and retries through xRetry. |
| NUnit 3.14+ and 4 | AceReports.NUnit | [Test] and [TestCase] values, [Category] tags, and every [Retry] attempt. |
| MSTest 3.10+ and 4 | AceReports.MSTest | [TestMethod] and [DataRow] values, [TestCategory] tags, and every [Retry] attempt. |
| Reqnroll 3 | AceReports.Reqnroll | Scenarios, features, tags and example rows, with each Given/When/Then step as a log line. Runs on any Reqnroll runner. |
| pytest 7+ | pytest-acereports | Test functions and classes, @pytest.mark.parametrize values, markers as category tags, and every pytest-rerunfailures retry. Works with pytest-xdist. |
| pytest-bdd | pytest-acereports | Scenarios, features, tags and example rows, with each Given/When/Then step as a log line. The same package as pytest; nothing extra to install. |
Requirements: .NET 10 for the NuGet packages; Python 3.9+ and pytest 7+ for pytest-acereports.
Using Reqnroll alongside plain tests? Install AceReports.Reqnroll together with your runner's package. Scenarios get their steps and tags, and nothing is reported twice.
Ace Reports Pro
Pro features are in the works. They'll ship as separate add-on packages, and the free packages you already use stay free under the same license.
Work in progressQuestions
Is Ace Reports free?
Yes, for any use, including commercial use inside your company. It's free to use under the PolyForm Perimeter License 1.0.1. The one thing it doesn't allow is building a product that competes with Ace Reports.
Do I need a server or a separate tool to view the report?
No. The report is one self-contained HTML file. Open it in any browser, send it to a teammate, or keep it as a build artifact.
Does it work in CI pipelines?
Yes. The report is written to TestResults like any other test output, so you can publish it as an artifact in GitHub Actions, Azure DevOps, GitLab or Jenkins. Set the environment name with the ACEREPORTS_ENVIRONMENT variable in either language, or with dotnet test -p:AceReportsEnvironment=QA in .NET.
Will my passwords or tokens end up in the report?
Authorization, Cookie and Set-Cookie headers are always redacted. Request and response bodies are recorded as sent, so treat the report like a log file. You can turn API capture off with Ace.CaptureHttpTraffic(false) in .NET or ace.capture_http_traffic(False) in Python.
Can I turn it off for one project?
In .NET, add <EnableAceReports>false</EnableAceReports> to that project's .csproj. In Python, set acereports = false in pytest.ini, or run pytest --no-acereports for a single run. The package stays installed and your tests run as normal.
Which languages and test frameworks are supported?
.NET: xUnit v3, NUnit, MSTest and Reqnroll, from NuGet. Python: pytest and pytest-bdd, from PyPI. Every one produces the same report. More languages are being considered; tell us which one you need by opening an issue.
Can I use it in a product I sell, or under my own brand?
That needs a commercial license: OEM, white-label and redistribution terms are available. Email lambate02@gmail.com with your company name and how you plan to use it.
Found Ace Reports useful?
Support its continued development. Every coffee goes into new framework support, fixes and features, and helps keep the core packages free.