--- id: test-reporters title: "Reporters" --- ## Using reporters Playwright Test comes with a few built-in reporters for different needs and ability to provide custom reporters. The easiest way to try out built-in reporters is to pass `--reporter` [command line option](./test-cli.md). ```bash npx playwright test --reporter=line ``` For more control, you can specify reporters programmatically in the [configuration file](./test-configuration.md). ```js js-flavor=js // playwright.config.js // @ts-check /** @type {import('@playwright/test').PlaywrightTestConfig} */ const config = { reporter: 'line', }; module.exports = config; ``` ```js js-flavor=ts // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config: PlaywrightTestConfig = { reporter: 'line', }; export default config; ``` ### Multiple reporters You can use multiple reporters at the same time. For example you can use`'list'` for nice terminal output and `'json'` to get a comprehensive json file with the test results. ```js js-flavor=js // playwright.config.js // @ts-check /** @type {import('@playwright/test').PlaywrightTestConfig} */ const config = { reporter: [ ['list'], ['json', { outputFile: 'test-results.json' }] ], }; module.exports = config; ``` ```js js-flavor=ts // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config: PlaywrightTestConfig = { reporter: [ ['list'], ['json', { outputFile: 'test-results.json' }] ], }; export default config; ``` ### Reporters on CI You can use different reporters locally and on CI. For example, using concise `'dot'` reporter avoids too much output. This is the default on CI. ```js js-flavor=js // playwright.config.js // @ts-check /** @type {import('@playwright/test').PlaywrightTestConfig} */ const config = { // Concise 'dot' for CI, default 'list' when running locally reporter: process.env.CI ? 'dot' : 'list', }; module.exports = config; ``` ```js js-flavor=ts // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config: PlaywrightTestConfig = { // Concise 'dot' for CI, default 'list' when running locally reporter: process.env.CI ? 'dot' : 'list', }; export default config; ``` ## Built-in reporters All built-in reporters show detailed information about failures, and mostly differ in verbosity for successful runs. ### List reporter List reporter is default (except on CI where the `dot` reporter is default). It prints a line for each test being run. ```bash npx playwright test --reporter=list ``` ```js js-flavor=js // playwright.config.js // @ts-check /** @type {import('@playwright/test').PlaywrightTestConfig} */ const config = { reporter: 'list', }; module.exports = config; ``` ```js js-flavor=ts // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config: PlaywrightTestConfig = { reporter: 'list', }; export default config; ``` Here is an example output in the middle of a test run. Failures will be listed at the end. ```bash npx playwright test --reporter=list Running 124 tests using 6 workers ✓ should access error in env (438ms) ✓ handle long test names (515ms) x 1) render expected (691ms) ✓ should timeout (932ms) should repeat each: ✓ should respect enclosing .gitignore (569ms) should teardown env after timeout: should respect excluded tests: ✓ should handle env beforeEach error (638ms) should respect enclosing .gitignore: ``` ### Line reporter Line reporter is more concise than the list reporter. It uses a single line to report last finished test, and prints failures when they occur. Line reporter is useful for large test suites where it shows the progress but does not spam the output by listing all the tests. ```bash npx playwright test --reporter=line ``` ```js js-flavor=js // playwright.config.js // @ts-check /** @type {import('@playwright/test').PlaywrightTestConfig} */ const config = { reporter: 'line', }; module.exports = config; ``` ```js js-flavor=ts // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config: PlaywrightTestConfig = { reporter: 'line', }; export default config; ``` Here is an example output in the middle of a test run. Failures are reported inline. ```bash npx playwright test --reporter=line Running 124 tests using 6 workers 1) dot-reporter.spec.ts:20:1 › render expected =================================================== Error: expect(received).toBe(expected) // Object.is equality Expected: 1 Received: 0 [23/124] gitignore.spec.ts - should respect nested .gitignore ``` ### Dot reporter Dot reporter is very concise - it only produces a single character per successful test run. It is the default on CI and useful where you don't want a lot of output. ```bash npx playwright test --reporter=dot ``` ```js js-flavor=js // playwright.config.js // @ts-check /** @type {import('@playwright/test').PlaywrightTestConfig} */ const config = { reporter: 'dot', }; module.exports = config; ``` ```js js-flavor=ts // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config: PlaywrightTestConfig = { reporter: 'dot', }; export default config; ``` Here is an example output in the middle of a test run. Failures will be listed at the end. ```bash npx playwright test --reporter=dot Running 124 tests using 6 workers ······F············································· ``` ### HTML reporter HTML reporter produces a self-contained folder that contains report for the test run that can be served as a web page. ```bash npx playwright test --reporter=html ``` By default, HTML report is opened automatically if some of the tests failed. You can control this behavior via the `open` property in the Playwright config. The possible values for that property are `always`, `never` and `on-failure` (default). ```js js-flavor=js // playwright.config.js // @ts-check /** @type {import('@playwright/test').PlaywrightTestConfig} */ const config = { reporter: [ ['html', { open: 'never' }] ], }; module.exports = config; ``` ```js js-flavor=ts // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config: PlaywrightTestConfig = { reporter: [ ['html', { open: 'never' }] ], }; export default config; ``` By default, report is written into the `playwright-report` folder in the current working directory. One can override that location using the `PLAYWRIGHT_HTML_REPORT` environment variable or a reporter configuration. In configuration file, pass options directly: ```js js-flavor=js // playwright.config.js // @ts-check /** @type {import('@playwright/test').PlaywrightTestConfig} */ const config = { reporter: [ ['html', { outputFolder: 'my-report' }] ], }; module.exports = config; ``` ```js js-flavor=ts // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config: PlaywrightTestConfig = { reporter: [ ['html', { outputFolder: 'my-report' }] ], }; export default config; ``` A quick way of opening the last test run report is: ```bash npx playwright show-report ``` Or if there is a custom folder name: ```bash npx playwright show-report my-report ``` ### JSON reporter JSON reporter produces an object with all information about the test run. Most likely you want to write the JSON to a file. When running with `--reporter=json`, use `PLAYWRIGHT_JSON_OUTPUT_NAME` environment variable: ```bash bash-flavor=bash PLAYWRIGHT_JSON_OUTPUT_NAME=results.json npx playwright test --reporter=json ``` ```bash bash-flavor=batch set PLAYWRIGHT_JSON_OUTPUT_NAME=results.json npx playwright test --reporter=json ``` ```bash bash-flavor=powershell $env:PLAYWRIGHT_JSON_OUTPUT_NAME="results.json" npx playwright test --reporter=json ``` In configuration file, pass options directly: ```js js-flavor=js // playwright.config.js // @ts-check /** @type {import('@playwright/test').PlaywrightTestConfig} */ const config = { reporter: [ ['json', { outputFile: 'results.json' }] ], }; module.exports = config; ``` ```js js-flavor=ts // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config: PlaywrightTestConfig = { reporter: [ ['json', { outputFile: 'results.json' }] ], }; export default config; ``` ### JUnit reporter JUnit reporter produces a JUnit-style xml report. Most likely you want to write the report to an xml file. When running with `--reporter=junit`, use `PLAYWRIGHT_JUNIT_OUTPUT_NAME` environment variable: ```bash bash-flavor=bash PLAYWRIGHT_JUNIT_OUTPUT_NAME=results.xml npx playwright test --reporter=junit ``` ```bash bash-flavor=batch set PLAYWRIGHT_JUNIT_OUTPUT_NAME=results.xml npx playwright test --reporter=junit ``` ```bash bash-flavor=powershell $env:PLAYWRIGHT_JUNIT_OUTPUT_NAME="results.xml" npx playwright test --reporter=junit ``` In configuration file, pass options directly: ```js js-flavor=js // playwright.config.js // @ts-check /** @type {import('@playwright/test').PlaywrightTestConfig} */ const config = { reporter: [ ['junit', { outputFile: 'results.xml' }] ], }; module.exports = config; ``` ```js js-flavor=ts // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config: PlaywrightTestConfig = { reporter: [ ['junit', { outputFile: 'results.xml' }] ], }; export default config; ``` ### GitHub Actions annotations You can use the built in `github` reporter to get automatic failure annotations when running in GitHub actions. Note that all other reporters work on GitHub Actions as well, but do not provide annotations. ```js js-flavor=js // playwright.config.js // @ts-check /** @type {import('@playwright/test').PlaywrightTestConfig} */ const config = { // 'github' for GitHub Actions CI to generate annotations, plus a concise 'dot' // default 'list' when running locally reporter: process.env.CI ? 'github' : 'list', }; module.exports = config; ``` ```js js-flavor=ts // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config: PlaywrightTestConfig = { // 'github' for GitHub Actions CI to generate annotations, plus a concise 'dot' // default 'list' when running locally reporter: process.env.CI ? 'github' : 'list', }; export default config; ``` ## Custom reporters You can create a custom reporter by implementing a class with some of the reporter methods. Learn more about the [Reporter] API. ```js js-flavor=js // my-awesome-reporter.js // @ts-check /** @implements {import('@playwright/test/reporter').Reporter} */ class MyReporter { 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; ``` ```js js-flavor=ts // my-awesome-reporter.ts import { Reporter } from '@playwright/test/reporter'; class MyReporter implements Reporter { 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}`); } } export default MyReporter; ``` Now use this reporter with [`property: TestConfig.reporter`]. ```js js-flavor=js // playwright.config.js // @ts-check /** @type {import('@playwright/test').PlaywrightTestConfig} */ const config = { reporter: './my-awesome-reporter.js', }; module.exports = config; ``` ```js js-flavor=ts // playwright.config.ts import { PlaywrightTestConfig } from '@playwright/test'; const config: PlaywrightTestConfig = { reporter: './my-awesome-reporter.ts', }; export default config; ``` ## Third party showcase ### Allure reporter ```bash # Install npm i -D allure-playwright # Run tests npx playwright test --reporter=line,allure-playwright # Generate report allure generate ./allure-results --clean && allure open ./allure-report ``` See [here](https://www.npmjs.com/package/allure-playwright) for more information.