Automated testing using WordPress Playground and Blueprints

Learn how to leverage WordPress Playground and Blueprints for automated end-to-end browser and performance testing.

Late last year I published a detailed tutorial for getting started with end‑to‑end performance testing in WordPress. It was accompanied by a template GitHub repository and a dedicated GitHub Action for effortlessly running performance tests with zero setup.

Introductory blog post to browser-based performance testing in WordPress projects

While that GitHub Action works extremely well, the zero-setup approach has two drawbacks:

  1. It is not possible to configure the test environment, for example by adding demo content or changing plugin configuration
  2. It is not possible to test more complex scenarios, like any user interactions (e.g. for INP)

For (2) the best alternative right now is to go with the manual approach. For (1), I have now found a solution in WordPress Playground. Playground is a platform that lets you run WordPress instantly on any device. It can be seen as a replacement for the Docker-based @wordpress/env tool.

A playground set with a slide and a stairway. There are trees in the background.
A real playground but just as fun! Photo by Hudson Roseboom on Unsplash

Using Blueprints for automated testing

One particular strength of WordPress Playground is the idea of Blueprints. Blueprints are JSON files for setting up your WordPress Playground instance. In other words, they are a declarative way for configuring WordPress—like a recipe. A blueprint for installing a specific theme and plugin could look like this:

{
	"steps": [
		{
			"step": "installPlugin",
			"pluginZipFile": {
				"resource": "wordpress.org/plugins",
				"slug": "performance-lab"
			}
		},
		{
			"step": "installTheme",
			"themeZipFile": {
				"resource": "wordpress.org/themes",
				"slug": "twentytwentyone"
			}
		}
	]
}Code language: JSON / JSON with Comments (json)

Performance testing 2.0

The newly released version 2 of the performance testing GitHub Action now uses Blueprints under the hood to set up the testing environment and do things like importing demo content and installing mandatory plugins and themes. In addition to that, you can now use Blueprints for your own dedicated setup!

This way you can install additional plugins, change the site language, define some options, or even run arbitrary WP-CLI commands. There are tons of possible steps and also a Blueprints Gallery with real-world code examples.

To get started, add a new swissspidy/wp-performance-action@v2 step to your workflow (e.g. .github/workflows/build-test.yml):

steps:
  - name: Checkout
    uses: actions/checkout@v4
  
  - name: Run performance tests
    uses: swissspidy/wp-performance-action@v2
    with:
      urls: |
        /
        /sample-page/
      plugins: |
        ./my-awesome-plugin
      blueprint: ./my-custom-blueprint.json
      iterations: 5
      repetitions: 1Code language: YAML (yaml)

Then, add the blueprint (my-custom-blueprint.json):

{
  "$schema": "https://playground.wordpress.net/blueprint-schema.json",
  "plugins": [
    "performant-translations",
    "akismet"
  ],
  "steps": [
    {
      "step": "defineWpConfigConsts",
      "consts": {
        "WP_DEBUG": true
      }
    },
    {
      "step": "activatePlugin",
      "pluginName": "My Awesome Plugin",
      "pluginPath": "/wordpress/wp-content/plugins/my-awesome-plugin"
    }
  ]
}Code language: JSON / JSON with Comments (json)

And that’s it!

The GitHub Action will now use your custom blueprint to install and activate your own custom plugin and performance-lab and akismet plugins from the plugin directory.

Alongside this new feature I also included several bug fixes for things I originally planned to add but never really finished. For instance, it is now actually possible to run the performance tests twice and then compare the difference between the results.

This way, when you submit a pull request you can run tests first for the main branch and then for your PR branch to quickly see at a glance how the PR affects performance. Here is an example:

jobs:
  comparison:
    runs-on: ubuntu-latest

    steps:

    # Check out the target branch and build the plugin
    # ...

    - name: Run performance tests (before)
      id: before
      uses: ./
      with:
        urls: |
          /
          /sample-page/
        plugins: |
          ./tests/dummy-plugin
        blueprint: ./my-custom-blueprint.json
        print-results: false
        upload-artifacts: false

    # Check out the current branch and build the plugin
    # ...

    - name: Run performance tests (after)
      uses: ./
      with:
        urls: |
          /
          /sample-page/
        plugins: |
          ./tests/dummy-plugin
        blueprint: ./my-custom-blueprint.json
        previous-results: ${{ steps.before.outputs.results }}
        print-results: true
        upload-artifacts: falseCode language: PHP (php)

The result will look a bit like this:

Screenshot of the performance tests results printed in a GitHub Actions workflow summary, comparing metrics such as LCP or memory usage before and after a change.
Example workflow summary when comparing two sets of performance testing results.

Playground is the future

Being able to use Playground for automated testing is really exciting. It simplifies a lot of the setup and speeds up the bootstrapping, even though the sites themselves aren’t as fast (yet) as when using a Docker-based setup. However, there is a lot of momentum behind WordPress Playground and it is getting better every day. Applications like this one further help push its boundaries.

I had similar success so far when testing Playground with our WordPress performance comparison script and I think it could work well for the Plugin Check GitHub Action.

WordPress Playground clearly is the future.

Comments

5 responses to “Automated testing using WordPress Playground and Blueprints”

  1. Dima Avatar
    Dima

    Hey, looks pretty cool

    But how do you import demo content?

    1. Pascal Avatar

      Using a Blueprint! 🙂

      Blueprints make it very easy to import WXR files or create dummy content using WP-CLI or even some PHP code.

      You could therefore easily create a dummy site, export it as WXR, and then import that in your tests.

    2. JuanMa Avatar

      This Playground Docs’ guide explains several ways to import demo content via blueprints
      https://wordpress.github.io/wordpress-playground/guides/providing-content-for-your-demo

  2. Paul Wong-Gibbs Avatar
    Paul Wong-Gibbs

    Hey Pascal

    Neat stuff, thank you for sharing. Have you looked into self-hosting the Playground stack? Reason being it would be interesting to use it as a base for tests during CI for a theme / client site, but there are data protection concerns uploading it to the Playground site.

    1. Pascal Avatar

      Hey Paul,

      Using Playground doesn’t require uploading any data to the Playground site.

      The GitHub Action mentioned in this article uses the `@wp-playground/cli` package under the hood, which is also what’s used by wp-now for spinning up Playground locally.

      With this CLI package you can set up Playground on your computer or on CI without uploading any data elsewhere.

Leave a Reply

Your email address will not be published. Required fields are marked *