Composer=を介してSebastian BergmannによってPHPUnitバージョン3.7.19をインストールし、ユニットテストを行いたいクラスを作成しました。
すべてのクラスを各ユニットテストwithoutに自動ロードして、include
またはrequire
を使用する必要があります。私のテストのトップですが、これは難しいことが証明されています!
これは私のディレクトリ構造のようです(末尾の/スラッシュはファイルではなくディレクトリを示します):
私のcomposer.jsonファイルには以下が含まれます。
"require": {
"phpunit/phpunit": "3.7.*",
"phpunit/phpunit-Selenium": ">=1.2"
}
私のreturning.phpクラスファイルには以下が含まれます。
<?php
class Returning {
public $var;
function __construct(){
$this->var = 1;
}
}
?>
私のreturningTest.phpテストファイルには以下が含まれます。
<?php
class ReturningTest extends PHPUnit_Framework_TestCase
{
protected $obj = null;
protected function setUp()
{
$this->obj = new Returning;
}
public function testExample()
{
$this->assertEquals(1, $this->obj->var);
}
protected function tearDown()
{
}
}
?>
ただし、コマンドラインから./vendor/bin/phpunit tests
を実行すると、次のエラーが表示されます。
PHPの致命的エラー:8行目の/files/code/php/db/tests/returningTest.phpにクラス 'Returning'が見つかりません
composer
がautoload.php
でvendor/autoload.php
ファイルを生成したことに気付きましたが、これが私の問題に関連するかどうかはわかりません。
また、スタックオーバーフローに関する他のいくつかの回答で、人々は PSR- in composerおよびPHPのnamespace
コマンドを使用することについて言及していますが、どちらを使用しても成功していません。
助けてください! include
やrequire
を気にせずにクラスを使用してオブジェクトを作成できるように、PHPUnitでクラスを自動ロードしたいだけです。
更新:2013年8月14日
PHPUnit Skeleton という名前のオープンソースプロジェクトを作成し、プロジェクトのPHPUnitテストを簡単に開始して実行できるようにしました。
まあ、最初は。クラスのphpファイルの場所をオートローダーに伝える必要があります。これは、PSR-0標準に従って行われます。
最良の方法は、名前空間を使用することです。オートローダーは、Acme/Tests/ReturningTest.php
クラスを要求すると、Acme\Tests\ReturningTest
ファイルを検索します。名前空間のチュートリアルがいくつかあります。検索して読むだけです。名前空間は、notPHP autoloadingの場合、autoloadingに使用できるものです。
Composerには、標準のPSR-0オートローダー(vendor/autoload.php
内のオートローダー)が付属しています。あなたの場合、オートローダーにlib
ディレクトリ内のファイルを検索するように伝えたいと思います。次に、ReturningTest
を使用すると、/lib/ReturningTest.php
が検索されます。
これをcomposer.json
に追加します:
{
...
"autoload": {
"psr-0": { "": "lib/" }
}
}
詳細は ドキュメント をご覧ください。
オートローダーは、テストを実行する前に実行するファイルがあることをPHPunitに知らせるために必要なクラスを見つけることができます:a bootstrap file。--bootstrap
オプションを使用して、 bootstrap=ファイルがあります:
$ ./vendor/bin/phpunit tests --bootstrap vendor/autoload.php
ただし、 PHPunit構成ファイル を使用する方が適切です:
<!-- /phpunit.xml.dist -->
<?xml version="1.0" encoding="utf-8" ?>
<phpunit bootstrap="./vendor/autoload.php">
<testsuites>
<testsuite name="The project's test suite">
<directory>./tests</directory>
</testsuite>
</testsuites>
</phpunit>
これで、コマンドを実行でき、構成ファイルが自動的に検出されます。
$ ./vendor/bin/phpunit
構成ファイルを別のディレクトリに配置する場合、-c
オプションを使用してコマンドにそのディレクトリへのパスを配置する必要があります。
[Update2]もう1つの簡単な代替アプローチは、autoload-dev
でcomposer.json
ディレクティブを使用することです(- reference )。利点は、異なるクラスを自動ロードするためだけに、2つのbootstrap.php(prod用、dev用)を維持する必要がないことです。
{
"autoload": {
"psr-4": { "MyLibrary\\": "src/" }
},
"autoload-dev": {
"psr-4": { "MyLibrary\\Tests\\": "tests/" }
}
}
[Update] Wouter Jの答えはより完全です。しかし、私のものはtests/
フォルダーにPSR-0オートロードを設定したい人を助けることができます。
Phpunitは、このパターン*Test.php
ですべてのファイルをスキャンします。したがって、それらを自分で自動ロードする必要はありません。しかし、フィクスチャ/スタブまたはいくつかの親クラスなど、tests/
の下にある他のサポートクラスを自動ロードしたいのです。
簡単な方法は、Composerプロジェクト自体がphpunitテストをセットアップする方法を確認することです。実際には非常に簡単です。「ブートストラップ」の行に注意してください。
参照: https://github.com/composer/composer/blob/master/phpunit.xml.dist
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false"
bootstrap="tests/bootstrap.php"
>
<testsuites>
<testsuite name="Composer Test Suite">
<directory>./tests/Composer/</directory>
</testsuite>
</testsuites>
<groups>
<exclude>
<group>slow</group>
</exclude>
</groups>
<filter>
<whitelist>
<directory>./src/Composer/</directory>
<exclude>
<file>./src/Composer/Autoload/ClassLoader.php</file>
</exclude>
</whitelist>
</filter>
</phpunit>
参照: https://github.com/composer/composer/blob/master/tests/bootstrap.php
<?php
/*
* This file is part of Composer.
*
* (c) Nils Adermann <[email protected]>
* Jordi Boggiano <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
error_reporting(E_ALL);
$loader = require __DIR__.'/../src/bootstrap.php';
$loader->add('Composer\Test', __DIR__);
上記の最後の行は、名前空間Composer\Testの下でphpunitテストクラスを自動ロードしています。
これらの答えはどれも私が探していたものではありませんでした。はいPHPUnitはテストファイルを読み込みますが、スタブ/フィクスチャは読み込みません。 Chaun Maの答えは、vendor/bin/phpunit
にはすでにオートロードが含まれているため、オートローダーのインスタンスを取得して、その時点でスタックにさらにパスをプッシュする方法はありません。
私は最終的にこれをドキュメントで見つけました:
複数のディレクトリで同じプレフィックスを検索する必要がある場合は、それらを配列として指定できます。
{ "autoload": { "psr-0": { "Monolog\\": ["src/", "lib/"] } } }
really simpleオートローディングとブートスタッドでphpunitをセットアップする方法があります。 phpunitの--generate-configuration
オプションを使用して、phpunit.xml
構成を作成します数秒で-:
vendor/bin/phpunit --generate-configuration
(または、phpunitがPATHに設定されている場合は、phpunit --generate-configuration
のみ)。このオプションは、バージョンphpunit5以降で使用できます。
このオプションは、bootstrap=ファイル(vendor/autoload.php)、テスト、およびソースディレクトリを要求します。プロジェクトがcomposer defaults(以下のディレクトリ構造を参照)デフォルトのオプションは必要なものだけです。RETURNを3回押すだけです!
project-dir
-- src
-- tests
-- vendor
デフォルトのphpunit.xmlを取得します。もちろん、必要なスペシャリズム(たとえば、colors="true"
)を含めるように編集できます。
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/8.1/phpunit.xsd"
bootstrap="vendor/autoload.php"
executionOrder="depends,defects"
forceCoversAnnotation="true"
beStrictAboutCoversAnnotation="true"
beStrictAboutOutputDuringTests="true"
beStrictAboutTodoAnnotatedTests="true"
verbose="true">
<testsuites>
<testsuite name="default">
<directory suffix="Test.php">tests</directory>
</testsuite>
</testsuites>
<filter>
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">src</directory>
</whitelist>
</filter>
</phpunit>
PHPUnit 7 を使用している場合は、src/
フォルダーからクラスを作成して、次のようなテストで自動ロードできます。
composer.json
ファイルが次のようになっていることを確認してください。
{
"autoload": {
"classmap": [
"src/"
]
},
"require-dev": {
"phpunit/phpunit": "^7"
}
}
composer.json
runコマンドで変更を適用する:
composer install
最後に、tests/
フォルダーでテストを実行できます。
./vendor/bin/phpunit tests/