PHPUnit

提供:MoodleDocs
移動先:案内検索

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要素認証を有効にしている場合、または自分で認証情報を提供したくない場合、手動でトークンを生成する必要があります:
    • ( このバグに関する詳細は 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サーバにコンタクトします。オプションとして、あなたはテストスクリプトのローカルコピーをチェックアウトして代わりにそれにアクセスできます:

  1. clone https://github.com/moodlehq/moodle-exttests to web directory
  2. ウェブディレクトリに https://github.com/moodlehq/moodle-exttests をクローンしてください。
  3. あなたのconfig.phpファイルに追加するか、phpunit.xmlファイルを修正してください:
    define('TEST_EXTERNAL_FILES_HTTP_URL', 'http://localhost/moodle-exttests');
    

新しいテストを書く

既存のSimpleTestsの変換

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 (非常に長くなるため、恐らくこれをファイルにリダイレクトしたいでしょう)。