File: class-reporter.md | Updated: 11/18/2025
On this page
Test runner notifies the reporter about various events during test execution. All methods of the reporter are optional.
You can create a custom reporter by implementing a class with some of the reporter methods. Make sure to export this class as default.
my-awesome-reporter.ts
import type { Reporter, FullConfig, Suite, TestCase, TestResult, FullResult} from '@playwright/test/reporter';class MyReporter implements Reporter { constructor(options: { customOption?: string } = {}) { console.log(`my-awesome-reporter setup with customOption set to ${options.customOption}`); } onBegin(config: FullConfig, suite: Suite) { console.log(`Starting the run with ${suite.allTests().length} tests`); } onTestBegin(test: TestCase) { console.log(`Starting test ${test.title}`); } onTestEnd(test: TestCase, result: TestResult) { console.log(`Finished test ${test.title}: ${result.status}`); } onEnd(result: FullResult) { console.log(`Finished the run: ${result.status}`); }}export default MyReporter;
my-awesome-reporter.js
// @ts-check/** @implements {import('@playwright/test/reporter').Reporter} */class MyReporter { constructor(options) { console.log(`my-awesome-reporter setup with customOption set to ${options.customOption}`); } onBegin(config, suite) { console.log(`Starting the run with ${suite.allTests().length} tests`); } onTestBegin(test) { console.log(`Starting test ${test.title}`); } onTestEnd(test, result) { console.log(`Finished test ${test.title}: ${result.status}`); } onEnd(result) { console.log(`Finished the run: ${result.status}`); }}module.exports = MyReporter;
Now use this reporter with testConfig.reporter . Learn more about using reporters .
playwright.config.ts
import { defineConfig } from '@playwright/test';export default defineConfig({ reporter: [['./my-awesome-reporter.ts', { customOption: 'some value' }]],});
Here is a typical order of reporter calls:
status once the test finishes.Additionally, reporter.onStdOut() and reporter.onStdErr() are called when standard output is produced in the worker process, possibly during a test execution, and reporter.onError() is called when something went wrong outside of the test execution.
If your custom reporter does not print anything to the terminal, implement reporter.printsToStdio()
and return false. This way, Playwright will use one of the standard terminal reporters in addition to your custom reporter to enhance user experience.
Merged report API notes
When merging multiple blob
reports via merge-reports
CLI command, the same Reporter
API is called to produce final reports and all existing reporters should work without any changes. There some subtle differences though which might affect some custom reporters.
Methods
Added in: v1.10 reporter.onBegin
Called once before running tests. All tests have been already discovered and put into a hierarchy of Suite s.
Usage
reporter.onBegin(config, suite);
Arguments
config FullConfig
#
Resolved configuration.
The root suite that contains all projects, files and test cases.
Added in: v1.10 reporter.onEnd
Called after all tests have been run, or testing has been interrupted. Note that this method may return a Promise and Playwright Test will await it. Reporter is allowed to override the status and hence affect the exit code of the test runner.
Usage
await reporter.onEnd(result);
Arguments
status "passed" | "failed" | "timedout" | "interrupted"
Test run status.
startTime Date
Test run start wall time.
duration number
Test run duration in milliseconds.
Result of the full test run, status can be one of:
'passed' - Everything went as expected.'failed' - Any test has failed.'timedout' - The testConfig.globalTimeout
has been reached.'interrupted' - Interrupted by the user.Returns
Added in: v1.10 reporter.onError
Called on some global error, for example unhandled exception in the worker process.
Usage
reporter.onError(error);
Arguments
Added in: v1.33 reporter.onExit
Called immediately before test runner exists. At this point all the reporters have received the reporter.onEnd() signal, so all the reports should be build. You can run the code that uploads the reports in this hook.
Usage
await reporter.onExit();
Returns
Added in: v1.10 reporter.onStdErr
Called when something has been written to the standard error in the worker process.
Usage
reporter.onStdErr(chunk, test, result);
Arguments
Output chunk.
Test that was running. Note that output may happen when no test is running, in which case this will be void .
result void
| TestResult
#
Result of the test run, this object gets populated while the test runs.
Added in: v1.10 reporter.onStdOut
Called when something has been written to the standard output in the worker process.
Usage
reporter.onStdOut(chunk, test, result);
Arguments
Output chunk.
Test that was running. Note that output may happen when no test is running, in which case this will be void .
result void
| TestResult
#
Result of the test run, this object gets populated while the test runs.
Added in: v1.10 reporter.onStepBegin
Called when a test step started in the worker process.
Usage
reporter.onStepBegin(test, result, step);
Arguments
Test that the step belongs to.
result TestResult
#
Result of the test run, this object gets populated while the test runs.
Test step instance that has started.
Added in: v1.10 reporter.onStepEnd
Called when a test step finished in the worker process.
Usage
reporter.onStepEnd(test, result, step);
Arguments
Test that the step belongs to.
result TestResult
#
Result of the test run.
Test step instance that has finished.
Added in: v1.10 reporter.onTestBegin
Called after a test has been started in the worker process.
Usage
reporter.onTestBegin(test, result);
Arguments
Test that has been started.
result TestResult
#
Result of the test run, this object gets populated while the test runs.
Added in: v1.10 reporter.onTestEnd
Called after a test has been finished in the worker process.
Usage
reporter.onTestEnd(test, result);
Arguments
Test that has been finished.
result TestResult
#
Result of the test run.
Added in: v1.10 reporter.printsToStdio
Whether this reporter uses stdio for reporting. When it does not, Playwright Test could add some output to enhance user experience. If your reporter does not print to the terminal, it is strongly recommended to return false.
Usage
reporter.printsToStdio();
Returns