Precept 0.10.0

Precept.Reporting.ReportPortal

ReportPortal reporting for Precept: a launch per run, a suite per feature, a test item per scenario, with logs and artifacts attached.

dotnet add package Precept.Reporting.ReportPortal
public sealed class Startup : IPreceptStartup
{
    public void ConfigureServices(IServiceCollection services, PreceptSettings settings) =>
        services.AddPreceptReportPortalReporting();
}
{
  "Reporting": {
    "ReportPortal": {
      "Endpoint": "https://rp.example.com",
      "Project": "acme_regression",
      "LaunchName": "Checkout regression",
      "Attributes": { "suite": "regression" }
    }
  }
}

Supply the API key from CI as PRECEPT_REPORTING__REPORTPORTAL__APIKEY; a key in a committed precept.json is a key anyone with the repository can post launches with.

Launches are opened from a build agent only. A developer's run reports nothing and asks for nothing — the reporter is never started, so the API key that machine does not have is not an error there. Add { "Reporting": { "CiOnly": false } } to precept.local.json to report from your own machine, and see CI and local runs for how a run is recognised as CI.

Each .feature becomes a suite, named by its feature title rather than by the class Reqnroll generated from it and described by the narrative under that title, and each scenario a test item tagged with the scenario's own Gherkin tags. Whatever the test logged goes up as log entries, a failure as an error with its stack trace, and the files a failing test captured — Playwright screenshots, traces, request logs — as attachments on the item, so a failure in the dashboard opens with the screenshot already there. Only a failing test's files are attached unless AttachOnSuccess says otherwise, and only files up to MaxAttachmentBytes — 8 MB by default, which a Playwright trace often exceeds; a larger file is skipped without an error. See what gets attached. Skipped tests are closed as NOT_ISSUE so nobody has to triage a test that was never meant to run. A scenario that passed only after a retry is one test item carrying its attempt count, not a chain of them: ReportPortal's own retry flag nests an item under an earlier one and leaves it out of the launch's statistics, and the earlier one is a report Precept never sends.

Set "LaunchMode": "DEBUG" alongside "CiOnly": false to keep the launches a developer's machine does send out of the project's statistics.

A run on an Azure DevOps agent describes its launch with a link back to the build, from the variables the agent already sets (BUILD_BUILDID, SYSTEM_TEAMFOUNDATIONCOLLECTIONURI, SYSTEM_TEAMPROJECT) — so a launch somebody opens from a chat message leads back to the pipeline run that produced it. It is appended to your Description rather than replacing it, and a run anywhere else — a developer's machine, another CI — has nothing appended.

The link goes the other way too: the launch's own page is posted to the run's PreceptRunLinks as soon as it is opened, so a run that also reports to Teams gets an Open ReportPortal button on its card. Nothing to configure — a launch id is assigned by the server, so it could not have been. See linking a run's reports to each other.

Reporting runs on a queue of its own, so a slow ReportPortal deployment costs the run nothing until the very end, where it gets Reporting:ShutdownTimeoutSeconds to finish sending.


Part of Precept, a .NET 10 test automation framework. Full documentation: reporting · configuration · artifacts

Precept 0.10.0 · MIT · © 2026

Esc