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