skip to content

Delivery and Verdicts

What a team actually does with a finished report: push it to a store, generate a site someone can open, gate a build on it, and read its tiles. Interviewers probe the step most teams skip.

on this pageshow

explore

questions

18

A CI job consolidates several suites into one Allure report and then has to decide whether the build passes. What is a report-level quality gate, and where in Allure is that verdict computed?

level: juniorimportance: must knowfreq 58%

answer

  1. a verdict taken after consolidation
  2. not the runner's exit status
  3. one Allure major ships a command
  4. quality-gate prints breaches and exits

basics

~20 s

A report-level quality gate is a threshold checked against the whole aggregated report, not against one runner's outcome. Allure computes it in the 3.x line only, through its quality-gate command, which exits non-zero when a rule is breached.

solid answer

~40 s

A report-level gate is a second verdict, taken after results have been consolidated. The runner's own exit status is per-invocation, so a sharded suite produces several of them and none sees the others. The gate reads the assembled report and evaluates thresholds over all of it: a ceiling on total failures, a floor under how many tests actually ran, a minimum success rate, a requirement that every intended environment produced results. In Allure this ships in the 3.x line as the `quality-gate` command. It reads the configured `qualityGate` rules, validates the results, prints every breached rule with its actual and expected value, and exits non-zero. Allure 2 has no such command. The breached rules are also carried into the generated report, so the verdict is readable without digging out the CI log.

go deeper

for a junior

Be able to say plainly that this verdict is computed over the finished, consolidated report rather than by the process that ran the tests, and name the Allure 3 command that computes it.

for a middle

Explain what a gate can express that a single invocation cannot: totals across shards, a floor under how many tests ran, and comparisons against a previous run.

for a senior

Show that you know which results the gate quietly excludes before any rule runs, and that a gate with no rules configured must refuse rather than pass.

for a principal

Be ready to argue where this decision belongs at all, in the report tool or elsewhere, and what each placement costs in ownership and in feedback time.

## Two different verdicts on the same run A pipeline can take two separable decisions about a test run. The **first** belongs to whatever executed the tests. A process ends, and its exit status reports whether that process saw a failure. It is per-invocation and blind past its own boundary: shard a suite across six workers and you get six such verdicts, none of which can see the other five, and none of which knows anything about the run before this one. The **second** is taken *after* the results have been collected into one place. Every shard's output is read into a single store, superseded retry attempts are folded away, results you have already agreed to ignore are set aside, and only then is a threshold evaluated. That second decision is what "report-level quality gate" names. Because it runs over the assembled report, it can express conditions the first structurally cannot: - a ceiling on the **total** number of failures across the whole report, not per shard; - a floor under how many tests actually ran, which catches the empty or half-collected run that would otherwise pass because nothing failed; - a minimum success rate over everything; - a requirement that each environment you meant to cover produced at least one result; - a comparison of a measured value against the same value in a previous run. | | the runner's own exit status | the report-level gate | |---|---|---| | scope | one invocation | the whole consolidated report | | sees other shards | no | yes | | sees the previous run | no | yes, where a rule asks for it | | expressible condition | "something failed" | a threshold over the aggregate | ## Where Allure computes it **Quality Gate is an Allure 3 feature.** The 3.x CLI carries a `quality-gate` command. Allure 2 has no equivalent: its whole command set is `generate`, `serve`, `open` and `plugin`. This matters more than it sounds, because "quality gate" is a phrase that gets attached confidently to results servers that do not implement one. Do not assume a tool has the feature merely because it stores and displays test results; if you need a gate in front of a store that has none, you compute it yourself from what that store's API returns. The command's shape is straightforward: 1. It reads the Allure configuration from the working directory -- an `allurerc` file -- and takes the `qualityGate` section from it. 2. If neither the configuration nor the command line supplies any rule, it refuses to run rather than passing vacuously. A gate that silently does nothing is worse than no gate. 3. It resolves the results directories it was pointed at, defaulting to the usual `allure-results` layout. 4. It validates the results against each rule group. 5. It prints every breached rule with the value it found and the value it expected, then exits non-zero. With nothing breached it exits zero. The command line can also carry a gate on its own, without a configuration file: `--max-failures`, `--min-tests-count` and `--success-rate` each set the matching built-in rule, and when any of them is present it takes priority over what the configuration said. `--fast-fail` makes the command stop at the first breach instead of collecting them all. ## What the gate is allowed to ignore Two categories of result are removed before any rule sees them, and both are worth knowing because they change the numbers a rule reports: - **Superseded retry attempts.** When several attempts of the same test are present, only the surviving one is validated. The earlier ones do not count toward a failure ceiling. - **Failures you have already resolved.** Allure 3 reads a known-issues file, pointed at with `--known-issues` or through the `resolutions` configuration, and each rule there resolves a matching failure into a category. Results resolved as `muted` or `accepted` are excluded from validation; results resolved as `issue` are **not** -- they are still failures, they simply carry a link to the ticket. ## Where the verdict ends up The exit code is the part CI consumes, but it is not the whole output. The breached rules are also carried into the generated report itself, so someone who opens the report sees which rule failed, what it expected, what it actually found and which tests were implicated -- rather than having to reconstruct that from a console log that may already have scrolled away. That is the practical argument for computing the verdict here at all: the decision and the evidence for it end up in the same artefact, and the artefact is the thing a human opens tomorrow morning.

  • If the gate is only computed after the report is assembled, what have you already paid for by the time it says no?
    The full run and the collection step. A report-level gate is deliberately late: it trades early feedback for a decision made over complete information. Keep the cheap, early checks where they are, use the gate for conditions that only make sense over the aggregate, and reach for the early-exit option only when you genuinely cannot afford to wait.
  • The gate refuses to run and reports that it is not configured. What are the two places it looked?
    The `qualityGate` section of the `allurerc` configuration in the working directory, and the command line's own rule options: `--max-failures`, `--min-tests-count` and `--success-rate`. If neither supplies a rule it stops rather than exiting zero, so a typo in the configuration surfaces as a refusal instead of a silent pass.

saying these in an interview costs you the question

  • Assuming every results server ships a named Quality Gate feature
  • Believing Allure 2's CLI has a quality-gate command
  • Treating the gate as a second copy of the runner's exit code
  • Configuring no rules and assuming the gate still guards something
open as a page

In a CI job that runs an Allure-instrumented suite, what does the `allure.results.directory` property control, and why must the step that uploads the run point at the same directory?

level: juniorimportance: must knowfreq 60%

basics

~20 s

allure.results.directory names the local folder the Allure adaptor writes its per-test result files into during the run; it defaults to allure-results. The upload step is a plain directory copy, so if it reads a different path it pushes nothing.

open as a page

In Allure, what does `allure generate` produce from a results directory, and why does the generated `index.html` show nothing when you open it straight from the file system?

level: juniorimportance: must knowfreq 74%

basics

~20 s

allure generate turns a results directory into a static report directory, by default allure-report, whose entry point is index.html. That page loads its data over HTTP, so opened as a local file it renders empty; serve the directory instead.

open as a page

In a report generated by Allure 2, the overview page's panels are not computed in the browser from the raw results. Where does the generator put each panel's numbers, and what does `widgets/summary.json` hold?

level: juniorimportance: must knowfreq 62%

basics

~20 s

Allure 2 writes one JSON file per panel into the generated report's widgets directory at generate time. The file widgets/summary.json holds the report name, a five-status statistic with a derived total, and a time block for the run.

open as a page

Allure 2's `widgets/summary.json` reports a run's time as both a `duration` and a `sumDuration`. What is each one computed from, and which of the two does the report's duration-trend tile plot?

level: middleimportance: must knowfreq 54%

basics

~20 s

In Allure 2, duration is the run's wall-clock span, the latest stop minus the earliest start. sumDuration adds up each counted result's own duration. The duration-trend tile plots the wall-clock span, not the summed test time.

open as a page

A CI runner is killed mid-suite. What does the results store hold afterwards if the run was pushed as a directory at the end of the job, and what does it hold if the run was being reported to a ReportPortal server as it went?

level: seniorimportance: must knowfreq 46%

basics

~20 s

A directory pushed at the end leaves the store with nothing: the push never ran and the workspace died with the runner. A live-reported run leaves a launch stuck at IN_PROGRESS, because its finish call never arrived.

open as a page

In Allure 3's `allurerc` configuration, how is a `qualityGate` assembled from rules, and what do the built-in `maxFailures`, `minTestsCount` and `successRate` rules each measure?

level: middleimportance: should knowfreq 50%

basics

~20 s

The qualityGate section holds rules: a list of groups whose keys are rule ids and whose values are the expected thresholds. maxFailures caps failed results, minTestsCount floors how many ran, and successRate floors passed divided by total.

open as a page

A pipeline uploads its Allure results directory to a shared results store only when the test command exits successfully. What does that store end up missing, and why is the failed run the one worth having?

level: middleimportance: should knowfreq 52%

basics

~20 s

The store ends up holding only green runs. Every failed run's results, messages and attachments stay on an ephemeral runner and are discarded with the workspace, so the runs someone actually needs to look at are the ones absent.

open as a page

In Allure 2, what happens when `allure generate` targets a report directory that already exists and is not empty, and what does `-c/--clean` change?

level: middleimportance: should knowfreq 52%

basics

~20 s

Allure 2 refuses: it logs that the target directory is already in use, tells you to add --clean, and exits with a failure code. With -c/--clean it deletes the whole report directory first, then generates. It overwrites, it does not merge.

open as a page

In Allure, what does single-file report mode (`--single-file`, or the `singleFile` plugin option) actually produce, and what does it cost?

level: middleimportance: should knowfreq 48%

basics

~20 s

Single-file mode inlines everything into one index.html: the bundle and every data file, attachments included, are base64-encoded into the page. You get one document that opens from disk, at the cost of size and a hard ceiling.

open as a page

In an Allure 2 report, the tiles backed by `widgets/duration-trend.json` and `widgets/categories-trend.json` show points from earlier builds. How many points can such a file hold, and what happens to the oldest one when the next report is generated?

level: middleimportance: should knowfreq 46%

basics

~20 s

An Allure 2 trend file keeps twenty points, newest first. Each generate prepends this run's point and cuts to twenty, writing that cut list to both the widget and history files, so a dropped point leaves the chain for good.

open as a page

Allure 3's `quality-gate` command validates rules as results are read, and `--fast-fail` makes it exit at the first breach. Why can a suite that retries its failed tests turn that gate red on a run whose finished report is green?

level: seniorimportance: should knowfreq 46%

basics

~20 s

Because the gate validates in batches while results are still being read. A failed first attempt is only recognised as superseded once its later, passing attempt has been read, and with fast-fail the command has already exited by then.

open as a page

In Allure 3, how is the generated report directory laid out when the `allurerc` config declares one report plugin versus several, and why does that matter to whatever serves the site?

level: seniorimportance: should knowfreq 36%

basics

~20 s

Each report plugin writes into a subdirectory of the output named by its config key. A lone subdirectory is flattened into the output root; with two or more, they stay and a generated landing page becomes the root index.html.

open as a page

In the Allure CLI, how do `allure open`, `allure serve` and `allure watch` differ, and why is none of them a way to host a report for your team?

level: seniorimportance: should knowfreq 46%

basics

~20 s

open serves a report directory you already generated; serve generates into a temporary directory first and serves that, discarding it on exit; watch, an Allure 3 command, regenerates live as results arrive. All three are local preview servers, not hosting.

open as a page

A colleague divides the tallest bar on an Allure 2 report's categories-trend tile by the `total` in `widgets/summary.json` and calls the result the share of tests hitting that failure class. What is each number's real denominator, and why does that ratio not mean what they think?

level: seniorimportance: should knowfreq 44%

basics

~20 s

The bar counts one build's failures; the total counts every result of the current run. Dividing them puts a failure numerator over an all-result denominator, and usually crosses two different builds as well, so the percentage means nothing.

open as a page

An Allure 3 report marks a test as newly regressed against the previous run. What comparison produces that label, and what does it do when the previous run skipped the test?

level: middleimportance: nice to knowfreq 38%

basics

~20 s

Allure 3 attaches a status transition, one of new, fixed, regressed or malfunctioned, by comparing this run's status against the most recent history entry carrying a real verdict. Skipped and unknown entries are stepped over, not used as the baseline.

open as a page

A CI job writes `executor.json` into the Allure results directory in a step that runs after the upload step. What does the stored run look like, and why does this ordering bug survive so long unnoticed?

level: middleimportance: nice to knowfreq 38%

basics

~20 s

The stored run holds every test and every attachment but not that file, because the upload copied the directory as it stood at that instant. Nothing errors, every test-level detail looks right, so the gap is only noticed when someone needs it.

open as a page

In an Allure 2 report, `widgets/suites.json` does not list every suite in the run. What does it list, in what order, and what is the `total` that sits beside those rows?

level: seniorimportance: nice to knowfreq 32%

basics

~20 s

It lists at most ten rows, built only from the top layer of the suite tree and ranked failures-first. The total beside them counts every top-level group in the whole tree, so the panel is a worst-ten board rather than an inventory.

open as a page