In my earlier articles in this series, I confirmed find out how to construction a WordPress plugin the use of object-oriented PHP. Then I coated unit checking out. Unit exams quilt every element, completely remoted from all different portions of the gadget. Unit exams will have to no longer be desirous about how the article interacts with any dependencies together with the database and WordPress.

As a substitute, as soon as now we have unit exams, we use integration exams to hide the results of our code at the atmosphere it’s in. Typically, we use phpunit for each sorts of exams. We simply use them another way. We will be able to call to mind phpunit as each a suite of assertions we will be able to use to put in writing exams and a verify runner we will be able to use to run the ones exams and even different sorts of exams, for instance, Behat exams.

Integration Checking out With The WordPress Take a look at Suite

The network challenge, various vagrant vagrants (VVV) supplies a gadget for growing native WordPress the use of Vagrant. Incorporated in VVV is a website online designed for growing WordPress core. The SVN repository it installs WordPress from additionally manages the supply of the verify suite.

This website online can be utilized for working the WordPress verify suite with plugins. In the event you open this website online for your IDE, because it incorporates the WordPress verify suite, you will have to get correct autocomplete for ways of the WP_UnitTestCase and different categories within the verify suite.

For extra assets, I coated putting in VVV in a previous Torque article. My pal Ahmad lately covered alternatives for local development in a unique Torque publish. You’ll also find the documentation for installing VVV here.

Environment Up The WordPress Take a look at Suite With VVV

As soon as VVV is put in, you will have to have the ability to run a plugin, whose exams had been created the use of the WP CLI command for scaffolding tests. I coated find out how to use this command to arrange a plugin in an previous article on this sequence.

In that plugin, similar to the instance plugin, I’ve been growing for this sequence — this is the commit before I switched to using Docker. From that plugin’s listing, open a shell after which transfer to the bin dir:

cd bin

Then run the verify set up script:

bash ./install-wp-tests wordpress_unit_tests wordpress wordpress localhost

Then transfer again to the plugin’s listing:

cd ../

You then will have to have the ability to run the exams with none arguments:

phpunit

Environment Up The WordPress Take a look at Suite With Docker

Vagrant was a highly regarded answer for native building. Whilst some nonetheless use it, many builders are transferring to Docker, since it’s extra moveable. Docker makes it a lot more effective to have the similar actual server for native building, native checking out and automatic checking out the use of a CI/CD provider similar to Travis.

In my view, I’ve switched to Docker totally. It’s far more versatile and makes sharing building environments between Ubuntu, Home windows and Mac easy. In the event you’re a Home windows person, make sure to have Home windows 10 Professional or upper and feature hyper-v enabled.

Putting in Docker and Docker fundamentals is past the scope of this text. Truthfully, you don’t want to in reality know the rest about Docker, but even so find out how to set up it to get any of what I’m about to turn you to paintings. That’s a part of what’s so cool about Docker. Listed below are the instructions to install Docker.

Check out It With Gutenberg First

Some of the many stuff I really like in regards to the Gutenberg challenge is it’s a possibility to replace what we use to make WordPress. As an example, we’re now using React, Redux and other very powerful tools for building Javascript-driven interfaces. In consequence, Gutenberg provides us a firstclass reference of the use of React, Redux or different software for growing WordPress plugins.

I’ve been following Gutenberg building so I will expand with Gutenberg, educate Gutenberg, but in addition to check and borrow how they use those new gear. I’m lovely obsessive about optimizing how we do all sorts of automatic checking out for Caldera Paperwork at the moment, so after all, I’ve been studying the way it works in Gutenberg.

So, prior to I display you find out how to arrange Docker to run the WordPress verify suite to your plugin, let’s stroll via find out how to set up and use Gutenberg Docker atmosphere and verify suite. Within the earlier articles on this sequence, I’ve used Composer because the script runner. Gutenberg makes use of npm-scripts for a similar causes — making it more straightforward to run precisely the similar instructions with precisely the similar arguments each time you run a not unusual process, similar to code linting or unit exams.

Gutenberg’s verify suite comprises no longer most effective PHP exams, but in addition JavaScript unit exams, the use of the WordPress JavaScript verify suite, and finish to finish exams. There may be some in reality cool stuff there, however that’s method out of scope for this publish. Don’t fear, I’ll quilt automatic checking out for JavaScript later. Certainly, take a look at out how it works in Gutenberg if you’re curious.

While you set up Gutenberg throughout the WordPress plugin installer, you get a edition optimized to be used in manufacturing environments. This is smart, it’s what the general public who will use Gutenberg want.

You aren’t the general public, delete it and beginning over. It’s going to take longer this fashion.

I’m assuming you’ve git put in, and know the way to make use of it. If that assumption was once wrong, I apologize and offer to you this article I wrote about using Git, and this course on Git from Know The Code. Additionally, my pal Morten gave a in reality cool communicate explaining the idea that of git, for beginners at WordCamp US 2015 that I recommend.

Open up a shell — for instance the use of OSX’s Terminal app — for your native WordPress website online’s plugin listing. I exploit phpStorm, so I simply drag the plugins listing into the terminal and it’s magically there.

Then it is important to clone the newest edition of Gutenberg from Github.

git clone git@github.com:WordPress/gutenberg.git

Then, as soon as it’s carried out, transfer to the brand new listing

cd gutenberg

Now now we have Gutenberg, however not one of the JavaScript recordsdata had been constructed. We simply have the supply recordsdata, which get compiled the use of weback. Webpack is put in the use of npm and run the use of npm scripts. So first, set up the npm dependencies:

npm set up

Now now we have the entirety we want to construct the JavaScript shopper the use of npm:

npm run dev

Now we will be able to setup the verify suite by means of working the installer script:

bash ./bin/install-docker.sh

That are meant to be it. You will have to have the ability to see the WordPress website online that you simply created with docker at http://localhost:8888/. You additionally will have to have the ability to run the unit exams with this command:

npm run test-php

You’ll slo run JavaScript unit exams:

npm run test-unit

You realize have the entirety you wish to have to give a contribution to Gutenberg and write exams to turn out your contribution works as meant. You’ll be informed extra about Gutenberg verify at: https://github.com/WordPress/gutenberg/blob/master/docs/testing-overview.md

Need To Create Your Personal?

In Gutenberg, they put numerous element paintings into checking out outdated variations of PHP and supporting different sorts of native environments.

If you wish to have an instance of find out how to use Docker and trendy PHP for plugin building, I like to recommend instance code by means of Chris Zarate and you can find the original code on Github. Gutenberg’s Docker configuration makes use of the chriszarate/wordpress/ container. You will have to be sensing a development right here. I’ve added a couple of issues from Gutenberg to Chris’ authentic instance code, in my instance plugin.

This is the docker-composer.yml:

edition: '3.1'

services and products:

  wordpress:
    symbol: wordpress
    ports:
      - 8888:80
    atmosphere:
      WORDPRESS_DB_PASSWORD: instance
      ABSPATH: /usr/src/wordpress/
    volumes:
      - wordpress:/var/www/html
      - .:/var/www/html/wp-content/plugins/rest-api-search

  cli:
    symbol: wordpress:cli
    volumes:
      - wordpress:/var/www/html
      - .:/var/www/html/wp-content/plugins/rest-api-search

  mysql:
    symbol: mysql:5.7
    atmosphere:
      MYSQL_ROOT_PASSWORD: instance
      MYSQL_DATABASE: wordpress_test

  wordpress_phpunit:
    symbol: chriszarate/wordpress-phpunit
    atmosphere:
      PHPUNIT_DB_HOST: mysql
    volumes:
      - .:/app
      - testsuite:/tmp

  composer:
    symbol: composer
    volumes:
      - .:/app

volumes:
  testsuite:
  wordpress:

As soon as now we have our docker-compose.yml record, we will be able to beginning the server with this command:

docker-compose -f docker-compose.yml up -d

That are meant to display us a WordPress website online at http://localhost:8888. If that’s operating, we will be able to upload our exams with this:

docker-compose -f docker-compose.yml run --rm wordpress_phpunit /app/bin/install-wp-tests.sh wordpress_test root '' mysql_phpunit recent true`

This is anticipating a record in bin/install-wp-tests.sh. I changed mine from the usual one I had prior to the use of code borrowed from Gutenberg.

With this in position, I will run the exams with this command:

docker-compose run --rm wordpress_phpunit phpunit

I’d by no means be ready to bear in mind all of that. That’s why I love Composer scripts such a lot. In earlier articles within the sequence, I created composer scripts for different steps within the procedure. As a substitute of encapsulating all of the ones set up steps, I borrowed the docker install script from Gutenberg.

Now, let’s upload the brand new Composer scripts. Every script will have to encapsulate a step of the method. All of those relate to WordPress, so let’s prefix them with “wp-”. The primary shall be “wp-install”. This may occasionally name the brand new set up script, stored at bin/install-docker.sh that units up WordPress, updates the plugin’s Composer dependencies and installs the WordPress unit verify suite. That’s the entirety we want to do prior to working the exams:

#!/bin/bash

#Set WordPress edition
WP_VERSION=${1-latest}

# Go out if any command fails
set -e

# Come with helpful purposes
. "$(dirname "$0")/comprises.sh"

# Test that Docker is put in
if ! command_exists "docker"; then
	echo -e $(error_message "Docker does not appear to be put in. Please head on over to the Docker website online to obtain it: $(action_format "https://www.docker.com/community-edition#/obtain")")
	go out 1
fi

# Test that Docker is working
if ! docker information >/dev/null 2>&1; then
	echo -e $(error_message "Docker is not working. Please take a look at that you've got began your Docker app, and spot it for your gadget tray.")
	go out 1
fi

# Prevent present packing containers
echo -e $(status_message "Preventing Docker packing containers...")
docker-compose down --remove-orphans >/dev/null 2>&1

# Obtain symbol updates
echo -e $(status_message "Downloading Docker symbol updates...")
docker-compose pull --parallel

# Release the packing containers
echo -e $(status_message "Beginning Docker packing containers...")
docker-compose up -d >/dev/null

HOST_PORT=$(docker-compose port wordpress 80 | awk -F : '{printf $2}')

# Wait till the docker packing containers are setup properely
echo -en $(status_message "Making an attempt to connect with wordpress...")
till $(curl -L http://localhost:$HOST_PORT -so - 2>&1 | grep -q "WordPress"); do
    echo -n '.'
    sleep 5
carried out
echo ''

# Set up WordPress
echo -e $(status_message "Putting in WordPress...")
docker-compose run --rm -u 33 cli core set up --url=localhost:$HOST_PORT --title=TestSite --admin_user=admin --admin_password=password --admin_email=verify@verify.com >/dev/null
# Test for WordPress updates, simply in case the WordPress symbol is not up-to-the-minute.
docker-compose run --rm -u 33 cli core replace >/dev/null

# If the 'wordpress' quantity wasn't all the way through the down/up previous, however the publish port has modified, we want to replace it.
CURRENT_URL=$(docker-compose run -T --rm cli choice get siteurl)
if [ "$CURRENT_URL" != "http://localhost:$HOST_PORT" ]; then
	docker-compose run --rm cli choice replace house "http://localhost:$HOST_PORT" >/dev/null
	docker-compose run --rm cli choice replace siteurl "http://localhost:$HOST_PORT" >/dev/null
fi
echo -e $(status_message "Server is working at:")
echo -e $(status_message "http://localhost:$HOST_PORT")

# Set up Composer
echo -e $(status_message "Putting in and updating Composer modules...")
docker-compose run --rm composer set up

# Set up the PHPUnit verify scaffolding
echo -e $(status_message "Putting in PHPUnit verify scaffolding...")
docker-compose run --rm wordpress_phpunit /app/bin/install-wp-tests.sh wordpress_test root instance mysql "${WP_VERSION}" false >/dev/null
echo -e $(status_message "Finished putting in exams")

Then we’d like one to begin the server. Let’s name it wp-start We don’t want bash script for that. It’s simply:

docker-compose up -d

Then we’d like one to run the exams, it’s the similar command as final I confirmed prior to, we’re simply wrapping it in a composer script referred to as wp-tests

docker-compose run --rm wordpress_phpunit phpunit

Now, the composer.json scripts looks as if this:

{
    "exams" : "composer fixes && composer sniffs && composer unit-tests && composer wp-tests",
    "unit-tests": "phpunit --testsuite=unit",
    "wp-install": "bash ./bin/install-docker.sh",
    "wp-start": "docker-compose up -d",
    "wp-tests": "docker-compose run --rm wordpress_phpunit phpunit --configuration phpunit-integration.xml.dist",
    "phpunit-v": "phpunit --version",
    "sniffs" : "phpcs src/ && phpcs exams/",
    "fixes" : "phpcbf src/ && phpcbf exams/",
    "lints" : "parallel-lint ./src  --blame --exclude dealer && parallel-lint ./exams  --blame --exclude dealer"
}

Workshop At WordCamp EU 2018

If you wish to know much more about unit checking out, take a look at the workshop by means of Thorsten Frommen, Carl Alexander and Giuseppe Mazzapica at this 12 months’s WordCamp Europe. Those 3 are all Apex WordPress Builders and I might strongly suggest this workshop to any individual. I positive hope I will make it or the movies make it to WordPress.television, which they will have to.

There are more details about this workshop here.

Transferring Ahead

Within the subsequent publish on this sequence, I’ll quilt writing integration exams with the WordPress PHP verify suite. I’ll quilt what integrations to check, preserving unit exams separate, the use of mocks, and what assumptions about WordPress and the database we will be able to and can’t make when writing those exams.

Josh Pollock

Josh is a WordPress developer and educator. He’s the founding father of Caldera Labs, makers of superior WordPress gear together with Caldera Forms — a drag and drop, responsive WordPress shape builder. He teaches WordPress building at Caldera Learn.

The publish Advanced OOP For WordPress Pt. 4: Setting Up With WordPress Test Suite For Integration Testing seemed first on Torque.

WordPress Agency

[ continue ]