WordPress plugin を PHPUnit でテストするためには、
WordPress, PHPUnit のインストールの他に Subversion 、
そして MySQL 等のデータベースが必要になります。
この環境構築には時間がかかります。
この記事では Docker を利用して環境構築の手順をスキップします。
なお、より効率的に開発を行うために、
この記事で紹介している方法よりも
Visual Studio Code を組み合わせた方法をおすすめします。
ローカルでの PHPUnit 実行方法
手順
1. docker-compose.yml を準備します
以下の内容で準備します:
---
version: '3.7'
services:
database:
container_name: database
environment:
MYSQL_ROOT_PASSWORD: examplepass
image: mysql:5.7
phpunit:
command:
- bash
container_name: phpunit
depends_on:
- database
environment:
DATABASE_PASSWORD: examplepass
image: futureys/phpunit-wordpress-plugin
stdin_open: true
tty: true
volumes:
- ${PATH_TO_PLUGIN_DIRECTORY}:/plugin
2. テスト対象の WordPress plugin ディレクトリーへのパスを設定します
手順 1. で作成した docker-compose.yml の
“${PATH_TO_PLUGIN_DIRECTORY}” を直接書き換えます。
もしくは、
docker-compose.yml と同じディレクトリーに .env ファイルを
以下の内容で作成します:
PATH_TO_PLUGIN_DIRECTORY=path/to/plugin-directory
どちらの方法も、絶対パスでも相対パスでも記述できます。
3. コンテナを起動します
$ docker-compose run phpunit
するとコンテナが起動し、
これ以降に実行するコマンドはコンテナ内で実行している状態になります。
4. 適宜 PHPUnit または PHP_CodeSniffer を実行します
この状態で、PHPUnit や PHP_CodeSniffer が実行し放題になります。
PHPUnit を実行する場合は以下のコマンドを実行します:
$ phpunit
PHP_CodeSniffer を実行する場合は以下のコマンドを実行します:
$ phpcs
利用が完了したら、コンテナから退出し
コンテナとネットワークを片付けましょう。
$ exit
$ docker-compose down
トラブルシューティング
Fatal error: require(): Failed opening required ‘/plugin/directoryname.php’ (include_path=’.:/usr/local/lib/php’) in /plugin/tests/bootstrap.php on line 26
対応
tests/bootstrap.php の 26 行目は以下のようになっています。
例:
require dirname( dirname( __FILE__ ) ) . '/plugin-directory-name.php';
上記の例の “/plugin-directory-name.php” の部分は、
初期状態では WordPress plugin のディレクトリー名と同じになっていますが、
これをテスト対象の WordPress plugin のメインとなる PHP ファイルに
変更します。
解説
WordPress plugin のメインとなる PHP ファイルは
ある程度自由に名前を付けることができますが、
テストのためのファイルを生成する処理では
ディレクトリー名と同名の前提でファイルが生成されます。
参考:
WordPress plugin のメインとなる PHP ファイルを選択する処理
WordPress/plugin.php at master · WordPress/WordPress
テストのためのファイルを生成する処理
scaffold-command/plugin-bootstrap.mustache at master · wp-cli/scaffold-command
scaffold-command/Scaffold_Command.php at master · wp-cli/scaffold-command
ERROR: Referenced sniff “WordPress.VIP” does not exist
対応
.phpcs.xml.dist を以下のように書き換えます:
- <exclude name="WordPress.VIP"/>
+ <exclude name="WordPress-VIP-Go"/>
解説
“WordPress.VIP” というルールセットは現在存在せず、
代わりに “WordPress-VIP-Go” というルールセットを用いるべきであるようです。
GitHub 上の WordPress コーディング標準の README.md に、次のような記述があります。
Note: The WPCS package used to include a WordPress-VIP ruleset and associated sniffs, prior to WPCS 2.0.0. The WordPress-VIP ruleset was originally intended to aid with the WordPress.com VIP coding requirements, but has been superseded. It is recommended to use the official VIP coding standards ruleset instead for checking code against the VIP platform requirements.
GitHub 上の WordPress コーディング標準の README.md より
これは、大体以下のような意味です。
注:
WPCS パッケージには、
以前は WordPress-VIP ルールセットが含まれていて、
WPCS 2.0.0 より前の (コーディング規約違反の) 探知機能に
関連付けられていました。
WordPress-VIP ルールセットは、もともと
WordPress.com VIP コーディング要件を支援することを
目的としていましたが、置き換えられました。
VIP プラットフォームの要件に照らしてコードをチェックする代わりに、
公式の VIP コーディング標準ルールセットを使用することをお勧めします。