docs(runner): start adding runner docs (#6773)
This commit is contained in:
parent
ddce546ed2
commit
4578d57901
181
docs/src/test-runner-configuration-js.md
Normal file
181
docs/src/test-runner-configuration-js.md
Normal file
|
|
@ -0,0 +1,181 @@
|
|||
---
|
||||
id: test-runner-configuration
|
||||
title: "Configuration"
|
||||
---
|
||||
|
||||
<!-- TOC -->
|
||||
|
||||
## Modify options
|
||||
|
||||
You can modify browser launch options, context creation options and testing options either globally in the configuration file, or locally in the test file.
|
||||
|
||||
Playwright test runner is based on the [Folio] framework, so it supports any configuration available in Folio, and adds a lot of Playwright-specific options.
|
||||
|
||||
### Globally in the configuration file
|
||||
|
||||
You can specify different options for each browser using projects in the configuration file. Below is an example that changes some global testing options, and Chromium browser configuration.
|
||||
|
||||
```js
|
||||
// config.ts
|
||||
import { PlaywrightTestConfig } from "@playwright/test";
|
||||
|
||||
const config: PlaywrightTestConfig = {
|
||||
// Each test is given 90 seconds.
|
||||
timeout: 90000,
|
||||
// Failing tests will be retried at most two times.
|
||||
retries: 2,
|
||||
projects: [
|
||||
{
|
||||
name: 'chromium',
|
||||
use: {
|
||||
browserName: 'chromium',
|
||||
|
||||
// Launch options
|
||||
headless: false,
|
||||
slowMo: 50,
|
||||
|
||||
// Context options
|
||||
viewport: { width: 800, height: 600 },
|
||||
ignoreHTTPSErrors: true,
|
||||
|
||||
// Testing options
|
||||
video: 'retain-on-failure',
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
export default config;
|
||||
```
|
||||
|
||||
### Locally in the test file
|
||||
|
||||
With `test.use()` you can override some options for a file, or a `describe` block.
|
||||
|
||||
```js
|
||||
// my.spec.ts
|
||||
import { test, expect } from "@playwright/test";
|
||||
|
||||
// Run tests in this file with portrait-like viewport.
|
||||
test.use({ viewport: { width: 600, height: 900 } });
|
||||
|
||||
test('my test', async ({ page }) => {
|
||||
// Test code goes here.
|
||||
});
|
||||
```
|
||||
|
||||
### Available options
|
||||
|
||||
See the full list of launch options in [`browserType.launch()`](https://playwright.dev/docs/api/class-browsertype#browsertypelaunchoptions) documentation.
|
||||
|
||||
See the full list of context options in [`browser.newContext()`](https://playwright.dev/docs/api/class-browser#browsernewcontextoptions) documentation.
|
||||
|
||||
Available testing options:
|
||||
- `screenshot: 'off' | 'on' | 'only-on-failure'` - Whether to capture a screenshot after each test, off by default.
|
||||
- `off` - Do not capture screenshots.
|
||||
- `on` - Capture screenshot after each test.
|
||||
- `only-on-failure` - Capture screenshot after each test failure.
|
||||
- `video: 'off' | 'on' | 'retain-on-failure' | 'retry-with-video'` - Whether to record video for each test, off by default.
|
||||
- `off` - Do not record video.
|
||||
- `on` - Record video for each test.
|
||||
- `retain-on-failure` - Record video for each test, but remove all videos from successful test runs.
|
||||
- `retry-with-video` - Record video only when retrying a test.
|
||||
|
||||
Most notable testing options from [Folio documentation][folio]:
|
||||
- `reporter: 'dot' | 'line' | 'list'` - Choose a reporter: minimalist `dot`, concise `line` or detailed `list`. See [Folio reporters][folio-reporters] for more details.
|
||||
- `retries: number` - Each failing test will be retried up to the certain number of times.
|
||||
- `testDir: string` - Directory where test runner should search for test files.
|
||||
- `timeout: number` - Timeout in milliseconds for each test.
|
||||
- `workers: number` - The maximum number of worker processes to run in parallel.
|
||||
|
||||
## Skip tests with annotations
|
||||
|
||||
The Playwright test runner can annotate tests to skip under certain parameters. This is enabled by [Folio annotations][folio-annotations].
|
||||
|
||||
```js
|
||||
test("should be skipped on firefox", async ({ page, browserName }) => {
|
||||
test.skip(browserName === "firefox", "optional description for the skip");
|
||||
// Test function
|
||||
});
|
||||
```
|
||||
|
||||
## Run tests in parallel
|
||||
|
||||
Tests are run in parallel by default, using multiple worker processes. You can control the parallelism with the `workers` option in the configuration file or from the command line.
|
||||
|
||||
```sh
|
||||
# Run just a single test at a time - no parallelization
|
||||
npx folio --workers=1
|
||||
|
||||
# Run up to 10 tests in parallel
|
||||
npx folio --workers=10
|
||||
```
|
||||
|
||||
```js
|
||||
// config.ts
|
||||
import { PlaywrightTestConfig } from "@playwright/test";
|
||||
|
||||
const config: PlaywrightTestConfig = {
|
||||
// No parallelization on CI, default value locally.
|
||||
worker: process.env.CI ? 1 : undefined,
|
||||
projects: [
|
||||
// Your projects go here
|
||||
],
|
||||
};
|
||||
export default config;
|
||||
```
|
||||
|
||||
By default, test runner chooses the number of workers based on available CPUs.
|
||||
|
||||
## Reporters
|
||||
|
||||
Playwright test runner 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](#command-line). Built-in terminal reporters are minimalist `dot`, concise `line` and detailed `list`.
|
||||
|
||||
```sh
|
||||
npx folio --reporter=line
|
||||
npx folio --reporter=dot
|
||||
npx folio --reporter=list
|
||||
```
|
||||
|
||||
Alternatively, you can specify the reporter in the configuration file.
|
||||
```js
|
||||
// config.ts
|
||||
import { PlaywrightTestConfig } from "@playwright/test";
|
||||
|
||||
const config: PlaywrightTestConfig = {
|
||||
// Concise 'dot' on CI, more interactive 'list' when running locally
|
||||
reporter: process.env.CI ? 'dot' : 'line',
|
||||
projects: [
|
||||
// Your projects go here
|
||||
],
|
||||
};
|
||||
export default config;
|
||||
```
|
||||
|
||||
### Export JUnit or JSON report
|
||||
|
||||
The Playwright test runner includes reporters that produce a JUnit compatible XML file or a JSON file with test results.
|
||||
|
||||
```js
|
||||
// config.ts
|
||||
import { PlaywrightTestConfig } from "@playwright/test";
|
||||
|
||||
const config: PlaywrightTestConfig = {
|
||||
reporter: [
|
||||
// Live output to the terminal
|
||||
'list',
|
||||
// JUnit compatible xml report
|
||||
{ name: 'junit', outputFile: 'report.xml' },
|
||||
// JSON file with test results
|
||||
{ name: 'json', outputFile: 'report.json' },
|
||||
]
|
||||
projects: [
|
||||
// Your projects go here
|
||||
],
|
||||
};
|
||||
export default config;
|
||||
```
|
||||
|
||||
[folio]: https://github.com/microsoft/folio
|
||||
[folio-annotations]: https://github.com/microsoft/folio#annotations
|
||||
[folio-cli]: https://github.com/microsoft/folio#command-line
|
||||
[folio-reporters]: https://github.com/microsoft/folio#reporters
|
||||
133
docs/src/test-runner-examples-js.md
Normal file
133
docs/src/test-runner-examples-js.md
Normal file
|
|
@ -0,0 +1,133 @@
|
|||
---
|
||||
id: test-runner-examples
|
||||
title: "Examples"
|
||||
---
|
||||
|
||||
<!-- TOC -->
|
||||
|
||||
## Multiple pages
|
||||
|
||||
The default `context` argument is a [BrowserContext][browser-context]. Browser contexts are isolated execution environments that can host multiple pages. See [multi-page scenarios](./multi-pages.md) for more examples.
|
||||
|
||||
```js
|
||||
import { test } from "@playwright/test";
|
||||
|
||||
test("tests on multiple web pages", async ({ context }) => {
|
||||
const pageFoo = await context.newPage();
|
||||
const pageBar = await context.newPage();
|
||||
// Test function
|
||||
});
|
||||
```
|
||||
|
||||
## Mobile emulation
|
||||
|
||||
`use` section in the configuration file can be used to configure mobile emulation in the default `context`.
|
||||
|
||||
```js
|
||||
// config.ts
|
||||
import { PlaywrightTestConfig } from "@playwright/test";
|
||||
import { devices } from "playwright";
|
||||
|
||||
const config: PlaywrightTestConfig = {
|
||||
timeout: 30000,
|
||||
projects: [
|
||||
{
|
||||
name: 'chromium',
|
||||
use: {
|
||||
browserName: 'chromium',
|
||||
headless: true,
|
||||
...devices["Pixel 2"],
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
export default config;
|
||||
```
|
||||
|
||||
## Network mocking
|
||||
|
||||
Define a custom route that mocks network calls for a browser context.
|
||||
|
||||
```js
|
||||
// In foo.spec.ts
|
||||
import { test, expect } from "@playwright/test";
|
||||
|
||||
test.beforeEach(async ({ context }) => {
|
||||
// Block any css requests for each test in this file.
|
||||
await context.route(/.css/, route => route.abort());
|
||||
});
|
||||
|
||||
test("loads page without css", async ({ page }) => {
|
||||
// Alternatively, block any png requests just for this test.
|
||||
await page.route(/.png/, route => route.abort());
|
||||
|
||||
// Test function code.
|
||||
await page.goto("https://stackoverflow.com");
|
||||
});
|
||||
```
|
||||
|
||||
## Visual comparisons
|
||||
|
||||
The `expect` API supports visual comparisons with `toMatchSnapshot`. This uses the [pixelmatch](https://github.com/mapbox/pixelmatch) library, and you can pass `threshold` as an option.
|
||||
|
||||
```js
|
||||
import { test, expect } from "@playwright/test";
|
||||
|
||||
test("compares page screenshot", async ({ page }) => {
|
||||
await page.goto("https://stackoverflow.com");
|
||||
const screenshot = await page.screenshot();
|
||||
expect(screenshot).toMatchSnapshot(`test.png`, { threshold: 0.2 });
|
||||
});
|
||||
```
|
||||
|
||||
On first execution, this will generate golden snapshots. Subsequent runs will compare against the golden snapshots. To update golden snapshots with new actual values, run with the `--update-snapshots` flag.
|
||||
|
||||
```sh
|
||||
# Update golden snapshots when they differ from actual
|
||||
npx folio --update-snapshots
|
||||
```
|
||||
|
||||
### Page object model
|
||||
|
||||
To introduce a Page Object for a particular page, create a class that will use the `page` object.
|
||||
|
||||
Create a `LoginPage` helper class to encapsulate common operations on the login page.
|
||||
```js
|
||||
// login-page.ts
|
||||
import type { Page } from "playwright";
|
||||
|
||||
export class LoginPage {
|
||||
page: Page;
|
||||
|
||||
constructor(page: Page) {
|
||||
this.page = page;
|
||||
}
|
||||
|
||||
async goto() {
|
||||
await this.page.goto("https://example.com/login");
|
||||
}
|
||||
|
||||
async login() {
|
||||
await this.page.fill("#username", TEST_USERNAME);
|
||||
await this.page.fill("#password", TEST_PASSWORD);
|
||||
await this.page.click("text=Login");
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Use the `LoginPage` class in the tests.
|
||||
```js
|
||||
// my.spec.ts
|
||||
import { test, expect } from "@playwright/test";
|
||||
import { LoginPage } from "./login-page";
|
||||
|
||||
test('login works', async ({ page }) => {
|
||||
// Create the login page and perform operations.
|
||||
const loginPage = new LoginPage(page);
|
||||
await loginPage.goto();
|
||||
await loginPage.login();
|
||||
|
||||
// Verify it worked.
|
||||
expect(await page.textContent("#user-info")).toBe("Welcome, Test User!");
|
||||
});
|
||||
```
|
||||
198
docs/src/test-runner-intro-js.md
Normal file
198
docs/src/test-runner-intro-js.md
Normal file
|
|
@ -0,0 +1,198 @@
|
|||
---
|
||||
id: test-runner-intro
|
||||
title: "Playwright Tests"
|
||||
---
|
||||
|
||||
Playwright Test Runner was created specifically to accommodate the needs of the end-to-end testing. It does everything you would expect from the regular test runner, and more. Playwright test allows to:
|
||||
|
||||
- Run tests across all browsers.
|
||||
- Execute tests in parallel.
|
||||
- Enjoy context isolation out of the box.
|
||||
- Capture videos, screenshots and other artifacts on failure.
|
||||
- Integrate your POMs as extensible fixtures.
|
||||
|
||||
There are many more exciting features, so read on!
|
||||
|
||||
<!-- TOC -->
|
||||
|
||||
Note that you can still wire Playwright to your existing JavaScript [test runner]('./test-runners-other-js.md).
|
||||
|
||||
## Installation
|
||||
|
||||
```sh
|
||||
npm i -D @playwright/test@1.0.0-alpha
|
||||
```
|
||||
|
||||
## First test
|
||||
|
||||
Create `tests/foo.spec.ts` to define your test.
|
||||
|
||||
```js
|
||||
import { test, expect } from '@playwright/test';
|
||||
|
||||
test('is a basic test with the page', async ({ page }) => {
|
||||
await page.goto('https://playwright.dev/');
|
||||
const name = await page.innerText('.navbar__title');
|
||||
expect(name).toBe('Playwright');
|
||||
});
|
||||
```
|
||||
|
||||
Now run your tests:
|
||||
|
||||
```sh
|
||||
# Assuming that test files are in the tests directory.
|
||||
npx folio -c tests
|
||||
```
|
||||
|
||||
## Test fixtures
|
||||
|
||||
You noticed an argument `{ page }` that the test above has access to:
|
||||
|
||||
```js
|
||||
test('basic test', async ({ page }) => {
|
||||
...
|
||||
```
|
||||
|
||||
We call these arguments `fixtures`. Playwright Test comes loaded with those fixtures, and you can add your own fixtures as well. Here is a list of the pre-defined fixtures that you are likely to use most of the time:
|
||||
|
||||
- `page`: [Page] - Isolated page for this test run.
|
||||
- `context`: [BrowserContext] - Isolated context for this test run. The `page` fixture belongs to this context as well. Learn how to [configure context](#modify-options) below.
|
||||
- `browser`: [Browser] - Browsers are shared across tests to optimize resources. Learn how to [configure browser](#modify-options) below.
|
||||
- `browserName` - The name of the browser currently running the test. Either `chromium`, `firefox` or `webkit`.
|
||||
|
||||
## Test and assertion features
|
||||
|
||||
### Focus or skip tests
|
||||
|
||||
```js
|
||||
import { test, expect } from '@playwright/test';
|
||||
|
||||
// You can focus single test.
|
||||
test.only('focus this test', async ({ page }) => {
|
||||
// Only this test in the entire project runs.
|
||||
});
|
||||
|
||||
// You can skip tests.
|
||||
test.skip('skip this test', async ({ page }) => {
|
||||
});
|
||||
```
|
||||
|
||||
### Group tests together
|
||||
|
||||
```js
|
||||
import { test, expect } from '@playwright/test';
|
||||
|
||||
test.describe('two tests', () => {
|
||||
test.only('one', async ({ page }) => {
|
||||
// ...
|
||||
});
|
||||
|
||||
test.skip('two', async ({ page }) => {
|
||||
// ...
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
### Use test hooks
|
||||
|
||||
You can use `test.beforeAll` and `test.afterAll` hooks to set up and tear down resources shared between tests.
|
||||
And you can use `test.beforeEach` and `test.afterEach` hooks to set up and tear down resources for each test individually.
|
||||
|
||||
```js
|
||||
import { test, expect } from '@playwright/test';
|
||||
|
||||
test.describe('feature foo', () => {
|
||||
test.beforeEach(async ({ page }) => {
|
||||
// Go to the starting url before each test.
|
||||
await page.goto('https://my.start.url');
|
||||
});
|
||||
|
||||
test('my test', async ({ page }) => {
|
||||
// Assertions use the expect API.
|
||||
expect(page.url()).toBe('https://my.start.url');
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
## Write a configuration file
|
||||
|
||||
Create `config.ts` to configure your tests: specify browser launch options, run tests in multiple browsers and much more. Here is an example configuration that runs every test in Chromium, Firefox and WebKit.
|
||||
|
||||
```js
|
||||
import { PlaywrightTestConfig } from '@playwright/test';
|
||||
|
||||
const config: PlaywrightTestConfig = {
|
||||
timeout: 30000, // Each test is given 30 seconds.
|
||||
|
||||
// A project per browser, each running all the tests.
|
||||
projects: [
|
||||
{
|
||||
name: 'chromium',
|
||||
use: {
|
||||
browserName: 'chromium',
|
||||
headless: true,
|
||||
viewport: { width: 1280, height: 720 },
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
name: 'webkit',
|
||||
use: {
|
||||
browserName: 'webkit',
|
||||
headless: true,
|
||||
viewport: { width: 1280, height: 720 },
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
name: 'firefox',
|
||||
use: {
|
||||
browserName: 'firefox',
|
||||
headless: true,
|
||||
viewport: { width: 1280, height: 720 },
|
||||
},
|
||||
}
|
||||
],
|
||||
};
|
||||
export default config;
|
||||
```
|
||||
|
||||
## Run the test suite
|
||||
|
||||
Tests can be run in single or multiple browsers, in parallel or sequentially.
|
||||
|
||||
```sh
|
||||
# Run all tests across Chromium, Firefox and WebKit
|
||||
$ npx folio --config=config.ts
|
||||
|
||||
# Run tests on a single browser
|
||||
$ npx folio --config=config.ts --project=chromium
|
||||
|
||||
# Run tests sequentially
|
||||
$ npx folio --config=config.ts --workers=1
|
||||
|
||||
# Retry failing tests
|
||||
$ npx folio --config=config.ts --retries=2
|
||||
|
||||
# See all options
|
||||
$ npx folio --help
|
||||
```
|
||||
|
||||
Refer to the [command line documentation][folio-cli] for all options.
|
||||
|
||||
### Configure NPM scripts
|
||||
|
||||
Save the run command as an NPM script.
|
||||
|
||||
```json
|
||||
{
|
||||
"scripts": {
|
||||
"test": "npx folio --config=config.ts"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
[folio]: https://github.com/microsoft/folio
|
||||
[folio-annotations]: https://github.com/microsoft/folio#annotations
|
||||
[folio-cli]: https://github.com/microsoft/folio#command-line
|
||||
[folio-reporters]: https://github.com/microsoft/folio#reporters
|
||||
|
|
@ -1,12 +1,16 @@
|
|||
---
|
||||
id: test-runners
|
||||
title: "Test Runners"
|
||||
title: "Third party runners"
|
||||
---
|
||||
|
||||
With a few lines of code, you can hook up Playwright to your favorite JavaScript test runner.
|
||||
With a few lines of code, you can hook up Playwright to your existing JavaScript test runner.
|
||||
|
||||
<!-- TOC -->
|
||||
|
||||
## @playwright/test
|
||||
|
||||
[@playwright/test](./test-runner-intro.md) is our first-party recommended test runner to be used with Playwright. Learn more about it [here](./test-runner-intro.md).
|
||||
|
||||
## Jest / Jasmine
|
||||
|
||||
For Jest, [jest-playwright](https://github.com/playwright-community/jest-playwright) can be used. However for a light-weight solution, requiring playwright directly works fine. Jest shares it's syntax with Jasmine, so this applies to Jasmine as well.
|
||||
|
|
|
|||
Loading…
Reference in a new issue