68

Composer を介して Sebastian Bergmann による PHPUnit バージョン 3.7.19 をインストールし、単体テストを行いたいクラスを作成しました。

すべてのクラスを使用せに各単体テストに自動ロードしたいのですが、これは難しいことがわかりました!includerequire

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

  • composer.json
  • composer.lock
  • composer.phar
  • ライブラリ/
    • 戻る.php
  • テスト/
    • 戻るTest.php
  • ベンダー/
    • 置き場/
      • phpユニット
    • 作曲/
    • phpユニット/
    • symfony/
    • autoload.php

私のcomposer.jsonファイルには次のものが含まれています。

"require": {
    "phpunit/phpunit": "3.7.*",
    "phpunit/phpunit-selenium": ">=1.2"
}

私のreturn.phpクラス ファイルには、次のものが含まれています。

<?php
class Returning {
    public $var;
    function __construct(){
        $this->var = 1;
    }
}
?>

私のReturnTest.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.phpvendor/autoload.php

また、Stack Overflow に関する他の回答では、composer でPSR-0namespaceを使用し、PHP でコマンドを使用することについて言及されていますが、どちらも使用できませんでした。

助けてください!PHPUnit でクラスを自動ロードしたいだけなので、それらを使用してオブジェクトを作成しincludeたり、require.


更新: 2013 年 8 月 14 日

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

4

5 に答える 5

80

さて、最初に。クラスのphpファイルの場所をオートローダーに伝える必要があります。これは、PSR-0 規格に従って行われます。

最善の方法は、名前空間を使用することです。クラスAcme/Tests/ReturningTest.phpを要求すると、オートローダーはファイルを検索します。Acme\Tests\ReturningTest名前空間に関する優れたチュートリアルがいくつかあります。検索して読んでください。名前空間は、自動ロードのために PHP に組み込まれたものではなく、自動ロードに使用できるものであることに注意してください。

Composer には、標準の PSR-0 オートローダ ( にあるものvendor/autoload.php) が付属しています。あなたの場合、libディレクトリ内のファイルを検索するようにオートローダーに指示したいとします。次に、使用ReturningTestすると が検索され/lib/ReturningTest.phpます。

これをあなたに追加してくださいcomposer.json

{
    ...
    "autoload": {
        "psr-0": { "": "lib/" }
    }
}

詳細については、ドキュメントを参照してください。

これで、オートローダーは、テストを実行する前に実行するファイルがあることを PHPunit に知らせるために必要なクラスを見つけることができます: ブートストラップ ファイルです。オプションを使用して--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オプションを使用してコマンドにそのディレクトリへのパスを配置する必要があります。

于 2013-03-29T20:58:53.080 に答える
45

[ Update2 ] 別のより簡単な代替アプローチは、autoload-devディレクティブ in composer.json( reference ) を使用することです。利点は、異なるクラスを自動ロードするためだけに 2 つの bootstrap.php (prod 用と dev 用) を維持する必要がないことです。

{
  "autoload": {
    "psr-4": { "MyLibrary\\": "src/" }
  },
  "autoload-dev": {
    "psr-4": { "MyLibrary\\Tests\\": "tests/" }
  }
}

[更新] Wouter Jの回答はより完全です。tests/しかし、私のものは、フォルダーにPSR-0の自動読み込みを設定したい人を助けることができます。
Phpunit は、このパターンですべてのファイルをスキャンします*Test.php。したがって、それらを自分で自動ロードする必要はありません。tests/しかし、フィクスチャ/スタブや一部の親クラスなど、他のサポート クラスをオートロードしたい場合もあります。

簡単な方法は、Composer プロジェクト自体がどのように phpunit テストをセットアップしているかを調べることです。それは実際には非常に簡単です。「bootstrap」の行に注意してください。

参照: 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 <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* 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 テスト クラスを自動ロードしています。

于 2013-03-30T07:28:05.817 に答える
6

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

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

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

{
    "autoload": {
        "psr-0": { "Monolog\\": ["src/", "lib/"] }
    }
}
于 2013-09-29T15:42:43.443 に答える