2011-12-13 10 views
2

CakeTestCase(PHPUnitを使用)を拡張し、テスト間でフィクスチャをリロードすることを防ぐCakePHP 2.0のテストケースを防ぐにはどうしたらいいですか?CakePHPとPHPUnitによるテスト間でフィクスチャが再ロードされないようにする方法

背景: PHPUnitを使用してCakePHP 2.0で作成した一連の統合テストがあります。テストケースクラスを標準CakeTestCaseから拡張しました。この一連のテストでは、データベースからデータを取り込むための一連のフィクスチャ設定があります。もちろん、これらのテストには時間がかかります。基本的に、すべての時間はCakeがテスト間ですべてのフィクスチャをアンロードして再ロードすることから来ています。

すべてのテストは、READのみとして機能します。データベースへの検索呼び出しを発行するだけで、その結果に基づいて一連のクラス相互作用の中で論理をテストしています。実際には、テストは次のように煮詰めることができます:

class ALongRunningTest extends CakeTestCase { 
    public $fixtures = array('app.class1', 'app.class2', ... 'app.class8'); 

    /** 
    * @dataProvider provider 
    * @test 
    */ 
    public function checkCompositionLogic($val1, $val2, $val3) { 
     // internally calls class1 and class3 
     $data = $this->ModelX->generateComplexStructure($val1); 

     // internally calls other classes & models, which touch the 
     // other loaded fixtures 
     $results = $this->ModelY->checkAllWhichApply($val2, $data); 

     $this->assertEquals($val3, $results); 
    } 

    public function provider() { 
     return array(
      array(stuff, stuff1, stuff2), 
      array(x_stuff, x_stuff1, x_stuff2), 
      array(y_stuff, y_stuff1, y_stuff2), 
      array(z_stuff, z_stuff1, z_stuff2), 
      array(a_stuff, a_stuff1, a_stuff2), 
      // More test cases 
     ); 
    } 
} 

これを防ぐ方法は何も見つかりませんでした。私は、CakeTestCaseクラスのpublic変数autoFixturesに、falseに変更すると、それが什器を読み込まないというコメントを見ました。手動でロードする必要があることを示すメモを作成します。しかし、実際に手動でロードする方法に関するドキュメントはありません。

+0

私はこれを設定するために 'public $ fixtures = array(...);'を使わなければならないのですか?CakeTestCaseはそれらの変数にいくつかの魔法を働かせるか、 ? – edorian

+0

はい、この質問は、CakeがPHPUnitでどのように動作するかに非常に特有のものです。 'CakeTestCase'クラスを使うと、' $ fixtures'は全ての 'Fixture'クラスをロードする期待される配列です。その後、すべてをロードするための魔法を実行します。この「魔法」とは、物を手動で読み込む方法を決定するために私がドキュメントを読み込んだり読んだりすることができなかったものです。 –

答えて

2

厳密に言えば、CakePHPは正常に動作します。テストはお互いに依存すべきではないので、データベースは各テストケース間でリセットされます。各テストメソッドの間でリセットする必要があると主張することもできますが、オーバーヘッドがさらに顕著になります。

しかし、データベース上で読み取り専用アクションを実行しているので、テストケース内のフィクスチャへの参照をすべて削除し、テストスイートを実行する前にデータベースエントリを設定することができます(SQLファイル)。

それとも、データの全体の負荷を追加したカスタムテストスイート、例えばを作成することができます。

class AllTest extends CakeTestSuite { 
    public static function suite() { 
     self::loadDB(); 
     $suite = new CakeTestSuite('All tests'); 
     $suite->addTestDirectoryRecursive(TESTS . 'Case'); 
     return $suite; 
    } 
    public static function loadDB() { 
     //Do some set up here using your models 
    } 
} 

だったこと、それをすることの利点は、あなたがこれまでに書くかのテストを導入しなければならない場合別のテストスイートの下で実行することができます。

+1

この回答をありがとう、私はさまざまなアプローチを試みていた...それは私の日を救った!ここに他の人が到着した場合、私はこの問題/タスクに関連してやった要点を分かち合いたいと思います。 https://gist.github.com/raultm/6022023#file-exampletestdata-php 読み取り専用の操作にのみお勧めします。 – raultm

関連する問題