PHP: PHPUnit

PHPUnit は、PHP コードをテストするためにコアチームが選んだ公式のテストフレームワークです。

セットアップ

Top ↑

ステップ1: テストリポジトリをチェックアウトする

WordPress のテストは、SVN 経由で利用可能なコア開発リポジトリにあります:

svn co https://develop.svn.wordpress.org/trunk/ wordpress-develop
cd wordpress-develop

または Git で:

git clone git://develop.git.wordpress.org/ wordpress-develop
cd wordpress-develop

Top ↑

ステップ2: config ファイルを設定する

wp-tests-config-sample.phpwp-tests-config.php にコピーし、データベースの認証情報を入力します。別のデータベースを使用してください。

Top ↑

テストを実行するためのワークフローオプション

PHPUnit テストを実行するには、いくつかの方法があります。どのワークフローを選択するかはあなた次第です。

ワークフローによってはより多くの設定が必要なものがあります。迷った場合は、ほとんどのセットアップが自動的に行われる Docker ワークフローから始めることをおすすめします。

  1. Docker コンテナ
  2. Composer
  3. PHPUnit PHAR ファイルを Composer で実行する
  4. Composer を使わずに PHPUnit PHAR ファイルを実行する

Top ↑

Docker 以外のワークフローに必要な前提条件

Docker 以外のワークフローでは、PHP と MySQL/MariaDB が利用可能であることを確認する必要があります。

PHP とデータベースをローカルにセットアップする方法については、ローカルサーバーのインストールについてのハンドブックページを参照してください。

完全なテストスイートを実行するには、PHPUnit と WordPress のテストスイートの両方で特定の PHP 拡張モジュールを有効にする必要があることに注意してください。

有効にしておくべき代表的な拡張機能は次の通りです: gdmysql[i]zipexifintlmbstringxmlxsl

オプションとして、PHP の外部拡張である Xdebug、MemCache および Imagick もインストールして有効にしておく必要があります。

Top ↑

ワークフロー1: Docker コンテナ環境のセットアップ

ステップ1: Docker をインストールし、起動する

ステップ2: NPM をインストールする

ステップ3: WordPress をインストールしたディレクトリのルートディレクトリにいることを確認する

ステップ4: コマンドラインから次のコマンドを実行する:

npm install
npm run build:dev
npm run env:start
npm run env:install

Top ↑

テストの実行

docker コンテナをセットアップしてプロビジョニングされたら、コマンドラインからテストを実行できます: npm run test:php

追加のコマンドライン引数を PHPUnit に渡す場合は、NPM コマンドと追加の PHPUnit 引数の間に二重ダッシュ区切り文字を追加して、NPM がそれらを PHPUnit に渡すようにする必要があります。

Top ↑

ワークフロー2: Composer 環境のセットアップ

ステップ1: Composer をインストールする

ステップ2: WordPress をインストールしたディレクトリのルートディレクトリにいることを確認する

ステップ3: コマンドラインから次のコマンドを実行する: composer update -W

Top ↑

テストの実行

Composer の依存関係がインストールされたら、コマンドラインから次のコマンドを使用してテストを実行できます: vendor/bin/phpunit

Top ↑

ワークフロー3: PHPUnit PHAR ファイルを Composer で実行するための設定

ステップ1: PHPUnit Phar をインストールする

PHP のバージョンに適した PHAR をインストールします。インストール手順は、PHPUnit のマニュアルまたは PHPUnit の Web サイト を参照してください。

ステップ2: Composer をインストールする

ステップ3: WordPress をインストールしたディレクトリのルートディレクトリにいることを確認する

ステップ4: Composer の依存関係をインストールする

コマンドラインから次のコマンドを実行する: composer update -W

Top ↑

テストの実行

PHPUnit PHAR と Composer の依存関係がインストールされたら、コマンドラインから次のコマンドを使用してテストを実行できます: [path/to/]phpunit

Top ↑

ワークフロー4: Composer を使わずに PHPUnit PHAR ファイルを実行するように設定する

この方法は、PHPUnit と PHPUnit ポリフィルをグローバルにインストールし、複数のディレクトリでテストを実行する場合に最適です。

ステップ1: PHPUnit PHAR をインストールする

PHP のバージョンに適した PHAR をインストールします。インストール手順は、PHPUnit のマニュアルまたは PHPUnit の Web サイト を参照してください。

ステップ2: PHPUnit ポリフィルをインストールする

通常は、GitHub リポジトリのクローンを作成します:

git clone git@github.com:Yoast/PHPUnit-Polyfills.git [target/path]

ステップ3: ポリフィルへのパスを定義する

ポリフィルをインストールしたら、定数 WP_TESTS_PHPUNIT_POLYFILLS_PATH でパスを定義して、Polyfills がどこにあるかを WordPress のテスト用ブートストラップに伝えます。

この定数は、phpunit.xml[.dist] ファイルで次のように宣言します:

<php>
     <const name="WP_TESTS_PHPUNIT_POLYFILLS_PATH" value="path/to/yoast/phpunit-polyfills"/>
</php>

または、wp-tests-config.php ファイルで PHP 定数として宣言できます。

Top ↑

テストの実行

PHPUnit PHAR とポリフィルをインストールしたら、コマンドラインから次のコマンドを使用してテストを実行できます: [path/to/]phpunit

このワークフローを使用する場合は、PHPUnit ポリフィルのローカルクローンを常に最新の状態にしておくようにしましょう。

Top ↑

テストスイートの実行

好みのワークフローを選び、上記の手順に従ってマシンをセットアップしたら、上記の好みのワークフローに記載されているコマンドでテストを実行できます。

以下のすべての例では phpunit を使用します。これらの例をローカルで実行する場合は、このコマンドをワークフロー固有のコマンドに置き換えてください。

おおよそ以下のような出力が表示されるはずです:

...........................................................    59 / 12524 (  0%)
...........................................................   118 / 12524 (  0%)
...........................................................   177 / 12524 (  1%)
...........................................................   236 / 12524 (  1%)
...........................................................   295 / 12524 (  2%)
.......SS..................................................   354 / 12524 (  2%)
...
........................................................... 12449 / 12524 ( 99%)
........................................................... 12508 / 12524 ( 99%)
................                                            12524 / 12524 (100%)

Time: 01:46.744, Memory: 235.10 MB

OK, but incomplete or skipped tests!
Tests: 12524, Assertions: 57712, Skipped: 56.

各記号の意味は次の通りです:

  • . – それぞれのドットは合格した一つの「テスト」を意味します。
  • S はテストがスキップされたことを意味します。これは通常、テストがマルチサイトや特定の PHP 拡張モジュールを必要とするなど、特定の設定でのみ有効であることを意味します。
  • F はテストが失敗したことを意味します。何がどこで失敗したのか、より詳細な出力が表示されます。
  • E は、PHP のエラー、警告、通知によってテストが失敗したことを意味します。
  • R はテストが「危険」と判定されたことを意味します。何が危険と判定されるかは、phpunit.xml.dist ファイルの設定に大きく依存します。これは、特に遅いテストやアサーションを実行しないテストなどです。
  • I は、テストが不完全である、たとえばまだ実装されていないことを意味します。
Windows で、コマンドラインの画面出力に奇妙なコードが表示されていますか ? --colors=never で実行してみてください。

Top ↑

特定のテストの実行

Top ↑

個別テスト

個別のクラス を実行するには、--filter を使用してクラス名を指定します:

phpunit --filter Tests_Formatting_wpParseStr

PHPUnit の --filter オプションは非常に柔軟で、さまざまなオプションをサポートしています。PHPUnit のマニュアルを参照ください。

Top ↑

グループ

テストのグループ を実行するには、コードのコメントで定義されている @group を使用します:

phpunit --group dependencies
phpunit --group themes

グループを組み合わせることもできます (プラットフォームによっては、グループを二重引用符で囲む必要がある場合があります)。

phpunit --group shortcode,17657,6562,14050
...
OK (229 tests, 417 assertions)
多くのテストには @ticket というアノテーションがついており、WordPress の Trac チケットの結果であることを示しています。

@ticket アノテーションは @group アノテーションのエイリアスであるため、Trac チケット番号を「group」として渡すことで、個々の Trac チケットにリンクされたテストを実行できます。

すべてのグループを表示するには:

phpunit --list-groups

スキップされたテストや不完全なテストに関する情報を見るには、--verbose を使用します:

phpunit --group wpdb --verbose
There was 1 skipped test:
1) Tests_DB::test_charset_switched_to_utf8
This test requires utf8mb4 to not be supported.

tests/phpunit/tests/db.php:1332

デフォルトでは、AJAX テスト (コアが wp-admin/admin-ajax.php を使用するために作成されたテスト) は実行されません。これらを実行するには:

phpunit --group ajax

マルチサイトでテストを実行するには、multisite.xml 設定ファイルに切り替える必要があります:

phpunit -c tests/phpunit/multisite.xml

Top ↑

Grunt を使用する

さらに、npm run grunt phpunit を実行することで、ajax テストや multisite テストを含む PHPUnit テストを実行できます。

Top ↑

継続的に実行する

パッチの作業中にターミナルに切り替えて手動でテストグループを繰り返し実行するのではなく、継続的に実行し続けることができます。ファイルを保存するたびに、テストグループは自動的に再実行されます。これにより、ある変更によってテストが壊れたり合格したりしたことをすぐに知ることができます。

PHPUnit テストおよびその他のすべての監視タスクを実行するには、次のようにします:

npm run grunt watch -- --phpunit --group={testgroup}

PHPUnit 監視タスクのみを実行するには、次のようにします:

npm run grunt watch:phpunit -- --group={testgroup}

カンマ区切りで複数のグループを実行します:

npm run grunt watch:phpunit -- --group=community-events,privacy

Top ↑

最適化

環境変数 WP_TESTS_SKIP_INSTALL1 に定義することで、スイートがインストール手順をスキップするようになり、スイートの速度を向上させることができます。これは完全なテストの実行には使用すべきではありませんが、小さなテストグループの実行時間を節約することに役立ちます。

WP_TESTS_SKIP_INSTALL=1 phpunit --group=privacy

Top ↑

テストを作成する

WordPress の PHPUnit テストを作成し始めるためのガイドを作成しました。

Top ↑

テストで WordPress に貢献する

貢献するためには、主に3つの方法があります:

報告されたバグのテストを作成する。 貢献するすばらしい方法は、既存のバグレポートを実証するテストを作成することです。コア開発者は、テストカバレッジのないコアの多くの繊細な部分のパッチを検討することに消極的です。適切に作成されたテストは、パッチが副作用なしに問題を修正することを確認するのに役立ち、将来的にリグレッションが発生することを防ぐことができます。チケットを進めるためにテストが特に必要であったり望ましい場合は、needs-unit-tests ワークフローキーワードを受け取ります。既存のチケットのテストは WordPress コアの Trac で直接提出できます。テストケースを含むバグレポートを提出するとよりよいでしょう。

コードカバレッジを向上させるために新しいテストを作成する。 WordPress の多くの領域で、十分なテストカバレッジを持っていません。関数、クラス、コンポーネントを選んで、そのテストを作成してください。これらのテストは WordPress Trac で提出できます。

既存のテストケースを修正または改善する。 既存のテストには改善の余地がたくさんあります。古いものもあれば、速度が遅い、または壊れやすいものもあります。マルチサイトや特定の条件下でうまくテストできてないものもあります。一部の個別のテストより多くのことをテストしようとしており、データプロバイダ、依存関係、より限定的なアサーションを使用することで改善できる可能性があります

Top ↑

JavaScript ユニットテスト

JavaScript コードのユニットテストは、PHP のユニットテストに比べて WordPress コアではかなり制限されています。JS ユニットテストの詳細については、Make/Core の投稿ハンドブックの QUnit セクションを参照してください。

Top ↑

参考資料

原文 / 日本語訳

最終更新日: