Web制作・開発会社 プレスマンのスタッフブログ

PRESSMAN*Tech

WordPressでPHPUnitを使う

数年ぶりにWordPressを触ることになり、色々覚え書きがてら書いていきます。
基本的にWordPressの人ではないです。

テストをするだけでなく、プラグイン内の関数を直接起動して開発したくてPHPUnitを導入することにしました。
フック使えよとか、まあそうなんですがフックの数多すぎでよくわからんのです。

動作させている環境ですが、OSX上のVagrantにCentOSを乗っけて、その中でDockerを使ってUbuntu環境でWPを動かしています。
ですので、ファイルのパーミッションとか実行するユーザーなどは少し変です。

WP-CLIのインストール

WPの便利ツールです。CLI大好き派としては大変ありがたいです。インストールは全くもって簡単です。
http://wp-cli.org に書いてあるようにダウンロードしてパスの通っている場所へ移動させるだけです。
これを使ってphpunitの実行環境をつくります。

これだけ。さて、実行してみます。

エラーが出てしまいました。どうもrootで実行してはいけないらしいです。ただ、開発環境だし、docker上でrootでなんでもやっているのとファイルはホスト(OSX)とnfsで共有しているので、共有しているUIDを使ってユーザー作ってsudoすることにしました。

PHPUnitのインストール

phpのバージョンが5.5なので最新版は使えません。なので一つ前のバージョンを入れます。

WP-CLIを使ってPHPUnitを使う準備

テストに必要なファイルの配置

PHPUnitをWordpressで動かすのにどうやら、もう一つWordpressを別の場所にインストールするようです。
テストはテストのたびにDBをリセットしてプラグインを読み込んでその別Wordpress上で行います。
その別Wordpressをインストールしてテスト環境を構築する処理をWP-CLIがやってくれます。
Plugin名をhogePluginとします。

wp scaffoldは自分が実行したところwordpressのインストールプラグインを--pathとして渡さないとエラーが出てしまいました。
これでプラグインディレクトリに

が出来ているはずです。

テスト環境の構築

bin/install-wp-tests.shを使用して新しいWordpressの実行環境とデータベースとテストに必要なファイルをインストールします。

ということですが、データベースを作成するのでDBを作れるユーザーでないとダメです。開発環境だしDocker上だしで自分はroot使ってしまいます。

そうすると指定したバージョンのWordPressをダウンロードして/tmp/wordpressに展開します。
/tmp/wordpress-tests-libにも色々入ります。その時にsvnをつかっているのでsubversionもインストールしておきましょう。
最近はgitばかりでsubversion使っていないので入っていないことが多そうです。

ログが流れて最後に

とでたら完了です。途中で失敗した場合 /tmp/wordpress,/tmp/wordpress-tests-libを削除してから再実行して下さい。

テストの実行

WP-cliが作ってくれたサンプルのテストコードがあるのでphpunitと実行するだけで動くはずです。

っと、エラーが出てしまいました。uploadsディレクトリがないようです。

サンプルテストが通りました!
これでPHPUnitが使えるようになりました。PHPUnitの使い方はここでは書きません。

おまけ

テスト環境に日本語WordPressを使う

/tmp/wordpressを同じバージョンの日本語版WordPressに手動で入れ替えてあげればいいだけです。
uploadsディレクトリを作るのをお忘れ無く。

テストでのタイムゾーンを変更する

デフォルトだとテスト環境のタイムゾーンはUTCです。これをAsia/Tokyoにする場合はテスト用DBのwp_options内にあるtimezone_stringをAsia/Tokyoに変えればいいような気がします。
ただ、これをやっても変わりません。実はテストをするたびにDBがリセットされてしまっています。なので、/tmp/wordpress/wp-admin/includes/schema.phpを少々いじります。

これでタイムゾーンが東京になります。