I recently discovered an easy way to add unit tests to my plugins. I’ve been using WP-CLI for years now to set up new local installs of WordPress and found out it has a command specifically for setting up PHPUnit for plugins. This post is partially for my future self so I can remember how to do all this. FYI, I’m on a Mac, so all the commands will be OS X-specific.
Install and Configure PHPUnit
Start by installing PHPUnit using Homebrew:
brew install phpunit
That installs the latest version of PHPUnit and makes it ready to use with the global keyword “phpunit”.
Next, use WP-CLI to setup the test suites and such needed for PHPUnit. I recommend running this command from the plugin’s directory.
wp scaffold plugin-tests my-plugin
Replace the “my-plugin” part with your plugin name.
If you aren’t already in your plugin directory, change to that now. Then you’ll run the installation bash script.
bin/install-wp-tests.sh wordpress_test root '' localhost latest
Notes about this command:
- ‘wordpress_test’ is the MySQL database created by this script and used for testing
- ‘root’ is your local MySQL user
- ” is where your local MySQL user password goes
- ‘localhost’ is where your MySQL server is located; ‘localhost’ means its on your computer.
- ‘latest’ changes the version of WordPress to use for testing.
Once you’ve run this script, you’re ready to start writing tests and running them using the ‘phpunit’ command. Here’s the rub though: the script installs WordPress and the testing suite in the /tmp directory. Why is that a problem? On my computer, at least, the /tmp directory removes anything installed there upon reboot. Which means I need to re-run the tests bash script every time I reboot the computer.
Since we developers prefer not repeating ourselves, here’s how to configure things for a more permanent solution.
Solution
What I’m advising here is to move the stuff installed in /tmp to somewhere else, then fix all the references so they still work. So, run all of the above, then navigate to your /tmp folder. Move the /wordpress and /wordpress-tests-lib folders to another location outside the /tmp folder. I moved mine into a directory called unittests in my Dropbox folder.
Go to your Home folder and either open or create the .bash_profile file. You’ll probably need to tell Finder to show Hidden files first. In your .bash_profile file, add the following line, using your new directory location:
export WP_TESTS_DIR="/Your/New/Folder/Location/unittests/wordpress-tests-lib"
This line tells the PHPUnit bootstrap.php file where to find the test WordPress install and test suite files.
Now, go to the wordpress-tests-lib directory and open the wp-tests-config.php file. Edit the ABSPATH constant to the ‘/wordpress’ directory you copied over from /tmp earlier. Something like:
define('ABSPATH', '/Your/New/Folder/Location/unittests/wordpress//');
Save the file and reboot your computer. Now, the tests setup by WP-CLI know where the testing WordPress is located, it doesn’t disappear when you install updates or reboot, and you can create and run PHPUnit tests for your plugins!