14

PHPUnit を使い始めたばかりですが、ちょっとした障害に遭遇しました。

私のコードは $_SERVER['DOCUMENT_ROOT'] を使用してインクルードのパスを計算します。これは、Apache サーバーが PHP を実行している場合に機能しますが、「phpunit Tests」を使用してコマンドラインから phpunit を実行すると DOCUMENT_ROOT が設定されないため、これらのインクルード働かないでください。

PHPUnit の構成に何か不足していますか? どういうわけかApacheと統合する必要がありますか?

4

5 に答える 5

15

返事が遅くなりました、すみません。

いいえ、何も見逃していません。PHP CLI (コマンド ライン用の PHP) は、Apache / CGI モジュールとしての PHP とは別物です。

ただし、できることは、必要なものsetUp()に設定するようにファイルを変更することです ( CLI コンテキストでもスーパーグローバルとして引き続き使用できるため)。たとえば、次のようになります。$_SERVER['DOCUMENT_ROOT']$_SERVER

public function setUp() {
  $_SERVER['DOCUMENT_ROOT'] = dirname(__FILE__) . "/../application";
}

注意してください、おそらくこれをあなたのに入れたいと思うでしょうtearDown():

public function tearDown() {
  unset($_SERVER['DOCUMENT_ROOT']);
}

グローバル (スーパーグローバルでもある) データを使用する場合、PHPUnit はグローバル状態をバックアップします。これにより、テストが大幅に遅くなる可能性があります。

于 2010-04-21T14:15:21.520 に答える
6

本番コードにハックを挿入したり、コードをテストしたりする代わりに、追加の変数phpunit.xmlをセクションで直接設定できます (いずれにせよいずれ使用する予定です) php:

<phpunit bootstrap="vendor/autoload.php">

    <php>
        <server name="DOCUMENT_ROOT" value="wwwroot" />
        <server name="SERVER_NAME" value="localhost" />

        <const name="PHPUNIT_TESTSUITE" value="true"/>
    </php>
</phpunit>

他の可能なオプションについては、公式ドキュメントを参照してください

于 2018-10-28T16:04:55.063 に答える
2

$_SERVER['DOCUMENT_ROOT']Bootstrapファイルにも設定でき、同じ属性名でBootstrap_test.phpphpunit構成ファイルに添付されますphpunit.xmlbootstrap=Bootstrap_test.php

Jenkins ジョブ構成に $_SERVER['DOCUMENT_ROOT'] を設定するという要件を達成できました。「Bootstrap_test.php」は次のようになります

<phpunit

   backupGlobals="false"

   backupStaticAttributes="false"

   strict="true"

   verbose="true"

   bootstrap="Bootstrap_test.php">

   <testsuites>

     <testsuite name="PHPUnit Test Suite">

     <file>PHPUnitTest.php</file>

     </testsuite>

   </testsuites>

   <logging>

     <log type="coverage-clover" target="logs/clover.xml"/>

   </logging>

</phpunit>

の内容は関数Bootstrap.phpを使用して宣言されます。define()

define('BASE_PATH', realpath(dirname(__FILE__)));    
$_SERVER['DOCUMENT_ROOT'] = BASE_PATH;

このBASE_PATH変数は通常、Jenkins ジョブ ディレクトリへのフル パスを保持します。たとえば、Jenkins のジョブ名はTest_Job. Jenkins がプロジェクトのソース コードを配置するディレクトリは/var/lib/jenkins/jobs/Test_Job/workspace(jenkins の作業ディレクトリを と仮定すると/var/lib/jenkins) です。

Bootstrap_test.php がベースディレクトリに配置されている場合、BASE_PATHが保持/var/lib/jenkins/jobs/Test_Job/workspaceされ、最終的に に設定され$_SERVER['DOCUMENT_ROOT']ます。

于 2013-10-03T09:19:38.840 に答える
0

$_SERVER最善の方法は、コードをまたはその他のグローバル配列の使用から切り離すことです。たとえば、

class MyClass
{
    protected $_docroot;

    public function __construct($docroot)
    {
        $this->_docroot = $docroot;
    }

    public function getDocRoot() 
    {
        return $this->_docroot;
    }
}

それ以外の

class MyClass
{
    public function getDocRoot() 
    {
        return $_SERVER['DOCUMENT_ROOT'];
    }
}

これにより、次のことが可能になります

// in your actual code
$instance = new MyClass($_SERVER['DOCUMENT_ROOT']);
$docroot = $instance->getDocRoot();

// in your test
$instance = new MyClass($variable_holding_the_correct_path);
$docroot = $instance->getDocRoot();

これはデカップリングの単なる例であることに注意してください。あなたの場合はもっと複雑かもしれませんが、特に単体テストを実行している場合は、一般的には努力する価値があります。

于 2009-10-31T10:22:33.877 に答える