Browse the Knowledge Hub211 resources

Allure Report review: tutorial, pros and cons
Allure Report is an open-source, framework-agnostic test report. Adapters for frameworks such as JUnit, TestNG, pytest, Playwright and Cypress write a result file per test, and the Allure CLI turns those files into a static HTML report with steps, attachments, retries, history and failure categories. Allure 3, rewritten in TypeScript and installed through npm, is the current major; Allure 2 remains maintained.
QAble runs this tool on client engagements. The assessment below is from that experience.
- last reviewed
- 13 October 2026
- version covered
- Allure Report 3
- licence
- Open source
At a glance
Allure Report at a glance
- Vendor
- Qameta Software
- Category
- Code quality
- Licence
- Open source (Apache 2.0)
- Platforms
- JVM, Python, JavaScript, .NET
- Integrates with
- JUnit, TestNG, pytest, Cucumber, REST Assured, Jenkins
- First released
- 2014
- Version reviewed
- Allure Report 3
Verdict
Our verdict on Allure Report
Strengths
- One report format across Java, Python, JavaScript and .NET frameworks, so mixed suites read the same way
- Steps with attached screenshots, payloads and logs let most failures be diagnosed without rerunning
- Retries are grouped under one test and history shows whether a failure is new or recurring
- Allure 3 quality gates can fail the run on failure count, success rate or minimum tests
- Free under Apache 2.0, generating a static site or a single HTML file that needs no server
Weaknesses
- History needs a file or folder carried between CI runs, which pipelines often forget
- Java steps depend on the AspectJ agent; without it, annotated steps silently disappear
- Many tutorials describe Allure 2 commands, Java installs and files that Allure 3 replaced
- Labels and steps in test code tie the suite to Allure’s APIs
Best for
Making test results readable by people who did not write the tests: QA leads, developers fixing a failure, product owners checking a release. The step-level breakdown with screenshots, request and response payloads and logs attached to the step that produced them means most failures can be diagnosed from the report without a rerun. It earns its keep most in mixed estates, such as a Java API suite and a Playwright UI suite, because one report format covers both.
Not for
A single-framework team whose runner already has a good report and who does not need history. Playwright’s own HTML report with traces is excellent for one Playwright suite, and Allure adds a generation step, a hosting decision and annotations in test code. If nobody will open the report, the cost buys nothing. It is also not a test management system: plans, manual cases and long-term analytics are what the commercial Allure TestOps is for.
Setup cost
Low for JavaScript and Python: add the adapter, point it at a results directory, generate. Java takes longer because annotated steps rely on the AspectJ weaver as a Java agent, and without it the report generates with no steps at all. The real setup work is in CI: persisting history between runs, publishing the report somewhere people can reach it, and agreeing a small set of labels such as feature, severity and owner so the report can be navigated.
Maintenance burden
Low once wired in, with three recurring chores. History has to be carried forward deliberately, through a history file in Allure 3 or the copied history folder in Allure 2, or trends stay empty. Result directories must be cleaned between runs or old results leak in. And adapter upgrades occasionally rename things: Allure Java 3.0 replaced the allure-junit5 artifact with allure-jupiter and raised the baseline to Java 17, which breaks builds that bump versions blindly.
Honest limitations
Report generation is a separate step, so the report is only as useful as where it is published. Attachment-heavy suites produce large reports. The runtime API and annotations couple test code to Allure, a small but real lock-in. In Allure 3, the Classic and Allure 2-style report plugins are still marked experimental, and several CI and IDE integrations are listed as Allure 2 only, so check the integrations page before migrating a whole estate.
How it works
How Allure Report works
Adapters write results, the CLI builds the report
Allure has two halves. An adapter inside the test framework, such as allure-jupiter, allure-pytest or allure-playwright, records each test as a JSON result file in an allure-results directory, with its steps, labels, parameters and attachments as separate files beside it. The Allure CLI then reads that directory and generates a report. Because the result format is shared, any language with an adapter produces the same report, and Allure 3 reads the same result files that Allure 2 adapters write. The split also explains most setup problems: the report can only show what the adapter recorded, so missing steps or labels are an adapter or configuration issue, never a report issue.
Allure 3 is a Node.js CLI with plugins
Allure 2 is a Java application. Allure 3 was rebuilt in TypeScript, installs from npm as the allure package and needs only Node.js. One configuration file, allurerc.mjs or one of its variants, holds the report name, output directory, history, categories, quality gate and plugins. The default plugin is Awesome, a redesigned interface; Classic and Allure 2-style plugins exist but are marked experimental, and a Dashboard plugin produces charts. The new allure run command wraps the test command, finds allure-results directories at any depth, ignores results from earlier runs, and generates the report when tests finish. A watch command refreshes the report live while tests run.
Test identity drives retries and history
The adapter computes a history ID for each result from the test’s fully qualified name and its parameters, minus any marked as excluded. Results with the same ID in one launch are shown as retries of one test, with the final status on top. Results with the same ID across launches form its history. In Allure 2, history lives in a history folder that must be copied from the previous report into the new results before generating. Allure 3 replaces that with a single JSONL file named by historyPath, to which each generation appends one line. A parameter that changes on every run, such as a timestamp, breaks identity and makes every run look like a new test.
Steps and attachments come from your code
Steps and attachments are recorded while the test runs, through a runtime API or annotations. In JavaScript, allure.step wraps a block and allure.attachment adds a file or string. In Java, methods annotated with @Step and @Attachment become steps through AspectJ, which weaves the recording code in at load time, so the AspectJ weaver must run as a Java agent. Some integrations save code: allure-playwright records Playwright’s own test.step calls as steps and picks up trace files automatically, and the REST Assured integration attaches requests and responses. Good reports therefore come from deliberate step naming in page objects and API clients, not from the report tool.
Strengths
What it does well
Failure context at the step that failed
A failed test opens on its step tree, with the failing step marked and screenshots, request bodies, response payloads or logs attached at that step. A developer sees which call returned what without reading test code or rerunning. Parameters are shown per test, so a data-driven failure identifies the data row that broke.
Adapters for most frameworks
Official integrations cover JUnit 4, JUnit Jupiter, TestNG and Cucumber JVM; pytest and behave; Playwright, Cypress, Jest, Vitest, Mocha, Jasmine, CucumberJS and CodeceptJS; and .NET frameworks. A Java API suite, a Python data suite and a Playwright UI suite can all publish the same kind of report, which matters when one QA lead reads all three.
Categories that separate product bugs from test bugs
Allure distinguishes failed tests, where an assertion failed, from broken ones, where the test itself threw. Allure 3 groups them by default into Product errors and Test errors, and custom category rules match on status, message, stack trace, labels, flakiness or status transitions such as newly failed. Triage starts from categories instead of a flat list of red tests.
Quality gates in the report step
Allure 3 can fail a run when rules are breached: a maximum number of failures, a minimum success rate, or a minimum number of tests, optionally filtered to labels such as critical severity. The run exits with code 1 and names the failed rule. fastFail stops a run early when a critical rule is already broken, which saves CI minutes on a bad build.
Reruns and multi-stage builds
allure run --rerun 3 reruns failed tests even for frameworks without native retries, and shows each attempt as a retry of one test. For sharded or multi-stage pipelines, each stage saves a dump with --dump, and allure generate --dump combines the archives into one report, so four shards produce one report rather than four.
Environments and pull request summaries
Allure 3 can split one report by environment through matchers on labels, linking the same test across, for example, staging and production runs. The official GitHub Action posts a summary comment on the pull request with totals and counts of new, flaky and retried tests, plus a link when the report is hosted, so reviewers see results without opening the pipeline.
Pricing
Allure Report pricing and licensing
Allure Report is free and open source under the Apache 2.0 licence, in both the Allure 2 and Allure 3 lines, with every adapter and report feature included. Its maker, Qameta Software, sells Allure TestOps, a separate test management and analytics product, in cloud and on-premise forms priced per user. You do not need TestOps to use Allure Report. The costs of the report itself are hosting, storage of results and history, and the CI time to generate it.
- Licence: Apache 2.0 for Allure Report and its adapters, with no paid edition of the report.
- Allure TestOps: the commercial companion for test management, launches and analytics, in Cloud and On-premise versions with free trials. The pricing page listed both at $39 per user per month on 13 October 2026, with volume pricing through sales.
- Hosting: the report is static HTML, so GitHub Pages, an object storage bucket or a CI artifact will serve it. Choose one that keeps a stable link per branch.
- Storage: attachment-heavy suites create large result sets, so set retention for results, reports and the history file.
- Hidden cost: engineering time to add meaningful steps and labels, to persist history in CI, and to migrate between majors of the CLI and the adapters.
Checked against the vendor’s own pages on 13 October 2026. Pricing changes; confirm on the official site before buying.
Getting started
Allure Report tutorial: getting started
Setup, step by step
- Install the Playwright adapter and the Allure 3 CLI as dev dependencies.
- Register allure-playwright as a reporter in playwright.config.ts, writing to allure-results.
- Add allurerc.mjs with a report name, an output folder and a historyPath.
- Add steps, labels and attachments to one test with the allure-js-commons runtime API.
- Run the suite through npx allure run so the report is generated when tests finish.
- Open the report with npx allure open and check that steps and attachments appear.
Install
npm install --save-dev allure-playwright allure
# run the tests and build the report in one step
npx allure run -- npx playwright test
npx allure openA first example
// playwright.config.ts (excerpt)
// reporter: [['line'], ['allure-playwright', { resultsDir: 'allure-results' }]]
// tests/orders.spec.ts
import { test, expect } from '@playwright/test'
import * as allure from 'allure-js-commons'
import { ContentType } from 'allure-js-commons'
test('order total includes tax', async ({ page, request }) => {
await allure.feature('Checkout')
await allure.severity('critical')
await allure.owner('payments-team')
const order = await allure.step('Create order through the API', async () => {
const res = await request.post('/api/orders', { data: { sku: 'A1', qty: 2 } })
const body = await res.json()
// Shown under this step in the report
await allure.attachment('order response', JSON.stringify(body, null, 2), ContentType.JSON)
return body
})
await allure.step('Check the total on the order page', async () => {
await page.goto(`/orders/${order.id}`)
await expect(page.getByTestId('order-total')).toHaveText('£24.00')
})
})What trips people up first
Mixing Allure 2 and Allure 3 instructions. Most articles describe Allure 2: install Java, install the allure-commandline package or a system binary, run allure serve, copy the history folder by hand, and write categories.json. Allure 3 needs only Node.js and the allure npm package, generates with allure run or allure generate, keeps history in the file named by historyPath, and takes categories in its config file. Decide which major you are on before following any guide. If both are installed globally the command names collide, so install Allure 3 as a project dev dependency and call it through npx.
In practice
Using Allure Report in practice
Labels and steps that make the report navigable
An Allure report is only as navigable as its labels. Agree a short set before the suite grows: epic, feature and story for the product hierarchy, severity for triage, owner for routing, and tags for cross-cutting concerns such as smoke or regression. Allure 3 builds one default hierarchy and lets you configure others from any labels, so consistent labels matter more than in Allure 2. Put steps in the shared layer rather than in each test: a page object method or API client call wrapped in a step names itself the same way everywhere, and attachments such as response bodies are added once. Mark parameters that change every run, such as generated IDs, as excluded so history is not broken.
Java with JUnit Jupiter and the AspectJ agent
For Java, Allure Java 3.0, released in September 2026, targets Java 17 and later and publishes the JUnit Jupiter adapter as allure-jupiter, which covers JUnit 5 and 6. Use the allure-bom so every Allure module stays on one version. @Step and @Attachment need the AspectJ weaver running as a Java agent, configured through Surefire’s argLine; without it the build passes and the report shows tests with no steps. Point results at the build directory through allure.properties so mvn clean removes stale results. Generate the report with the Allure CLI, which reads the same results whether you choose Allure 2 or 3.
<!-- pom.xml (excerpt) -->
<properties>
<allure.version>3.0.0</allure.version>
<aspectj.version>1.9.25</aspectj.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.qameta.allure</groupId>
<artifactId>allure-bom</artifactId>
<version>${allure.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Replaces allure-junit5, which Allure Java 3 no longer publishes -->
<dependency>
<groupId>io.qameta.allure</groupId>
<artifactId>allure-jupiter</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build><plugins><plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.2.3</version>
<configuration>
<!-- Without the weaver, @Step methods record nothing -->
<argLine>-javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"</argLine>
</configuration>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</plugin></plugins></build>
<!-- src/test/resources/allure.properties: allure.results.directory=target/allure-results -->One config file for history, categories and the gate
Allure 3 keeps report behaviour in a single config file at the project root. Three settings repay the effort immediately. historyPath turns on history and trends; without it, every report starts from nothing. Categories route failures into buckets your team actually triages, such as known environment problems versus product defects, and the first matching rule wins. A quality gate makes the report step enforce a release rule, for example no failed critical tests, and fails the command with exit code 1 when it is broken. Keep the file in JavaScript rather than JSON or YAML, because the declarative formats do not support features such as filters or environments.
// allurerc.mjs
import { defineConfig } from 'allure'
export default defineConfig({
name: 'Web regression',
output: './allure-report',
// Appended on every generation; persist this file between CI runs
historyPath: './allure-history/history.jsonl',
historyLimit: 30,
categories: [
{
name: 'Environment problems',
matchers: { statuses: ['broken'], message: /ECONNREFUSED|503/ },
},
{ name: 'Flaky tests', matchers: { flaky: true } },
],
qualityGate: {
rules: [
{
// No failed critical tests, checked as results arrive
maxFailures: 0,
fastFail: true,
filter: (tr) => tr.labels.some((l) => l.name === 'severity' && l.value === 'critical'),
},
{ successRate: 0.95 },
],
},
})Publishing from GitHub Actions with history
A useful pipeline does four things: restores the history file, runs the tests through allure run, saves the history file even when tests fail, and publishes the report. Use the separate restore and save cache actions, because the combined cache action only saves after a successful job, which is exactly when you least need history. Give each run a unique cache key and restore by prefix, so the newest history is always picked up. Upload the report as an artifact or deploy it to a static host, and add the official Allure action to post a summary on the pull request. It needs permission to write pull request comments and checks.
# .github/workflows/e2e.yml
name: e2e
on: [pull_request]
permissions:
contents: read
pull-requests: write
checks: write
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: actions/setup-node@v7
with:
node-version: 24
cache: npm
- run: npm ci
- run: npx playwright install --with-deps chromium
- uses: actions/cache/restore@v6
with:
path: allure-history
key: allure-history-${{ github.run_id }}
restore-keys: allure-history-
# Runs the tests, then generates the report and applies the quality gate
- run: npx allure run -- npx playwright test
- uses: actions/cache/save@v6
if: always()
with:
path: allure-history
key: allure-history-${{ github.run_id }}
- uses: actions/upload-artifact@v7
if: always()
with:
name: allure-report
path: allure-report
- uses: allure-framework/allure-action@v0
if: always()
with:
report-directory: ./allure-reportSharded runs, reruns and keeping reports small
For a sharded suite, have each shard save its results as a dump with allure run --dump and a stage name, upload the archives, and in a final job combine them with allure generate --dump pointing at all the stage archives. One report then covers every shard, and history is updated once rather than racing between jobs. Use --rerun for flaky-prone suites only as a diagnostic: the report shows each attempt, which makes flakiness visible rather than hidden. Keep reports small by attaching screenshots and traces on failure only, and by setting historyLimit so the history file does not grow without bound. For heavy suites, the singleFile option produces one portable HTML file, convenient for attaching to a ticket or an email.
Pitfalls
Common pitfalls
Following Allure 2 tutorials on Allure 3
Why it happens: Most guides describe the Java-based CLI, allure serve, copying a history folder and categories.json. Allure 3 replaced the history folder with a historyPath file and moved categories into the config file.
The fix: Check the major first with npx allure --version. On Allure 3, use allure run or allure generate, set historyPath, and port categories.json rules into the categories field, where matchedStatuses becomes matchers.statuses.
Builds breaking after bumping Allure Java to 3.0
Why it happens: Allure Java 3.0 raised the baseline to Java 17 and no longer publishes the allure-junit5 artifact; the JUnit Jupiter adapter is now allure-jupiter.
The fix: Move to Java 17 or later, switch the dependency to allure-jupiter, and manage versions through allure-bom so every Allure module upgrades together.
A report with tests but no steps in Java
Why it happens: @Step and @Attachment are woven in by AspectJ at load time. If Surefire or Gradle does not start the JVM with the aspectjweaver Java agent, the annotations do nothing and nothing fails.
The fix: Add the javaagent argument to Surefire’s argLine, or the Gradle equivalent, and verify with one test that a known step appears before rolling the suite out.
Old results leaking into new reports
Why it happens: Adapters add files to an existing results directory, so a report generated with Allure generate from a directory that was never cleaned includes tests from earlier runs.
The fix: Write results into the build directory so the clean task removes them, delete the directory before each CI run, or use allure run, which ignores results from previous runs.
Empty history and trend charts in CI
Why it happens: CI jobs start from a fresh workspace. Unless the Allure 3 history file or the Allure 2 history folder is restored before generation, each report is the first one ever.
The fix: Persist the history file with a cache, an artifact or the report host, restore it before generating, and save it even when tests fail.
Every run looks like a brand new test
Why it happens: History IDs include parameters. A parameter holding a timestamp, random value or generated ID changes the ID each run, so history and retries never connect.
The fix: Pass changing values as excluded parameters, for example allure.parameter with excluded set to true in JavaScript, or keep them out of parameters altogether.
Compared
How Allure Report compares
| Tool | Languages | Status | Output | Licence |
|---|---|---|---|---|
| Allure Report | Java, Python, JavaScript, .NET and more | Active; Allure 3 current, Allure 2 maintained | Static HTML site or single file | Apache 2.0 |
| ExtentReports | Java and .NET | Deprecated, to be replaced by ChainTest | Spark HTML report, Klov server | Apache 2.0 |
| Playwright HTML reporter | Playwright Test, JavaScript and TypeScript | Built into Playwright Test | HTML report with traces and screenshots | Apache 2.0 |
FAQ
Frequently asked questions
Is Allure Report free?
Yes. Allure Report and its framework adapters are open source under the Apache 2.0 licence, with no paid edition of the report. Qameta Software sells Allure TestOps separately, a test management and analytics product priced per user in cloud and on-premise forms, but it is not required. Your costs are hosting the generated HTML, storing results and history, and CI time.
Should I use Allure 2 or Allure 3?
Start new projects on Allure 3. It needs only Node.js, adds quality gates, reruns, environments and a simpler history file, and reads the same result files as Allure 2, so adapters do not change. Stay on Allure 2 for now if you depend on a CI or IDE plugin the integrations page still marks as Allure 2 only, or on the Classic report, which Allure 3 offers only as an experimental plugin.
How do I keep history between CI runs?
In Allure 3, set historyPath in the config file and persist that one JSONL file between runs, for example with a cache restored before generation and saved afterwards, even on failure. In Allure 2, copy the history folder from the previous report into the new allure-results directory before generating. CI server plugins for Allure 2 handle this automatically. Without either, every report starts with no history.
Does Allure work with Playwright?
Yes. Add allure-playwright as a reporter in playwright.config.ts alongside your usual reporter. Playwright’s test.step calls become Allure steps and trace files are attached automatically, and the allure-js-commons runtime API adds labels, custom steps and attachments. Run the tests through npx allure run to generate the report afterwards. For a single Playwright suite, compare it with Playwright’s own HTML report and traces before adding Allure.
Why are my @Step annotations missing from the report?
In Java, @Step and @Attachment work through AspectJ, which must be loaded as a Java agent when the test JVM starts. If the aspectjweaver javaagent argument is missing from Surefire’s argLine or the Gradle test task, the annotations are ignored silently and the report shows tests with no steps. Add the agent, then confirm with one test that a known step appears.
Allure Report or ExtentReports?
ExtentReports’ Java repository now carries a deprecation notice saying it will be replaced by ChainTest Framework, so it is a weak choice for a new suite. Allure covers more languages and frameworks through adapters rather than reporting calls, groups retries, keeps history and, in Allure 3, enforces quality gates. Existing Extent suites can keep running, but plan any reporting rework around Allure or the framework’s own report.
Can Allure fail the build?
Allure 3 can. A qualityGate block in the config file defines rules such as maxFailures, successRate and minTestsCount, optionally filtered to labels such as critical severity. When a rule fails, the command exits with code 1 and reports which rule failed, which fails the CI step. fastFail stops a run early once a critical rule is already broken. Allure 2 has no equivalent built in.
Alternatives
Allure Report alternatives worth weighing
ExtentReports
HTML reporting library for Java and .NET automation suites. The Java library has been sunset in favour of ChainTest.
Resources
Where to go next
Picking the wrong tool costs more than picking late.
QAble advises on toolchain decisions and then implements them, with engineers who have run these tools on real delivery. Start with a free QA audit.