2013-06-03 14 views
8

約180個のユニットテストでwebtestcaseクラスが実装されており、テストがコントローラ上で実行されています。phpunitがsymfony 2.Xで動作しているときにPDO接続が閉じられていない

しかし、ユニットテストを実行すると、DBへの接続が多すぎます。アクティブなTCP接続テストが多すぎるため、120回目のテスト後に失敗します。テストが実行されている間、すべての接続はアクティブです。

私たちがエンティティマネージャのclose関数を呼び出すtearDown関数では何もありませんが、何の影響もありません。接続オブジェクトの参照を保持するいくつかのクラスがあります。

オブジェクトがヌルに割り当てられている場合、pdo接続に関するPHPのマニュアルが記載されているため閉じています。私たちもそれを行いますが、変更はありません。 P.S:私たちの単体テストは機能テストです。コントローラを介して動作し、dbと統合され、モックオブジェクトはありません

私たちのミスはどこがわかりましたか?どうすれば問題を解決できますか? config_test.yml

imports: 
    - { resource: config_dev.yml } 

framework: 
    test: ~ 
    session: 
     storage_id: session.storage.mock_file 

web_profiler: 
    toolbar: false 
    intercept_redirects: false 

doctrine: 
    dbal: 
     driver: pdo_mysql 
     port: 3306 
     host: localhost 
     dbname: mydb 
     user: myuser 
     password: mypass 
     charset: UTF8 
+0

config.ymlファイルやparameters.ymlの中でどのようにあなたの接続を定義するのか分かりますか? – j0k

+0

@ j0k質問に追加しました – GirginSoft

+0

しばらく前に同様の問題がありました。この問題は、未完成のトランザクションのために発生しました。トランザクションを明示的に使用していますか(私はbegin-commit/rollbackを意味します)?その場合は、必ず終了してください。 – Cyprian

答えて

6

この私の接続パラメータは、あなたのphpunit.xml.distファイルをチェックしましたか?

私はあなたがこれを見るべきだと思います。 http://www.slideshare.net/fabpot/unit-and-functional-testing-with-symfony2

は、あなたのパラメータは、プロセスの分離を有効にすると、実行するテストスイートはとてつもなくはるかに遅い作るの副作用を持つことになります

<phpunit 
    backupGlobals    = "false" 
    backupStaticAttributes  = "false" 
    colors      = "true" 
    convertErrorsToExceptions = "true" 
    convertNoticesToExceptions = "true" 
    convertWarningsToExceptions = "true" 
    processIsolation   = "true" 
    stopOnFailure    = "false" 
    syntaxCheck     = "false" 
    bootstrap     = "bootstrap.php.cache" > 
+0

ありがとうございました。私は解決策を見つけた。明らかに、processIsolationパラメータが問題を引き起こしていました。このテスト全体が1つのプロセスで動作するため、これは誤りでした。しかし、私はそれを真に変えた後、各テストが終了した後に接続が閉じられました。 @bulutcagatay – GirginSoft

+1

興味深いことに、これは別の問題を引き起こします: "Uncaught PDOException:あなたはPDOインスタンスを直列化または直列化解除できません"。 –

3

以下同じであることを確認してください。

より良いアプローチはどちらか、ちょうどその接続を閉じるには、明示的に教義を伝えることですテストティアダウン、tearDownAfterClassまたは例えばのような、のような注釈付きのいずれかの方法で:この例では

trait CloseConnectionAfterTestTrait { 
    /** @after */ 
    public function avoidExhaustingDbConnections() 
    { 
     if(!empty($this->em)){ 
      $this->em->getConnection()->close(); 
     } 
    } 
} 

、それが次第です消費者は彼が持っているエンティティマネージャインスタンスをすべて$this->emとして保存します。しかし、Doctrineを使用している場合は、Doctrineサービスにstatic::$kernel->somethingでアクセスしてコードを一般化することができます。

+0

各テストの後に接続を閉じるコードを追加しましたが、それでも効果はありません... – naneri

関連する問題