Skip to content

Latest commit

 

History

History
307 lines (229 loc) · 22.7 KB

TESTING.md

File metadata and controls

307 lines (229 loc) · 22.7 KB

Testing in AMP HTML

This document provides details for testing and building your AMP code.

Contents

Testing commands

Before running these commands, make sure you have Node.js, yarn, and Gulp installed. For installation instructions, see the One-time setup section in the Quick Start guide.

Command Description
gulp Runs "watch" and "serve". Use this for standard local dev.
gulp --extensions=amp-foo,amp-bar Runs "watch" and "serve", after building only the listed extensions.
gulp --extensions=minimal_set Runs "watch" and "serve", after building the extensions needed to load article.amp.html.
gulp --extensions_from=examples/foo.amp.html Runs "watch" and "serve", after building only extensions from the listed examples.
gulp --noextensions Runs "watch" and "serve" without building any extensions.
gulp dist Builds production binaries.
gulp dist --extensions=amp-foo,amp-bar Builds production binaries, with only the listed extensions.
gulp dist --extensions=minimal_set Builds production binaries, with only the extensions needed to load article.amp.html.
gulp dist --extensions_from=examples/foo.amp.html Builds production binaries, with only extensions from the listed examples.
gulp dist --noextensions Builds production binaries without building any extensions.
gulp dist --fortesting Builds production binaries for local testing. (Allows use cases like ads, tweets, etc. to work with minified sources. Overrides TESTING_HOST if specified. Uses the production AMP_CONFIG by default.)
gulp dist --fortesting --config=<config> Builds production binaries for local testing, with the specified AMP_CONFIG. config can be prod or canary. (Defaults to prod.)
gulp lint Validates against the ESLint linter.
gulp lint --watch Watches for changes in files, and validates against the ESLint linter.
gulp lint --fix Fixes simple lint warnings/errors automatically.
gulp lint --files=<files-path-glob> Lints just the files provided. Can be used with --fix.
gulp lint --local-changes Lints just the files changed in the local branch. Can be used with --fix.
gulp build Builds the AMP library.
gulp build --extensions=amp-foo,amp-bar Builds the AMP library, with only the listed extensions.
gulp build --extensions=minimal_set Builds the AMP library, with only the extensions needed to load article.amp.html.
gulp build --extensions_from=examples/foo.amp.html Builds the AMP library, with only the extensions needed to load the listed examples.
gulp build --noextensions Builds the AMP library with no extensions.
gulp check-links --files foo.md,bar.md Reports dead links in .md files.
gulp clean Removes build output.
gulp css Recompiles css to build directory and builds the embedded css into js files for the AMP library.
gulp watch Watches for changes in files, re-builds.
gulp watch --extensions=amp-foo,amp-bar Watches for changes in files, re-builds only the listed extensions.
gulp watch --extensions=minimal_set Watches for changes in files, re-builds only the extensions needed to load article.amp.html.
gulp watch --extensions_from=examples/foo.amp.html Watches for changes in files, re-builds only the extensions needed to load the listed examples.
gulp watch --noextensions Watches for changes in files, re-builds with no extensions.
gulp pr-check Runs all the Travis CI checks locally.
gulp pr-check --nobuild Runs all the Travis CI checks locally, but skips the gulp build step.
gulp pr-check --files=<test-files-path-glob> Runs all the Travis CI checks locally, and restricts tests to the files provided.
gulp test --unit Runs the unit tests in Chrome (doesn't require the AMP library to be built).
gulp test --unit --files=<test-files-path-glob> Runs the unit tests from the specified files in Chrome.
gulp test --local-changes Runs the unit tests directly affected by the files changed in the local branch in Chrome.
gulp test --integration Runs the integration tests in Chrome (requires the AMP library to be built).
gulp test --integration --files=<test-files-path-glob> Runs the integration tests from the specified files in Chrome.
gulp test [--unit|--integration] --verbose Runs tests in Chrome with logging enabled.
gulp test [--unit|--integration] --nobuild Runs tests without re-build.
gulp test [--unit|--integration] --coverage Runs code coverage tests. After running, the report will be available at test/coverage/index.html
gulp test [--unit|--integration] --watch Watches for changes in files, runs corresponding test(s) in Chrome.
gulp test [--unit|--integration] --watch --verbose Same as watch, with logging enabled.
gulp test [--integration] --saucelabs Runs integration tests on saucelabs (requires setup).
gulp test [--unit] --saucelabs_lite Runs unit tests on a subset of saucelabs browsers (requires setup).
gulp test [--unit|--integration] --safari Runs tests in Safari.
gulp test [--unit|--integration] --firefox Runs tests in Firefox.
gulp test [--unit|--integration] --files=<test-files-path-glob> Runs specific test files.
gulp test [--unit|--integration] --testnames Lists the name of each test being run, and prints a summary at the end.
gulp serve Serves content in repo root dir over http://localhost:8000/. Examples live in http://localhost:8000/examples/. Serve unminified AMP by default.
gulp serve --quiet Same as serve, with logging silenced.
gulp serve --port 9000 Same as serve, but uses a port number other than the default of 8000.
gulp serve --inspect Same as serve, but runs the server in node --inspect mode
gulp check-types Verifies that there are no errors associated with Closure typing. Run automatically upon push.
gulp dep-check Runs a dependency check on each module. Run automatically upon push.
gulp presubmit Run validation against files to check for forbidden and required terms. Run automatically upon push.
gulp validator Builds and tests the AMP validator. Run automatically upon push.
node build-system/pr-check.js Runs all tests that will be run upon pushing a CL.
gulp ava Run node tests for tasks and offline/node code using ava.
gulp todos:find-closed Find TODOs in code for issues that have been closed.
gulp visual-diff Runs all visual diff tests on local Chrome. Requires PERCY_PROJECT and PERCY_TOKEN to be set as environment variables or passed to the task with --percy_project and --percy_token.
gulp visual-diff --nobuild Same as above, but without re-build.
gulp visual-diff --headless Same as above, but launches local Chrome in headless mode.
gulp visual-diff --chrome_debug --webserver_debug Same as above, with additional logging. Debug flags can be used independently.
gulp visual-diff --grep=<regular-expression-pattern> Same as above, but executes only those tests whose name matches the regular expression pattern.
gulp firebase Generates a folder firebase and copies over all files from examples and test/manual for firebase deployment.
gulp firebase --file path/to/file Same as above, but copies over the file specified as firebase/index.html.

Manual testing

For manual testing build AMP and start the Node.js server by running gulp.

Serve Mode

There are 3 serving modes:

  • DEFAULT mode serves unminified AMP. You want to use this during normal dev.
  • COMPILED mode serves minified AMP. This is closer to the prod setup. This is only available after running gulp dist --fortesting. Serve MIN mode by adding --compiled to gulp command.
  • CDN mode serves prod. These remote files would not reflect your local changes. Serve CDN mode by adding --cdn to gulp command.

To switch serving mode during runtime, go to http://localhost:8000/serve_mode=$mode and set the $mode to one of the following values: default, compiled, or cdn.

Examples

The content in the examples directory can be reached at: http://localhost:8000/examples/

Document proxy

AMP ships with a local proxy for testing production AMP documents with the local JS version.

For any public AMP document like: http://output.jsbin.com/pegizoq/quiet,

You can access it with the local JS at

http://localhost:8000/proxy/output.jsbin.com/pegizoq/quiet.

Note: The local proxy will serve minified or unminified JS based on the current serve mode. When serve mode is cdn, the local proxy will serve remote JS. When accessing minified JS make sure you run gulp dist with the --fortesting flag so that we do not strip out the localhost code paths. (We do some code elimination to trim down the file size for the file we deploy to production)

If the origin resource is on HTTPS, the URLs are http://localhost:8000/proxy/s/output.jsbin.com/pegizoq/quiet

A4A envelope (/a4a/, /a4a-3p/)

If you are working on AMPHTML ads, you can use the local A4A envelope for testing local and production AMP documents with the local JS version.

A4A can be run either of these two modes:

  1. Friendly iframe mode: http://localhost:8000/a4a/...
  2. 3p iframe mode: http://localhost:8000/a4a-3p/...

The following forms are supported:

When accessing minified JS make sure you run gulp dist with the --fortesting flag so that we do not strip out the localhost code paths. (We do some code elimination to trim down the file size for the file we deploy to production)

If the origin resource is on HTTPS, the URLs are http://localhost:8000/a4a[-3p]/proxy/s/output.jsbin.com/pegizoq/quiet

Notice that all documents are assumed to have a "fake" signature. Thus, this functionality is only available in the localDev mode.

Additionally, the following query parameters can be provided:

  • width - the width of the amp-ad (default "300")
  • height - the height of the amp-ad (default "250")
  • offset - the offset to push the amp-ad down the page (default "0px"). Can be used to push the Ad out of the viewport, e.g. using offset=150vh.

In-a-box envelope (/inabox/)

If you are working on AMP In-a-box Ads, you can use the local in-a-box envelope for testing local and production AMP documents with the local JS version.

Make sure to run gulp with --with_inabox flag.

The following forms are supported:

Additionally, the following query parameters can be provided:

  • width - the width of the iframe (default "300")
  • height - the height of the iframe (default "250")
  • offset - the offset to push the iframe down the page (default "0px"). Can be used to push the Ad out of the viewport, e.g. using offset=150vh.

Chrome extension

For testing documents on arbitrary URLs with your current local version of the AMP runtime we created a Chrome extension.

Testing on Sauce Labs

In general local testing (i.e. gulp test) and the automatic test run on Travis that happens when you send a pull request are sufficient. If you want to run your tests across multiple environments/browsers before sending your PR you can use Sauce Labs.

To run the tests on Sauce Labs:

  • Create a Sauce Labs account. If you are only going to use your account for open source projects like this one you can sign up for a free Open Sauce account. (If you create an account through the normal account creation mechanism you'll be signing up for a free trial that expires; you can contact Sauce Labs customer service to switch your account to Open Sauce if you did this accidentally.)

  • Set the SAUCE_USERNAME and SAUCE_ACCESS_KEY environment variables. On Linux add this to your .bashrc:

    export SAUCE_USERNAME=<Sauce Labs username>
    export SAUCE_ACCESS_KEY=<Sauce Labs access key>
    

    You can find your Sauce Labs access key on the User Settings page.

  • Install the Sauce Connect Proxy.

  • Run the proxy and then run the tests:

    # start the proxy
    sc
    
    # after seeing the "Sauce Connect is up" msg, run the tests
    gulp test --saucelabs
    
  • It may take a few minutes for the tests to start. You can see the status of your tests on the Sauce Labs Automated Tests dashboard. (You can also see the status of your proxy on the Tunnels dashboard.

Visual Diff Tests

NOTE: We are working on giving all ampproject/amphtml committers automatic access to visual diff test results. Until this is in place, you can fill out this form, and your request should be approved soon.

In addition to building the AMP runtime and running gulp test, the automatic test run on Travis includes a set of visual diff tests to make sure a new commit to master does not result in unintended changes to how pages are rendered. The tests load a few well-known pages in a browser and compare the results with known good versions of the same pages.

The technology stack used is:

  • Percy, a visual regression testing service for webpages
  • Puppeteer, a driver capable of loading webpages for diffing
  • Percy-Puppeteer, a framework that integrates Puppeteer with Percy
  • (Headless) Chrome, the Chrome browser, optionally in headless mode

The ampproject/amphtml repository on GitHub is linked to the Percy project of the same name. All PRs will show a check called percy/amphtml in addition to the continuous-integration/travis-ci/pr check. If your PR results in visual diff(s), clicking on the details link will show you the snapshots with the diffs highlighted.

Failing Tests

When a test run fails due to visual diffs being present, click the details link next to percy/amphtml in your PR and examine the results. By default, Percy highlights the changes between snapshots in red. Clicking on the new snapshot will show it in its raw form. If the diffs indicate a problem that is likely to be due to your PR, you can try running the visual diffs locally in order to debug (see section below). However, if you are sure that the problem is not due to your PR, you may click the green Approve button on Percy to approve the snapshots and unblock your PR from being merged.

Running Visual Diff Tests Locally

You can also run the visual tests locally during development. You must first create a free Percy account at https://percy.io, create a project, and set the PERCY_PROJECT and PERCY_TOKEN environment variables using the unique values you find at https://percy.io/<org>/<project>/settings. Once the environment variables are set up, you can run the AMP visual diff tests as described below.

First, build the AMP runtime and run the gulp task that invokes the visual diff script:

gulp build
gulp visual-diff --nobuild

Note that if you drop the --nobuild flag, gulp visual-diff will run gulp build on each execution.

The build will use the Percy credentials set via environment variables in the previous step, and run the tests on your local install of Chrome. You can see the results at https://percy.io/<org>/<project>.

To run Chrome in headless mode, use:

 gulp visual-diff --headless

To see debugging info during Percy runs, you can run:

 gulp visual-diff --chrome_debug --webserver_debug

The debug flags --chrome_debug and --webserver_debug can be used independently. To enable both debug flags, you can also run:

 gulp visual-diff --debug

To execute only a subset of the tests (i.e., when creating or debugging an existing test) use the --grep regular expression flag. e.g., gulp visual-diff --grep="amp-[a-f]" will execute on tests that have an AMP component name between <amp-a...> through <amp-f...>.

After each run, a new set of results will be available at https://percy.io/<org>/<project>.

Testing on devices

Testing with ngrok

It's much faster to debug with local build (gulp + http://localhost:8000/). In Chrome you can use DevTools port forwarding. However, iOS Safari does not give a similar option. Instead, you can use ngrok. Just download the ngrok binary for your platform and run it like this:

ngrok http 8000

Once started, the ngrok will print URLs for both http and https. E.g. http://73774d8c.ngrok.io/ and https://73774d8c.ngrok.io/. These URLs can be used to debug on iOS and elsewhere.

Testing with Heroku

For deploying and testing local AMP builds on HEROKU , please follow the steps outlined in this document.

In the meantime you can also use our automatic build on Heroku link, which is normally built with latest head on master branch (please allow delay). The first time load is normally slow due to Heroku's free account throttling policy.

To correctly get ads and third party working when testing on hosted services you will need set the AMP_TESTING_HOST environment variable. (On heroku this is done through heroku config:set AMP_TESTING_HOST=my-heroku-subdomain.herokuapp.com)

Testing with Firebase

For deploying and testing local AMP builds on Firebase, install firebase and initialize firebase within this directory, setting the public folder to firebase (a firebase folder can be generated with the command, gulp firebase).

npm install -g firebase-tools
firebase login
firebase init
gulp firebase
firebase deploy

gulp firebase will generate a firebase folder and copy over all files from examples and test/manual. It will rewrite all urls in the copied files to point to the local versions of AMP.