WP-CLIで採用されているビヘイビア駆動開発を紹介!

この記事は「ローカルのWP-CLIコマンドをリモートで実行するコマンドの紹介」に引き続きWP-CLIのアドベントカレンダーの15日目の記事です。

そしてWordBench串本のアドベントカレンダーもまだまだ続いています!

WP-CLIの開発ではビヘイビア駆動開発というのが使われてるんだぜ

WP-CLIには30種類以上のサブコマンド(wp dbとか)が用意されており、それらにはさらにサブサブコマンド(wp db importとか)があります。

さらにさらにファイル名とかユーザー名とかプラグインとか、ありとあらゆるオプションを渡すこともできます。

そうなるとコマンドの組み合わせが膨大になって、そこにWordPressのバージョンとかもからんでくると、人の手でテストをしていくことが不可能になります。

そこでWP-CLIの開発チームでは、behatというツールを使ってビヘイビア駆動開発という手法を用いていて、Travis CIで自動的にテストが発火するようになっています。

上のスクリーンショットは、実際にWP-CLIで行われているテストの結果なんですが、なんと1,964通り!

これだけの種類のテストが、git pushやプルリクエストなどのタイミングで自動的に発火してるわけです。

そんなわけでWP-CLIの開発へ参加するにはこのテストのスキルが必要になってくるんですよね。

具体的にどんなテストよ?

これはテスト用のコードを見るのが早いです。

https://github.com/wp-cli/wp-cli/tree/master/features

上のリンクを見ると.featureというファイルがたくさんありますよね。

これらがすべてテスト用のコードです。

この.featureというファイルは、サブコマンドごとに用意されていて、wp rewriteというコマンドのテストなら、rewrite.featureというファイル名でテストが記述されています。

では、実際のテストコードを見てみましょう。

When I run `wp rewrite structure /%year%/%monthnum%/%day%/%postname%/`
And I run `wp rewrite flush --hard`
Then the .htaccess file should exist

どうですか?

なんかこれ自体がドキュメントみたいになってますよね?

このテストでは、wp rewrite structure /%year%/%monthnum%/%day%/%postname%/wp rewrite flush --hardを実行したら、Then the .htaccess file should existと書いてあるわけです。

というわけではじめてみた時はとても感動しました。

WP-CLIにはこのテストを自前のコマンドに実装するためのコマンドが用意されています

このテスト、導入すればとても便利なんですが、その導入を手動でやるにはとても手間がかかります。

さらに、Travis CIで自動テストを行うには、Travis CIに環境をインストールするためのシェルスクリプトの開発も必要です。

そこで、WP-CLIでは、このテスト用のコードを自作のコマンドに自動的に設置するためのコマンドが用意されています。

$ wp scaffold package-tests

先日のこのブログで紹介した僕の自作のコマンドにもこれを導入してあります。

wp-plugins-api

MySQLがローカルのMacにインストールしてあって、rootにパスワードが設定してないことが前提ですが、上記のコマンドを実行したら以下のコマンドでテスト用のWordPress環境を構築してください。

$ WP_CLI_BIN_DIR=/tmp/wp-cli-phar WP_CLI_CONFIG_PATH=/tmp/wp-cli-phar/config.yml bash bin/install-package-tests.sh

そして、以下のコマンドでテストを実行です。

$ WP_CLI_BIN_DIR=/tmp/wp-cli-phar WP_CLI_CONFIG_PATH=/tmp/wp-cli-phar/config.yml vendor/bin/behat

なれると簡単ですよ。

僕は忘れてしまうので、README.mdに書くようにしています。

https://github.com/miya0001/wp-plugins-api/blob/master/README.md#functional-tests