puppeteer/test
Alexandra Borovova 31ff55cc03
chore: filter expectations by the whole test or file name (#9503)
<!-- Thanks for submitting a pull request! Please provide enough
information so that others can review your pull request. -->

**What kind of change does this PR introduce?**

This is a change to a custom mocha runner to look for expectation of the
test case by the whole test name instead of by the part of the name.

**Summary**

Working on integration of the puppeteer expectation file in mozilla repo
and unskipping a lot of tests, I've noticed that some tests get wrong
statuses. For example, a test case with the name `navigation Page.goto
should fail when navigating to bad SSL` got the status of `navigation
Page.goto should fail when navigating to bad SSL after redirects` or
`ElementHandle specs ElementHandle.boundingBox should work` get the
status of `ElementHandle specs ElementHandle.boundingBox should work
with SVG nodes`. So it seems like checking for the whole name of the
test should be safer, but let me know if I'm missing something here.

**Does this PR introduce a breaking change?**
no
2023-01-13 16:14:37 +01:00
..
assets feat: add ability to collect JS code coverage at the function level (#9027) 2022-10-06 23:53:05 +02:00
fixtures chore: use strict typing in tests (#8524) 2022-06-15 12:09:22 +02:00
golden-chromium feat(chromium): roll to Chromium 110.0.5479.0 (r1083080) (#9500) 2023-01-12 11:31:20 +01:00
golden-firefox chore: add missing golden asset for firefox (#9171) 2022-10-27 09:33:38 +00:00
installation feat: use configuration files (#9140) 2022-10-21 15:09:21 +02:00
src feat(chromium): roll to Chromium 110.0.5479.0 (r1083080) (#9500) 2023-01-12 11:31:20 +01:00
.eslintrc.js chore: use braces in function bodies (#8525) 2022-06-15 12:42:21 +02:00
package.json chore: use test runner for installation tests (#9110) 2022-10-14 13:37:07 +02:00
README.md docs: various doc improvements (#9396) 2022-12-09 13:57:39 +01:00
TestExpectations.json chore: filter expectations by the whole test or file name (#9503) 2023-01-13 16:14:37 +01:00
TestSuites.json chore: add BiDi integration for Chromium (#9410) 2022-12-20 14:37:31 +00:00
tsconfig.json chore: refactor utils (#9053) 2022-10-06 10:27:14 +02:00

Puppeteer tests

Unit tests in Puppeteer are written using Mocha as the test runner and Expect as the assertions library.

Test state

We have some common setup that runs before each test and is defined in mocha-utils.js.

You can use the getTestState function to read state. It exposes the following that you can use in your tests. These will be reset/tidied between tests automatically for you:

  • puppeteer: an instance of the Puppeteer library. This is exactly what you'd get if you ran require('puppeteer').
  • puppeteerPath: the path to the root source file for Puppeteer.
  • defaultBrowserOptions: the default options the Puppeteer browser is launched from in test mode, so tests can use them and override if required.
  • server: a dummy test server instance (see packages/testserver for more).
  • httpsServer: a dummy test server HTTPS instance (see packages/testserver for more).
  • isFirefox: true if running in Firefox.
  • isChrome: true if running Chromium.
  • isHeadless: true if the test is in headless mode.

If your test needs a browser instance, you can use the setupTestBrowserHooks() function which will automatically configure a browser that will be cleaned between each test suite run. You access this via getTestState().

If your test needs a Puppeteer page and context, you can use the setupTestPageAndContextHooks() function which will configure these. You can access page and context from getTestState() once you have done this.

The best place to look is an existing test to see how they use the helpers.

Skipping tests in specific conditions

To skip tests edit the TestExpecations file. See test runner documentation for more details.

Running tests

  • To run all tests applicable for your platform:
npm test
  • Important: don't forget to first build the code if you're testing local changes:
npm run build && npm test
  • To run a specific test, substitute the it with it.only:
  ...
  it.only('should work', async function() {
    const {server, page} = getTestState();
    const response = await page.goto(server.EMPTY_PAGE);
    expect(response.ok).toBe(true);
  });
  • To disable a specific test, substitute the it with it.skip:
  ...
  it.skip('should work', async function({server, page}) {
    const {server, page} = getTestState();
    const response = await page.goto(server.EMPTY_PAGE);
    expect(response.ok).toBe(true);
  });
  • To run Chrome headful tests:
npm run test:chrome:headful
  • To run tests with custom browser executable:
BINARY=<path-to-executable> npm run test:chrome:headless # Or npm run test:firefox