バグのないソフトはない。これは、あらゆるプログラミング言語、アプリケーションに言えることです。
そんなバグがサイトで発生すると(深刻度の違いはあれど)その結果はおぞましいものになり得ます。例えば─ちょっとしたものから経済的な損害をもたらすものまで─以下の通りです。
- 軽度:リンク切れにより、リンクをクリックできない状態
- 深刻:フォームの「送信」ボタンが機能せず、メッセージを作成したにも関わらず、お問い合わせができない
- 深刻:決済システムが適切に設定されていないため、ECショップでの商品購入を完了できない(消費者はお店を去ってしまう)
アプリケーションをあらゆる角度からテストするためには、通常、特定の1つのツールでは不十分です。実際、バグの発見に加えて、アプリケーションの他の機能を検証するために、次のようなテストも実行することが不可欠です。
- アクセシビリティとユーザビリティ
- 許容範囲内の性能
- アクセスや負荷の処理
この記事では、WordPressプラグインのPHPコードのテストに使える、オープンソースツールを10個扱います。中には、PHPコードのテスト用に特別に開発されたものもあれば、もう少し領域を広げてWordPressコードのテスト用に作られたもの、また、複数種類のテストを担うものもあります。
1. DevKinsta
DevKinstaは、WordPressサイト用のローカル開発スイートです。基本的な設定を行うだけで、WordPressサイトをローカル環境で構築し、メール受信箱、データベースマネージャ、トラブルシューティングに便利なログなど、様々な機能が利用できます。
DevKinstaは主に、開発者やデザイナー向けで、通常、WordPressテーマやプラグインの作成時に使用されます。とは言え、レスポンスのコンテンツ、ヘッダの検証用HTTPツールと組み合わせることで、統合テスト、機能テスト実行のためのローカルウェブサーバーとして使用することもできます。
DevKinstaの主な特徴は以下の通りです。
- WordPress環境を簡単に構築、不要になったら削除
- サポートされているすべてのバージョンのPHPとWordPressでテスト可能
- MyKinstaとシームレスに統合し、サイトとデータの外部バックアップを作成することが可能
2. PHPUnit
PHPUnit は、PHP に特化した、プログラマー指向のテストフレームワークです。PHP の単体テストで広く採用されているフレームワークです。ソースコード内の個々のユニット(細かなまとまり)を検証するのに使えます。
PHPUnit テストにより、開発サイクルのできるだけ早い段階で問題を特定し、コードがリグレッションしないように(コードの一部の変更により、別の場所で問題が発生していないかチェック)することができます。
PHPUnit の主な特徴は以下のとおりです。
- 新機能のテスト
- リファクタリング後のコードの確認
- 完全に自動化することで、好みの継続的統合プロセス内で実行可能
- デバッギング
- 機能呼び出しと制約を用いた、期待される使用法の自動文書化
- 最初にテストを作成し、次に機能を充実させていくテスト駆動開発(TDD)アプローチに利用可能
3. Brain Monkey
Brain Monkeyは、PHPおよびWordPress用テストユーティリティです。フレームワークに依存せず、PHPのメソッドを再定義し、あらゆるPHPアプリケーションの動作をテストすることができます。また、WordPressコードのテストに特化した機能もあります。
Brain Monkeyの主な特長は以下の通りです。
- 外部ライブラリと連動した状態で単体テストを実施
- WordPressの環境を読み込むことなく、WordPressの関数を呼び出す
- WordPressの関数(
add_filter
やdo_action
など)により、期待どおりの機能が呼び出されているか確認
4. Brain Faker
Brain Fakerでは、Faker(フェイクデータを生成できる人気のPHPライブラリ)とBrain Monkeyを使用して、WordPressのフェイクオブジェクトや関連する関数を簡単に生成できます。対象となるのは、例えば以下の通りです。
WP_Post
インスタンス、get_post
やget_post_field
などのモック関数WP_User
インスタンスget_userdata
,get_user_by
,user_can
, などのモック関数WP_Term
インスタンス、get_term
やget_term_by
などのモック関数WP_Comment
インスタンスWP_Site
インスタンスget_site
などのモック関数WP_Post_Type
インスタンスget_post_type_object
やpost_type_exists
- などのモック関数
WP_Taxonomy
インスタンスget_taxonomy
やtaxonomy_exists
などのモック関数WP_Error
インスタンス
Brain Fakerの主な特長は以下の通りです。
- 単体テストに偽の(とは言え現実的な)WordPressデータを挿入:偽の投稿更新日へのアクセス(例:
2022-04-17T13:06:58+00:00
)、ユーザー名の使用(例:John Smith
)、偽の投稿インスタンスの偽のユーザーインスタンスでのオーサリング等 - フェイクデータは、事前に用意したものでも、ランダムに生成したものでも可
- 拡張性:自分のWordPressプラグインからクラスや関数をモック化可能
5. Mockery
Mockeryは、シンプルかつ柔軟なPHPモックオブジェクトフレームワークで、 PHPUnitやPHPSpecなどの単体テストフレームワークとあわせての使用が想定されています。人間が読める DSL(ドメイン固有言語) を使ってオブジェクトの操作や相互作用を定義することができます。
Mockeryの主な特徴は以下の通りです。
- モックオブジェクトやスタブ(テスト中の特定の呼び出しに対する応答を定義してしまう)を柔軟に生成可能
- PHPUnitのテスト分離機能の強化
- モックの期待値を表現する柔軟なAPIで、自然言語の記述を可能な限り模倣(例:
$mock->shouldReceive('myMethod')->once()->andReturn('Hello world!');
) - インメモリモックオブジェクトを使用した単体テスト:低速システム(データベースファイルシステム、外部サービスなど)へのアクセスは不要
- 確定的な動作(結果を再現可能)と非確定的な動作(テスト毎に結果が異なる)の両方をモック可能
6. WordPress Native Export Tool
WordPress のネイティブエクスポート機能を使うことで、投稿、固定ページ、カスタム投稿タイプ、コメント、カスタムフィールド、カテゴリー、タグ、カスタムタクソノミー、ユーザー、メディアを含むサイトのWordPress データを XML ファイルとしてデバイスにダウンロードできます。このXMLファイルは、あらゆるWordPressサイトにインポート可能な拡張子となっています(WordPress eXtended RSSまたはWXRファイル)。
この機能は、特にテスト用に存在しているわけではありません。とは言え、有用なデータセットを格納するWordPressデータベースのスナップショットを作成し、これをテストに使用することができます。つまり、実際のデータ(本番WordPressサイト)をエクスポート、開発用またはステージング用のインスタンスにインポートし、新しい機能をテスト可能です。
WordPressエクスポート機能の主な特徴は次のとおりです。
- 実際のWordPressサイトを使ったテストデータの作成
- データベース全体をファイルとしてエクスポート(共有に便利)
- 統合テストと単体テストの両方に有効
7. Guzzle
Guzzleは、HTTP リクエストの送信、ウェブサービスとの統合を容易にしてくれるPHP HTTP クライアントです。
Guzzleは汎用ツールなので、テストはその使用例の一つに過ぎません。DevKinstaのようなローカル開発スイートを組み合わせることで、Guzzleを統合テストに利用することができます。Guzzleを使って開発用のウェブサーバーに対してHTTPリクエストを送信し、そのレスポンスをPHPUnitの単体テストに渡して、コンテンツとヘッダが期待通りに設定されているかどうかを確認できます。
Guzzleの主な特長は以下の通りです。
- PHP標準勧告「PSR-7」(対象:HTTPメッセージインターフェース)を満たし、ベンダーロックインを防止
- シンプルかつ高速
- 実際のWordPressサイトに対してテストを実行するため、信頼性が高い
- PHPUnitから実行できるため、簡単かつ高速
- テストを自動化し、継続的統合プロセスに組み込むことができる
8. WP-CLI
WP-CLIは、WordPressのコマンドラインインターフェースです。これを使えば、ウェブブラウザを使わずにプラグインの更新やマルチサイトのインストール設定など、様々なことができます。
WP-CLIは特にテストツールというわけではありませんが、その多くの活用例の一つとして、テストに使うこともできます。例えば、開発用ウェブサーバーを構築した後、WP-CLI コマンドでbashシェルスクリプトを実行して、WordPress サイトにテストデータをインポート、好みの役割と権限を持つユーザーを作成し、必要なサードパーティプラグインをインストール、といったタスクを実行することができます。
スクリプト(WP-CLIコマンドを含む)はGitリポジトリに保存できるため、以下の要領で自動化し、継続的統合プロセスに組み込むことができます。
- WordPressのエクスポート機能を使って実際のテストデータを生成し、Gitリポジトリに保存する
- DevKinstaを使用して、新しいWordPressインスタンスを持つウェブサーバーを構築
- WP-CLIを使ってテストデータをWordPressサイトに取り込む(DevKinstaはWP-CLIで操作可能)
- PHPUnitで単体テストを作成し、Guzzleを使ってウェブサーバーにHTTPリクエストを実行させ、レスポンスのコンテンツとヘッダを確認する
WP-CLIの主な特徴は以下の通りです。
- WordPressインスタンスに対する、コマンドラインインタフェースを用いた遠隔からのコマンド実行が可能
- 他のツールと併用することで拡張性アップ
- テストスタックの機能強化
- プロセスを完全自動化できる
9. XDebug
XDebugはPHPの拡張機能で、デバッグ、PHPエラーレポートの改善、トレース、プロファイリング、コードカバレッジ解析など、PHPの開発環境改善に使えるさまざまな機能を搭載しています。
XDebug はコードのテストには使えませんが、バグがどこにあるのかを見つける上では、便利な選択肢です。XDebug と PHPUnit を組み合わせると、特に効果的です。テストが失敗して問題の原因がわからない場合、XDebug を使って単体テストのコードにブレークポイントを追加することができます。単体テストを再度実行すると、PHPスクリプトはそれぞれのブレークポイントで一時停止します。そこで、状態(コールスタック、プロパティやオブジェクトの値など)を調べ、何が問題なのかを突き止めるといった流れになります。
XDebugの主な特徴は以下の通りです。
- VS Code、PHPStorm、SublimeなどのPHPエディタとの統合が可能
- すべての関数呼び出しにどれだけの時間を費やし、どれだけのメモリを消費したかをプロファイリングできる
var_dump
関数でコードのデバッグをするよりもはるかに有用- ブレークポイントでの一時停止時に、その場で変数値を変更できる
10. PHPStan
PHPStanはPHP用の静的解析ツールで、テスト実施前の段階でコードのバグを発見することを目的としています。
PHPStanの役割は、開発者が実行しなければならないテストの数を減らすこと。このツールは、テストスタックの最初に実行するもので、その場で、可能な限り多くのバグを先制的に捕捉します。静的解析で推測できないバグ(例えば、ロジックに欠陥があるもの)だけは、単体テストで検証する必要があります。
PHPStanでコードベース全体をスキャンし、ミスマッチを発見することができます。例えば、関数からfloat型が返された場合、それをinteger型の関数に代入することはできません。PHPStanは、開発段階、つまりアプリケーションコードを書いている最中に、このようなバグを警告してくれます。
PHPStanの最大の特長は以下の通りです。
- 既存の継続的統合プロセスと組み合わせた自動化
- 型の不一致など、多くの厄介なバグを発見できる
- コードベース全体をスキャンし、めったに実行されないコードも対象にバグを調査
- 複雑さを増す階層で構成されている(これにより段階的な統合が可能)
- Symfony、Laravel、Doctrine、Nette、WordPressなど、人気の高いPHPフレームワークやCMSに対応した拡張機能あり
まとめ
アプリケーションにバグが混入したまま放置すると、それがいずれは、企業の評判や収益に損害をもたらす可能性があります。だからこそ、利用者に影響を及ぼしてしまう前に、バグを徹底的に除去するよう努めましょう。
複雑なアプリケーションで、バグが100%ないと確信することはほぼ不可能です。そのため、開発サイクルの早い段階で、できるだけ多くのバグを発見して取り除くことのできるプロセスを構築する必要があります。
優れたテストツールを使えば、アプリケーションが予期せぬ動作をしてしまう可能性を大幅に減らせます。オープンソースコミュニティのおかげで、アプリケーションの各側面をテストできるツールには事欠きません。包括的なテストスタック作成にご活用ください。
今回の記事では、WordPressプラグインのPHPコードをテストするのに便利な10のツールをご紹介しました。
あなたは、最近のプロジェクトで、どのようなツールを使いましたか?以下のコメント欄でお聞かせください。
コメントを残す