2017-02-12 11 views
4

私はPHPUnitの実行ごとに約200個のテストを実行しているため、ZF3とDoctrineのPHPUnitテストで「接続が多すぎます」という問題に直面しています。 私はすでにスタックオーバーフローに関するいくつかの質問と回答を見つけましたが、これらの作業はできません。PHPUnitのテストとDoctrineの接続が多すぎます

マイセットアップ: ZF2/ZF3、Doctrine 2、PHPUnit。

public function setUp() 
{ 
    $this->setApplicationConfig(Bootstrap::getConfig()); 
    Bootstrap::loadAllFixtures(); 
    if (!static::$em) { 
     echo "init em"; 
     static::$em = Bootstrap::getEntityManager(); 
    } 
    parent::setUp(); 
    .... 
} 

public function tearDown() 
{ 
    parent::tearDown(); 
    static::$em->flush(); 
    static::$em->clear(); 
    static::$em->getConnection()->close(); 
    $refl = new \ReflectionObject($this); 
    foreach ($refl->getProperties() as $prop) { 
     if (!$prop->isStatic() && 0 !== strpos($prop->getDeclaringClass()->getName(), 'PHPUnit_')) { 
      $prop->setAccessible(true); 
      $prop->setValue($this, null); 
     } 
    } 
    gc_collect_cycles(); 
} 

public static function (Bootstrap::)loadAllFixtures() 
{ 
    static::$em->getConnection()->executeUpdate("SET foreign_key_checks = 0;"); 
    $loader = new Loader(); 
    foreach (self::$config['data-fixture'] as $fixtureDir) { 
     $loader->loadFromDirectory($fixtureDir); 
    } 
    $purger = new ORMPurger(static::$em); 
    $executor = new ORMExecutor(static::$em, $purger); 
    $executor->execute($loader->getFixtures()); 
    $executor = null; 
    $purger = null; 
    static::$em->getConnection()->executeUpdate("SET foreign_key_checks = 1;"); 
    static::$em->flush(); 
    static::$em->clear(); 
} 

Iが増加しているinnotopとの接続の数と私のローカルのMySQLサーバーを監視しています:

は、私はすべてのテストと、このような確立とティアダウン機能の一見のための基本テストクラスを持っています。

私には何か不足しているアイディアがありますか?

は、 アレクサンダー

アップデート2017年2月14日ありがとう: を私はstatic::$emを使用するための機能を変更し、Bootstrap::loadAllFixtures方法を追加しました。

static::$em->close()tearDownメソッドを追加すると、「EntityManager already closed」のようなメッセージですべての後続テストが失敗します。 echo "init em";は一度だけ呼び出され、最初のテストで表示されます。 私のアプリケーションが接続を開かずに接続を開くかどうかチェックする可能性はありますか?私のテストケースは、AbstractHttpControllerTestCaseに基づいています。

+1

すべてのテストで同じ接続を共有してみませんか? 'setUpBeforeClass()'関数を使用し、 '$ this-> em'を' static :: $ em'のような静的に設定することができました。クラスごとに定義されているテストの数に応じて、役立つはずです。 – segFault

+1

@sebastianForsbergの答えはおそらく行く方法ですが、各テスト後に$ em-> clear()を忘れないと、予期しない結果が生じる可能性があります。 – LBA

+0

static :: $ emを使用するようにテストを変更しましたが、問題は解決しません。実行されたテストごとに、接続数が1ずつ増えます。アプリケーションがすべての接続を閉じないかどうかを確認する方法はありますか? –

答えて

0

あなたのtearDownメソッドは、そのトリックを行う必要があるようです。私はこれをしてこの問題を経験したことがありません

protected function tearDown() 
{ 
    parent::tearDown(); 

    $this->em->close(); 
    $this->em = null; 
} 

Bootstrap :: loadAllFixturesメソッドは何をしますか?見過ごされているDB接続がありますか?

+0

'static :: $ em-> close()'は、 "EntityManagerが既に閉じられている"ため、次のテストでエラーにつながります。 'Bootstrap :: loadAllFixtures()'が上に表示されます。この関数呼び出しをコメントすると、テストは失敗する可能性がありますが、接続番号はまだ増加しています。 –

関連する問題