PHPUnit
PHPUnitとは
Sebastian BergmannによるPHPUnit はPHP用の高度な単体テストフレームワークです。このフレームワークはComposerの依存ファイルとしてインストールされ、Moodleのインストールには含まれません。PHPUnitテストを実行するにはあなたの開発用コンピュータまたはテストサーバにPHPUnitを手動でインストールする必要があります。
以下の素晴らしいガイドをお読みください:
composer経由のPHPUnitインストール
- Composerをインストールする
すべてのプラットフォームへのcomposerのインストールに関するインストラクションは次をご覧ください: https://getcomposer.org/download/
あなたのMoodleフォルダにcomposerr.pharファイルをインストールしてください。
- Composerインストーラを実行してください。
cd /your/moodle/dirroot php composer.phar install
(接続エラーが発生した場合、以下のコマンドをお試しください ... )
php composer.phar install --prefer-source
トラブルシューティング:
- あなたがWindowsでプロクシを使用している場合、HTTP_PROXY環境変数にHTTPプロクシのアドレスおよびポートを設定することでComposerがファイルを正しくダウンロードできるようになります。
- あなたはcomposeインストール時にgithubの認証情報の入力を求められる場合があります。
- これはgithubによるレート制限を回避するための個人用アクセストークンの生成に使用されます。
- あなたがgithubアカウントで2要素認証を有効にしている場合、または自分で認証情報を提供したくない場合、手動でトークンを生成する必要があります:
- https://github.com/settings/applications にアクセスしてパーソナルアクセストークンをリクエストしてください。
- このトークンをあなたの~/.composer/config.jsonファイルにコピーしてください。
- ( このバグに関する詳細は composer issue #2280 をご覧ください)
詳細インストラクション:
詳細インストラクション:
前のPEARベースバージョンをアンインストールする
composerを使用する前、このページではPEAR経由でのphpunitインストールを推奨していました。あなたがもしそうしていたのでしたら、今すぐそのパッケージをアンインストールした方がよいでしょう。以下のコマンドでアンインストールできるはずです:
$ pear uninstall phpunit/DbUnit $ pear uninstall phpunit/PHPUnit
PHPUnitバージョン
以下の表はデフォルトのコンポーザ設定を使用した場合、どのMoodleバージョンでどのPHPUnitがインストールされるか示しています。
Moodleバージョン | PHPUnitバージョン | リンク |
---|---|---|
Moodle 3.11 | PHPUnit 9.5 | ドキュメンテーション |
Moodle 3.10 | PHPUnit 8.5 | ドキュメンテーション |
Moodle 3.7 - 3.9 | PHPUnit 7.5 | ドキュメンテーション |
Moodle 3.4 - 3.6 | PHPUnit 6.5 | ドキュメンテーション |
Moodle 3.2 - 3.3 | PHPUnit 5.5 | ドキュメンテーション |
Moodle 3.1 | PHPUnit 4.8.27 | ドキュメンテーション |
テスト環境のインストレーション
PHPUnitの統合には専用のデータベースおよびdatarootが必要です。まず最初にconfig.phpに新しい datarootディレクトリおよび接頭辞を追加してください。config-dist.phpに例があります (「セクション 9」までスクロールダウンしてください)。
$CFG->phpunit_prefix = 'phpu_'; $CFG->phpunit_dataroot = '/home/example/phpu_moodledata';
PHPUnitのテストの中にはインターネットへのライブ接続を必要とするものがあります。システムがインターネットに直接接続されていない場合、config.phpでプロキシを指定する必要があります - 通常は管理設定ユーザインターフェイスで指定します (あなたがプロクシを使用していない場合、このステップは省略してください)。正しい値がわからない場合、関連する管理者設定ページまたはデータベースのmdl_configテーブルで設定を確認してください。
// 通常のプロキシ設定 $CFG->proxyhost = 'wwwcache.example.org'; $CFG->proxyport = 80; $CFG->proxytype = 'HTTP'; $CFG->proxybypass = 'localhost, 127.0.0.1, .example.org'; // プロキシがユーザ名/パスワードを必要としない場合は次の行を省略してください: $CFG->proxyuser = 'systemusername'; $CFG->proxypassword = 'systempassword';
Moodle 2.8.5以降、単体テストのために特定のデータベース設定を提供することもできます (提供されない場合、標準のデータベース設定が使用されます):
$CFG->phpunit_dbtype = 'pgsql'; // 'pgsql', 'mariadb', 'mysqli', 'mssql', 'sqlsrv' または 'oci' $CFG->phpunit_dblibrary = 'native'; // 現在、'native' のみ $CFG->phpunit_dbhost = '127.0.0.1'; // 例 'localhost' または 'db.isp.com' または IP $CFG->phpunit_dbname = 'mytestdb'; // データベース名 例) moodle $CFG->phpunit_dbuser = 'postgres'; // あなたのデータベースユーザ名 $CFG->phpunit_dbpass = 'some_password'; // あなたのデータベースパスワード
そして、あなたは以下のコマンドでテスト環境を初期化する必要があります。
cd /home/example/moodle php admin/tool/phpunit/cli/init.php
このコマンドはアップグレード、プラグインのインストールおよびアンインストール、開発中のプラグインへのテスト追加等の場合に繰り返し実行する必要があります。
注意: 個々のinitスクリプトが繰り返し呼び出すため、php cliの実行ファイル (またはあなたが使用したいもの) が正しくパス上にあることを確認してください。また、en_AUロケールがサーバにインストールされていることを確認してください。
LDAP
あなたがLDAP単体テストを実行したい場合、テストサーバ上で動作する設定済みのLDAP環境を準備する必要があります。基本的なLDAPツリー構造がない場合、「Search: No such object」 とメッセージが表示されてテストが失敗します。新しいシェルプロンプトでLDAPツリー構造を構築してください:
$ ldapadd -H ldap://127.0.0.1 -D "cn=admin,dc=yourcomputer,dc=local" -W dn:dc=yourcomputer,dc=local objectClass:dcObject objectClass:organizationalUnit dc:yourcomputer ou:YOURCOMPUTER
あなたのテスト用LDAP環境を探す場所をconfig.phpでMoodleに教えてください:
// auth/ldapテスト用の定数 define('TEST_AUTH_LDAP_HOST_URL', 'ldap://127.0.0.1'); define('TEST_AUTH_LDAP_BIND_DN', 'cn=admin,dc=yourcomputer,dc=local'); define('TEST_AUTH_LDAP_BIND_PW', '*'); define('TEST_AUTH_LDAP_DOMAIN', 'dc=yourcomputer,dc=local'); // enrol/ldapテスト用定数 define('TEST_ENROL_LDAP_HOST_URL', 'ldap://127.0.0.1'); define('TEST_ENROL_LDAP_BIND_DN', 'cn=admin,dc=yourcomputer,dc=local'); define('TEST_ENROL_LDAP_BIND_PW', '*'); define('TEST_ENROL_LDAP_DOMAIN', 'dc=yourcomputer,dc=local'); // lib/ldapのテスト用定数 define('TEST_LDAPLIB_HOST_URL', 'ldap://127.0.0.1'); define('TEST_LDAPLIB_BIND_DN', 'cn=admin,dc=yourcomputer,dc=local'); define('TEST_LDAPLIB_BIND_PW', '*'); define('TEST_LDAPLIB_DOMAIN', 'dc=yourcomputer,dc=local');
テスト実行
すべてのテストスイートをメイン設定ファイルから実行したい場合、あなたの
vendor/bin/phpunit
スクリプト
$CFG->dirroot
をディレクトリで実行してください。
cd /home/example/moodle vendor/bin/phpunit
残りの例では
phpunit
を使用していますが、
vendor/bin/phpunit
と置換するか、あなたはディレクトリにショートカットを作成する必要があります。 あなたはIDE でPHPUnit の設定ファイルへのパスを指定する必要がある場合があります。あなたの
$CFG->dirroot
から
phpunit.xml
への絶対パスを使用してください。 ウェブインタフェースを介してテストを実行するための代替スクリプトがあります:
admin/tool/phpunit/webrunner.php
これはテストサーバ上でコマンドラインインターフェイスを使用できない場合の最後の手段として使用してください。コマンドラインおよびwebrunnerの両方から実行しようとした場合、恐らくパーミッションの問題で壊れてしまうでしょう。この機能は公式にはサポートされていません。
一部のテストのみ実行する方法
単一のテストをすばやく実行する (PHPUnit 9)
テンプレート:Moodle 3.11 PHPUnit 9.5以降 (Moodle 3.11以降) で単一のテストを実行するには filter引数を使用するのが一番簡単な方法です:
vendor/bin/phpunit --filter tool_dataprivacy_metadata_registry_testcase
ひとつのコンポーネントが提供するすべてのテストを実行するにはphpunit.xmlファイルにあるsuiteおよび名称を使用してください。例:
vendor/bin/phpunit --testsuite workshopform_accumulative_testsuite
Alternatively if you have config files built for each component:
vendor/bin/phpunit -c mod/workshop/form/accumulative/
単一のテストをすばやく実行する (PHPUnit 8)
テンプレート:Moodle 3.10 PHPUnit 8.5以降 (Moodle 3.10以降) で単一のテストを実行するための最速の方法です:
vendor/bin/phpunit my/tests/filename.php
実際のテストを確認するにはこのコマンドをCLIで実行してください:
vendor/bin/phpunit cohort/tests/cohortlib_test.php
また、あなたはクラス内で1つのテストメソッドを実行できます:
vendor/bin/phpunit --filter test_function_name path/to/file.php
注意: この方法でテストを実行した場合、例えばファイルが正しい場所に置かれていない時に通常の実行に含まれないテストを実行する可能性があるため、注意が必要です。あなたがこの方法を使用する場合、少なくとも1回は完全なテスト (または以下のように --group run)を実行してテストが検出されることを確認してください。
フィルタを適用して、すべてのテストスイートで類似したテストグループもキャプチャできます:
vendor/bin/phpunit --filter test_flag_user
testsuiteオプションを使用して、コンポーネント (サブシステムまたはプラグイン) 内のすべてテストの実行も可能です:
vendor/bin/phpunit --testsuite mod_forum_testsuite
vendor/bin/phpunit --testsuite core_privacy_testsuite
vendor/bin/phpunit --testsuite core_privacy_testsuite --filter test_component_is_compliant
@groupアノテーションを使用する
あなたがプラグイン内すべてのクラスにアノテーションを以下のように追加している場合、
namespace qtype_stack;
/**
* Unit tests for {@link stack_cas_keyval} @ qtype/stack/tests/cas_keyval_test.php.
* @group qtype_stack
*/
class cas_keyval_test extends \basic_testcase {
以下のようにプラグインのテストを実行できます:
phpunit --group qtype_stack
したがって、あなたのプラグインにすべてのテストでフランケンスタイル名の注釈をお勧めします。
複数のphpunit.xmlファイルを使用する
どのテストを一緒に実行しなければならないか定義したphpunit.xmlファイルを代わりに作成するのは簡単です。参考までにテスト環境が初期化された後、あなたのベースディレクトリにあるデフォルトの/phpunit.xmlを確認してください。あなたはカスタムファイルを作成した後、次のコマンドでテストを実行できます:
vendor/bin/phpunit -c path/to/your/alternative/phpunit/file.xml
また、あなたは日常的な使用に関して次のコマンドを使用できます:
php admin/tool/phpunit/cli/util.php --buildcomponentconfigs
これは各コンポーネント (プラグインまたはサブシステム) およびその他の重要なディレクトリに有効なphpunit.xmlファイルを自動的に作成します。そして、あなたは次のようなテストコマンドを実行できます:
vendor/bin/phpunit -c mod/forum[/phpunit.xml] // ファイル名が「phpunit.xml」の場合、ファイル名を指定する必要がないことに留意してください。 vendor/bin/phpunit -c question vendor/bin/phpunit -c question/type/calculated vendor/bin/phpunit -c backup vendor/bin/phpunit -c lib/dml ...
または
cd directory/with/phpunit.xml phpunit
外部テストリソース
Moodle 2.6
デフォルトではMoodle phpunitでcurl関連機能をテストする場合、http://download.moodle.orgサーバにコンタクトします。オプションとして、あなたはテストスクリプトのローカルコピーをチェックアウトして代わりにそれにアクセスできます:
- clone https://github.com/moodlehq/moodle-exttests to web directory
- ウェブディレクトリに https://github.com/moodlehq/moodle-exttests をクローンしてください。
- あなたのconfig.phpファイルに追加するか、phpunit.xmlファイルを修正してください:
define('TEST_EXTERNAL_FILES_HTTP_URL', 'http://localhost/moodle-exttests');
新しいテストを書く
- 公式PHPUnitオンラインドキュメンテーションをご覧ください。
- PHPUnitテストを書くをご覧ください。
既存のSimpleTestsの変換
- SimpleTestコンバージョンをご覧ください。
IDEにおけるPHPUnitのサポート
単体テストでよくある問題
パフォーマンス
Moodle 2.7のPHPUnit テストをフルに実行した場合、マシンにもよりますが通常10-20分ほどで終了します。もしテストの実行が遅い場合:
- あなたがテストを実行しているのと同じマシン上でデータベースおよびファイルシステムが動作していることを確認してください (リモートサーバではない)。
- 開発者専用のパフォーマンス設定をデータベースに適用してください: 開発者のためのPostgresチューニング
コマンドラインヒント Command line tips
- プラグインのすべてのテストを実行してください (この例では mod_mymodule) : vendor/bin/phpunit --testsuite=mod_mymodule_testsuite
- 名前付きテストのみ実行してください: vendor/bin/phpunit --filter=test_my_test_function_name
- 実行前に各テストの名前を表示してください (終了前にテストがクラッシュして、その時点でどのテストを実行していたかを知りたい場合に有用です) vendor/bin/phpunit --debug (非常に長くなるため、恐らくこれをファイルにリダイレクトしたいでしょう)。