WordPressのテーマで自動的にローカルにテスト環境を構築してPHPUnitを実行する

WP-CLI にはwp scaffold plugin-testsというコマンドがあります。任意のプラグインのディレクトリでこのコマンドを実行すると PHPUnit を実行するために必要ないくつかのファイルとユニットテストを実行するための WordPress 環境をローカルに構築するシェルスクリプトが展開されます。

プラグインの場合はこのコマンドを打つだけで簡単にユニットテストを実行するための環境が手に入るのですが、残念ながらテーマのためのそのようなコマンドはありません。ということで、テーマでも簡単に同様の環境を作れるようにシェルスクリプトを作りました。

wpコマンドは PHP で書かれており、各コマンドや前述したようなテスト環境を構築するために必要なファイルなどが1まとめにアーカイブされていて、それをコマンドとして利用する形になっています。従って、シェルスクリプトでそこからテスト環境を構築するためのファイルを取り出して任意のテーマディレクトリ内に展開すれば良いです。

bin/scaffold-tests.sh

まず、下記のシェルスクリプトを適当なところに保存してください。ここではwp-content/themes/任意のテーマ/bin/scaffold-tests.shとして保存することを想定しています。

#!/usr/bin/env bash

dir=`dirname $0`
phar extract -f $(which wp) "$dir/wp.phar">/dev/null 2>&1
wpdir="$dir/wp.phar$(which wp)"

cp -f "$wpdir/templates/install-wp-tests.sh" "$dir/install-wp-tests.sh"

cp -f "$wpdir/templates/phpunit.xml.dist" "$dir/../phpunit.xml"

if [ ! -e "$dir/../tests" ]; then
	mkdir "$dir/../tests"
fi

cp -f "$wpdir/templates/bootstrap.mustache" "$dir/../tests/bootstrap.mustache"
sed -e "s/require dirname( dirname( __FILE__ ) ) \. '\/{{plugin_slug}}\.php';/register_theme_directory( dirname( __FILE__ ) . '\/\.\.\/\.\.\/' ); switch_theme('ここにテーマ名');/g" "$dir/../../tests/bootstrap.mustache">"$dir/../../tests/bootstrap.php"
rm -f "$dir/../tests/bootstrap.mustache"

cp -f "$wpdir/templates/test-sample.mustache" "$dir/../tests/test-sample.php"

rm -rf "$dir/wp.phar"
echo "done!"

「ここにテーマ名」と書いているところはご自身のテーマ名に変更してください。

bin/wpphpunit.sh

もう一つ、ユニットテストの環境を自動的に構築して PHPUnit を実行するためのシェルスクリプトも作ります。ここではwp-content/themes/任意のテーマ/bin/wpphpunit.shとして保存することを想定しています(Mac で動作させていますが、Windows では動くかわかりません…。ダメなときは適当に調整してください)。

#!/usr/bin/env bash

set -ex;

echo 'DROP DATABASE IF EXISTS wordpress_test;' | mysql -u root

if [ -e /tmp/wordpress ]; then
  rm -fr /tmp/wordpress
fi

if [ -e /tmp/wordpress-tests-lib ]; then
  rm -fr /tmp/wordpress-tests-lib
fi

bash bin/install-wp-tests.sh wordpress_test root '' localhost latest;
phpunit

ユニットテストに必要なファイルを展開する

保存できたら、任意のテーマディレクトリの一番上で上記のシェルスクリプトを実行します。

$ cd /PATH/TO/wp-content/themes/任意のテーマ
$ bash bin/scaffold-tests.sh

実行すると下記のような感じでファイルが展開されるはずです。

├ bin/
│ ├ scaffold-tests.sh
│ ├ wpphpunit.sh
│ └ install-wp-tests.sh
├ tests/
│ ├ bootstrap.php
│ └ test-sample.php
└ phpunit.xml

ユニットテストの環境を構築してテストを実行

ファイルが展開できたら、テストを実行してみましょう。

$ bash bin/wpphpunit.sh

ずだだーと環境を構築しているログがでたあとに、PHPUnit が実行されて OK とかメッセージがでると思います。この段階ではさきほどファイルを展開したときに自動生成されたtests/test-sample.phpに記述されたサンプルのテストコードが実行されています。これを真似してtests/test-functions.phpとかつくってテストコードを書いていけば良いかと思います。ちなみに、一回テスト環境を構築してしまえば次からは普通にphpunitと打つだけでOKです。

$ phpunit

テスト環境は一時ディレクトリに作成されるため、何らかのタイミングで消滅します。phpunitと実行してテスト環境がないよー的なメッセージがでたときは、再度wpphpunit.shを実行すればOKです。

GitHub と Travis CI を連携させて、push したときに自動的にユニットテストを実行させる

Travis CI でプッシュのたびに自動実行させると便利です。ちょっと力尽きたので、下記を参考に頑張ってください…。

  • ブックマーク
  • Feedly

この記事を書いた人

キタジマタカシ

長崎在住、フリーランスのWordPress テーマ / プラグインデベロッパー。 多数のプロダクトをオープンソースで開発・公開しています。現在は WordPress 有料テーマ Snow Monkey を開発・販売しています。