PHP
WordPress
テスト駆動開発

要約

WordPressが主案件でない学生エンジニアによるWordPressのPlugin開発をTDDでやるためのプラクティス。
DockerとComposerで即開発環境を整えるのが理想だが、WordPressはComposerの標準リポジトリPackagistにないためチョット辛い。しかしGitHubにsvnのミラーリング(WordPress/wordpress-develop)があるため、Composer中でリポジトリを指定して書けばプラグイン開発で依存関係にある全てのファイル(wordpress,wordpress-test-lib,phpunit)をcomposer installで準備できるのでワンライナーでTDD環境できて嬉しい。

そもそもComposerはsvn等の外部リポジトリを参照できる

要約ではWordPressの参照先としてGitミラーリングの話をしたが、composerは単にデフォルトリポジトリとしてPackagistを参照しているだけで、svnも参照できる。PMSなので当然といえば当然…。以下はGitHubでの例。

    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/WordPress/wordpress-develop"
        }
    ],
    "require-dev": {
        "WordPress/wordpress-develop": "dev-master#4.9.1",
    },

記法はについては公式参照

WordPressのSDKは遠い

Kent Beck (著),‎ 和田 卓人 (翻訳) のテスト駆動開発をなぞる過程で、なにかTDDの習作をしたいと考えていたところ、他人の作ったWordPress Plugin(テストコードなし)を、コードと仕様をみながらTDDでクローンすることにした。したのだが、実際にTDDの環境を整理していく内にTDD主体で書くよりもWordPressのTDD環境構築というテーマのほうが記事になりそうだったので、ソフトウェアテストど真ん中という記事ではないが、このテーマで書くことにした。

多くのWordPressコミッターでないエンジニアにとって、WordPressは単なるCMSフレームワークの一つであり、vendorの一つにすぎない。プラグインなりテーマなり固定ページなりを書くエンジニアにとって、依存関係が明示された状態で参照できればそれでよいはずで、Composerでinstallで終わってくれると非常に助かる。(私が作るものと、参照するものを明確に分離できる)
しかし、WordPressの少なくともプラグインの開発はWP-CLIというツールに大きく依存している点が話を面倒にしている。

以下は公式から雑に翻訳・引用したWordPressのコアファイルとテストツールを入手するまでの手順

  1. Composer等でwp-cliをインストール
  2. wp scaffold plugin __PLUGINNAME__
  3. bin/install-wp-tests.sh hoge hoge 'hoge' localhost latest
  4. /tmp/wordpress,/tmp/wordpress-test-lib

Wordpressでの開発において、関連ファイルをどのように管理するかというのはユーザーの間でも長年議論されているテーマのひとつらしく、ググるといくつかの数のプラクティスがヒットする。

2.のscaffoldの生成物には.travis.ymlも含まれており便利だし、phpunitのconfigも自動でやってくれて、テストライブラリのパスが/tmp下にあるお陰で冪等性っぽいものが確保されている予感がする。実際travis等でメトリクスでテストしたい時に冪等性が得られて便利なbin/install-wp-tests.shもあり、なんだかんだwp-cliは便利なのだが、コードを書く段階にたどり着く環境構築においてはすこし歯痒い印象があった。

そもそも開発においてはpullしたら即テストを走らせられる状況にしたい…したくない?

dockerで環境整備

実際の挙動を確認する上では公式のdocker-composeが楽でいい。開発物を/var/www/html/wp-content/plugins/__PLUGINAME__/にバインドして活用している。特にWordPressの知見のない自分にとっては、WordPressのライフサイクルやクエリの流れを知るために、独自の設定ファイルをバインド&tail -f /var/log/query.logなどしながら開発している。

おわりに

修論や他の開発によって時間が割けず、当初の目論見であるWordPress PluginのTDDクローンは完了していない。年度内に完了させて知見を投稿できればと思う。