WP-CLI+PHPUnitを使ったWordPressプラグインのユニットテスト(1)

VCCWにPHPUnitを組み込みました! > https://firegoby.jp/archives/5542

WordPressのコマンドラインツール WP-CLI には様々な機能がありますが、プラグイン開発者にとって特に便利な機能がいくつかあります。

phpunit

その代表的な例が以下のコマンドで、このコマンドを既存のプラグイン名を指定して実行するとPHPUnitテスト用のサンプルコードが自動的に生成されます。

wp scaffold plugin-tests <plugin-name>

また、以下のコマンドを実行すれば、PHPUnitテスト用のファイルが含まれたプラグインのひな形を自動的に生成してくれます。

wp scaffold plugin <plugin-name>

今回の記事では、このコマンドをつかって生成したプラグインのひな形を使ってテスト駆動開発に挑戦してみます。

テスト環境について

何度もユニットテストを繰り返すことを考えると、やはり簡単にリセットできることが望ましいと思います。

そこで今回は以下のVagrant環境内でテストすることを前提に作業を進めます。

VCCW (vagrant-chef-centos-wordpress)

MAMPなどのローカル環境でも可能ではありますが、MySQLサーバーやPHPUnit、WP-CLIなどのインストールを省略できますので、ぜひVagrantを使うことをおすすめします。

VCCWの起動方法は、README-ja.mdに記載されていますので、それにしたがってあらかじめvagrant upしておいてください。

プラグインのひな形を作成する

ではさっそくプラグインを作っていきます。

まず、以下のコマンドでVCCWにSSHでログインしてください。

$ vagrant ssh

次にVagrant上でWordPressがインストールされているディレクトリに移動し、WP-CLIでプラグインのひな形を生成するためのコマンドを入力します。

$ cd /varwww/
$ wp scaffold plugin my-plugin
Success: Created /var/www/wp-content/plugins/my-plugin
Success: Created test files.

上の例のようにSuccess: Created ...というメッセージが表示されたら成功です。

以下のようなファイルがwp-content/plugins以下に生成されていることを確認して下さい。

wp-content/plugins/my-plugin/
├── .travis.yml
├── bin
│   └── install-wp-tests.sh
├── my-plugin.php
├── phpunit.xml
└── tests
    ├── bootstrap.php
    └── test-sample.php

この例では、my-plugin.phpというファイルがプラグイン本体になりますが、とりあえず空白のままですすめます。

ちなみにこのプラグインは、このままでも有効化することができます。

$ wp plugin activate my-plugin
Success: Plugin 'my-plugin' activated.

PHPUnitテスト用のWordPress環境を準備する

WordPressにおいてのPHPUnitテストを行うには、空のWordPress環境を作ります。

ただし、実際にブラウザでアクセスする必要はなく、あくまでもコマンドラインでテストコードが動作するだけでいいので、専用のコマンドを実行するだけで完了します。

まず、以下のコマンドを実行してテストを実行したいプラグインのディレクトリに移動してください。

$ cd $(wp plugin path --dir my-plugin)

my-pluginの部分は皆さんの任意のプラグイン名に置き換えてください。

次に以下のコマンドを実行します。

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

このコマンドの各パラメータは以下のような意味があります。

  • wordpress_test– テスト用のMySQLデータベース名。
  • root– MySQLデータベースのユーザー名
  • ‘wordpress’ – MySQLデータベースのrootパスワード
  • localhost– MySQLデータベースのホスト名
  • latest– テストに使用するWordPressのバージョン

コマンドに成功すると以下のようにターミナルに表示され、WordPressのインストールとMySQLデータベースのセットアップが完了します。

ただし、ここでインストールされたWordPressはコマンドラインからユニットテストをするための環境なので、ブラウザでアクセスすることはできません。

+ install_wp
+ mkdir -p /tmp/wordpress
+ '[' latest == latest ']'

(中略)

+ '[' -z localhost ']'
+ EXTRA=' --host=localhost --protocol=tcp'
+ mysqladmin create wordpress_test --user=root --password=wordpress --host=localhost --protocol=tcp

ちなみにこのWordPress環境は/tmp/wordpressというパスにWordPress本体が、/tmp/wordpress-tests-libにテスト用の設定ファイルがインストールされています。

PHPUnitを実行する

ここまでの作業でPHPUnitによるユニットテストを行うための環境は整いました。

あとは、コーディングに入るんですが、これまでの作業の中で生成したファイルだけでもユニットテストの真似事はできます。

さっそくphpunitコマンドを実行してみましょう。

$ phpunit
Installing...
Running as single site... To run multisite, use -c tests/phpunit/multisite.xml
Not running ajax tests... To execute these, use --group ajax.
PHPUnit 4.0.14 by Sebastian Bergmann.

Configuration read from /var/www/wp-content/plugins/my-plugin/phpunit.xml

.

Time: 1.89 seconds, Memory: 11.25Mb

OK (1 test, 1 assertion)

このテストでは最後にOK (1 test, 1 assertion)と出力されています。

今度は、わざとエラーを出してみます。

tests/test-sample.phpというファイルがありますので、それを以下のように編集してください。

<?php

class SampleTest extends WP_UnitTestCase {

        function testSample() {
                // replace this with some actual testing code
                $this->assertTrue( false ); // true から false に変更
        }
}

上のサンプルソースでは、$this->assertTrue( true );となっていたところを$this->assertTrue( false );に変更しました。

変更内容を保存したら、再度phpunitコマンドを実行してみてください。

$ phpunit
Installing...
Running as single site... To run multisite, use -c tests/phpunit/multisite.xml
Not running ajax tests... To execute these, use --group ajax.
PHPUnit 4.0.14 by Sebastian Bergmann.

Configuration read from /var/www/wp-content/plugins/my-plugin/phpunit.xml

F

Time: 1.4 seconds, Memory: 11.25Mb

There was 1 failure:

1) SampleTest::testSample
Failed asserting that false is true.

/var/www/wp-content/plugins/my-plugin/tests/test-sample.php:7

FAILURES!
Tests: 1, Assertions: 1, Failures: 1.

今度はFAILURES! Tests: 1, Assertions: 1, Failures: 1.と出力されました。

以上でPHPUnitの準備は整いました。

以降は、WordPressコアで実際に使用されているテストコードを参考にしながら、ショートコードプラグインを開発していきます。

というわけで、今回はとりあえず燃え尽きましたので、続きはまた後日。