1

引数がディレクトリであると呼び出しています (おまけの質問: ファイルのリストを受け入れられないのはなぜですか?)。以前phpunitのテストにファイルが含まれているために、クラスが複数回宣言されていると不平を言っています!

実行するphpunit firstTest.php; phpunit secondTest.phpとすべてが機能します

しかし、phpunit ./失敗しますPHP Fatal error: Cannot redeclare class X

私のテストは基本的に次のとおりです。

include 'class_to_be_tested.php'
class class1Test extends...

何もありません。そして、私はオプションを使用しています--process-isolation。クラスを追加することはできrequire_once ますが、個別にテストできるようにしたいわけではありません。

phpunit は、テストのベスト プラクティスに従い、1 つのテストを実行し、そこにあるガベージをすべてクリアし、クリーンな状態で別のテストを実行するべきではありませんか? または私は何か間違ったことをしていますか?

4

3 に答える 3

2

include質問にinclude_onceは他のコードが表示されていないため、再宣言できないというエラーは、テスト中のコードのどこかにファイルを再度含めている可能性もあります。

そうでないと仮定すると、舞台裏で発生することがいくつかあり--process-isolation、グローバルクラス宣言を保持できます。このブログ投稿で詳細を説明しています: http://matthewturland.com/2010/08/19/process-isolation-in-phpunit/

基本的に、独自のベースを作成し、メソッドをTestCaseオーバーライドしてを に設定します。これにより、すべてのテストを一緒に実行できるようになります。run()preserveGlobalStatefalse

基本クラスは次のようになります (参照したブログ投稿から引用)。

class MyTestCase extends PHPUnit_Framework_TestCase
{
    public function run(PHPUnit_Framework_TestResult $result = NULL)
    {
       $this->setPreserveGlobalState(false);
       return parent::run($result);
    }
}
于 2013-03-14T21:08:47.093 に答える
1

phpUnit の仕組みは、すべてのテストが単一の php プログラムのコンテキストで実行されることを意味します。phpUnit はテストを互いに分離することを目的としていますが、それらはすべて同じプログラム実行内で実行されます。

PHP のincludeステートメントには、要求されたファイルが以前にインクルードされたかどうかに関係なく、インクルードされます。これはinclude、特定のクラスを 2 回実行すると、2 回目にエラーが発生することを意味します。これは、各テストに同じファイルが含まれているため、テストで発生していますが、他のテストのいずれかによって既に含まれているかどうかは考慮されていません。

ソリューション:

  • クラスが既に定義されている場合にファイルを含めないように、include呼び出しを で囲みます。if(class_exists('classname'))

  • テストではなく、phpUnit ブートストラップ ファイルにファイルを含めます。

  • の代わりにinclude_once(または) を使用します。require_onceinclude

  • 任意にファイルを含めるのをやめ、オートローダーの使用を開始します。

于 2013-03-15T12:51:24.303 に答える