カテゴリー
コーディング・プログラミング系

GitHubから自動デプロイできるようになったWordPressプラグインにPHPUnitテストをかませてみた


前回アップした、WordBench 京都でWordPressプラグインをGitHub経由でSVNにデプロイできるようにしてきた #wbkyotoをFBでシェアしたところ、宮内さんから直々にテスト導入の仕方についてコメント頂いたので、手順に沿って足してみました!という備忘録です。

前提

VCCWを導入します。(宮内さんにソース教えてもらったらVCCWでは確実に動くよって某Oさんに助言もらいました)
VCCWのインストール方法については公式サイトのGetting Startedを参考にしてください。

PHPUnitを動かすためにwp scaffoldをする

導入したVCCWをvagrant upで起動したら、vagrant sshでSSHにログインします。
SSHにログインしたら、以下のコマンドを叩きます。

wp scaffold plugin-tests wp-view-login-only

wp-view-login-onlyの部分は自分のプラグインのフォルダにしてください。
すると、WP view login onlyの場合は既に.travis.ymlファイルが存在していたため、このようなアラートが出ました。

Warning: File already exists.
/var/www/html/wp-content/plugins/wp-view-login-only/.travis.yml

ファイルを再生成するか、スキップするか聞かれます。
とりあえず、既存の.travis.ymlファイルを別のところに移動して、再生成してみました。

※前にいれていたデプロイ用の記述は当然、再生成されてしまったのでなくなります。なので、新しい.travis.ymlファイルに必要な記述を古いファイルから戻してくるのを忘れないようにします。

after_success: curl -L https://raw.githubusercontent.com/miya0001/travis2wpplugin/master/deploy.sh | bash

env:
  matrix:
    - WP_VERSION=latest WP_MULTISITE=0
    - WP_VERSION=nightly WP_MULTISITE=0

  global:
    - SVN_REPO: https://plugins.svn.wordpress.org/wp-view-login-only/
    - GH_REF: https://github.com/chiilog/wp-view-login-only.git

自動デプロイをしている場合は、.travis.ymlに追加された、

branches:
only:
- master

は、必ず削除してください!自動デプロイのスクリプトがgit tagで反応するので、masterブランチだけだと自動デプロイが走りません!

install-wp-tests を走らせる

install-wp-testsというコマンドを打つと、VCCWの中にテストを実行するために必要なWordPressをインストールしてくれます。

プラグインのディレクトリの直下でないとエラーが出るので、ちゃんとcdでプラグインのディレクトリに移りましょう!

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.
Not running ms-files tests. To execute these, use --group ms-files.
Not running external-http tests. To execute these, use --group external-http.
PHPUnit 5.6.0 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 1.02 seconds, Memory: 26.00MB

OK (1 test, 1 assertion)

これでユニットテストの準備はOKです!

テストを書く

今のままだとなんのテストもしてない状態なので、プラグインディレクトリ内にあるtests/test-sample.php内にテストを書いていきます。(test-◯◯.phpならテストがちゃんと走るので、sampleをリネームしましょう!)

テストの書き方

tests/test-sample.phpにひとつだけサンプルの関数が入っています。

<?php
/**
 * Class SampleTest
 *
 * @package Wp_View_Login_Only
 */

/**
 * Sample test case.
 */
class SampleTest extends WP_UnitTestCase {
 /**
  * A single example test.
  */
 function test_sample() {
  // Replace this with some actual testing code.
  $this->assertTrue( true );
 }
}
?>

test_で始まる関数はテストとして認識されるので、がしがし作成してみましょう。
ユニットテストでよく使うアサーションメソッドについてはこちらを参考にしてください。

私は今回vlo_add_login_message()に対してテストを走らせて、テストしやすくするために元々のvlo_add_login_message()関数を3分割しました。

  • vlo_get_login_message():DBに入っているログイン画面に表示するメッセージを取得する関数
  • vlo_create_login_message():ログイン画面に表示するメッセージを生成する関数
  • vlo_add_login_message():元々上の2つの機能も兼ねていましたが、今回の改修でvlo_get_login_message()からメッセージを取得してvlo_create_login_message()で生成したものをリターンする関数に生まれ変わりました。

テスト的に書いたユニットテストはこちら
あんまりテストらしいテストではないですが・・・もうちょっと勉強してちゃんとしたテスト書けるように・・・なり、ます!

どや!

追記(17.8.9 21:30)

宮内さんからプルリクいただきました・・・!
元々require_onceを書いてたのですが、なんと不要だそうです!!

もしプラグインが有効化されているなら、./wp-view-login-only.php が自動的に require されるはずなので、テストに require を書く必要はありませんし、むしろ書くべきでもありません。テストコードで require しないといけないシチュエーションになったら、それはむしろプラグインのどこかにバグが潜んでると考えましょう。

すごすぎますWP-CLI・・・!