web-dev-qa-db-ja.com

Composerおよびautoload.phpを使用したPHPUnitでのクラスの自動ロード

Composer=を介してSebastian BergmannによってPHPUnitバージョン3.7.19をインストールし、ユニットテストを行いたいクラスを作成しました。

すべてのクラスを各ユニットテストwithoutに自動ロードして、includeまたはrequireを使用する必要があります。私のテストのトップですが、これは難しいことが証明されています!

これは私のディレクトリ構造のようです(末尾の/スラッシュはファイルではなくディレクトリを示します):

  • composer.json
  • composer.lock
  • composer.phar
  • lib /
    • return.php
  • tests /
    • returnTest.php
  • ベンダー/
    • 置き場/
      • phpunit
    • 作曲家/
    • phpunit /
    • symfony /
    • autoload.php

私の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'が見つかりません

composerautoload.phpvendor/autoload.phpファイルを生成したことに気付きましたが、これが私の問題に関連するかどうかはわかりません。

また、スタックオーバーフローに関する他のいくつかの回答で、人々は PSR- in composerおよびPHPのnamespaceコマンドを使用することについて言及していますが、どちらを使用しても成功していません。

助けてください! includerequireを気にせずにクラスを使用してオブジェクトを作成できるように、PHPUnitでクラスを自動ロードしたいだけです。


更新:2013年8月14日

PHPUnit Skeleton という名前のオープンソースプロジェクトを作成し、プロジェクトのPHPUnitテストを簡単に開始して実行できるようにしました。

61
Jasdeep Khalsa

まあ、最初は。クラスの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オプションを使用してコマンドにそのディレクトリへのパスを配置する必要があります。

72
Wouter J

[Update2]もう1つの簡単な代替アプローチは、autoload-devcomposer.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テストクラスを自動ロードしています。

40
Chuan Ma

これらの答えはどれも私が探していたものではありませんでした。はいPHPUnitはテストファイルを読み込みますが、スタブ/フィクスチャは読み込みません。 Chaun Maの答えは、vendor/bin/phpunitにはすでにオートロードが含まれているため、オートローダーのインスタンスを取得して、その時点でスタックにさらにパスをプッシュする方法はありません。

私は最終的にこれをドキュメントで見つけました:

複数のディレクトリで同じプレフィックスを検索する必要がある場合は、それらを配列として指定できます。

{
    "autoload": {
        "psr-0": { "Monolog\\": ["src/", "lib/"] }
    }
}
6
Josh Ribakoff

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>
2
suspectus

PHPUnit 7 を使用している場合は、src/フォルダーからクラスを作成して、次のようなテストで自動ロードできます。

  1. composer.jsonファイルが次のようになっていることを確認してください。

    {
        "autoload": {
            "classmap": [
                "src/"
            ]
        },
        "require-dev": {
            "phpunit/phpunit": "^7"
        }
    }
    
  2. composer.json runコマンドで変更を適用する

    composer install
    
  3. 最後に、tests/フォルダーでテストを実行できます。

    ./vendor/bin/phpunit tests/
    
0
yesnik