2016-03-16 8 views
6

を漏らす: http://symfony.com/doc/2.7/cookbook/testing/doctrine.html私たちは、このテストを書かれている:symfonyのとPHPUnitのメモリはsymfonyのドキュメンテーションの出発当社PHPUnitテストで</p> <p>を教義をロードするときに私たちは、メモリリークの問題を持っている

use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; 

class memoryleakTest extends KernelTestCase 
{ 
    private $em; 

    protected function setUp() 
    { 
     self::bootKernel(); 

     $this->em = static::$kernel->getContainer() 
      ->get('doctrine') 
      ->getManager(); 
    } 

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

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

    function testEEE1() { 
    } 
    function testEEE2() { 
    } 
    function testEEE3() { 
    } 
    function testEEE4() { 
    } 
    function testEEE5() { 
    } 
    function testEEE6() { 
    } 
    function testEEE7() { 
    } 
    function testEEE8() { 
    } 
    function testEEE9() { 
    } 
    function testEEE10() { 
    } 
    function testEEE11() { 
    } 
    function testEEE12() { 
    } 
    function testEEE13() { 
    } 
    function testEEE14() { 
    } 
    function testEEE15() { 
    } 
    function testEEE16() { 
    } 
} 

我々はこの結果を得ました(括弧の間php_memory_usage):私たちは、セットアップでの教義マネージャの負荷を削除した場合、我々が得た

testEEE1: . (42M) 
testEEE2: . (42.7M) 
testEEE3: . (43.3M) 
testEEE4: . (44M) 
testEEE5: . (44.8M) 
testEEE6: . (45.5M) 
testEEE7: . (46.1M) 
testEEE8: . (46.8M) 
testEEE9: . (47.4M) 
testEEE10: . (48.1M) 
testEEE11: . (48.7M) 
testEEE12: . (49.4M) 
testEEE13: . (50.1M) 
testEEE14: . (50.7M) 
testEEE15: . (51.4M) 
testEEE16: . (52M) 

(32,7M )各テストのために

ティアダウン機能で各テストの後にドクトリンをアンロードするのは適切な方法ですか?

+0

は私によく見えます。とにかくカールがありますか?それは私に致命的なメモリリークを引き起こしました – DevDonkey

+0

@DevDonkeyテストではまったく何もありません。カールもDBアクセスもありません。それを使用せずにdoctrineを呼び出すだけです(おそらくすべてのメタデータを読み込みます)。メモリにロードされたすべての情報は、カーネル - > shutdown()でも解放されていないようです。 – Cedric

答えて

3

に自動的に完全なソリューションを動作しないようGCが表示されます。PHPUnitのテストで使用される各サービスのために https://github.com/symfony/symfony/issues/18236

を、あなたはそれを解放する必要がありますガベージコレクタでメモリを解放する場合は、変数にnullを代入します。

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

    $this->em->close(); 

    $this->em=null; 

    gc_collect_cycles(); 
} 
+1

私は 'gc_collect_cycles();'を手動で呼び出すことは本当に重要だとは思いません。とにかく、いいショット! –

+1

@スムース私はあなたに同意します、ここでのポイントは$ this-> em = nullです – Cedric

0

カーネルを16回起動するため、メモリリークではなく、通常のフローです。

メソッドにgc_collect_cycles();を追加しようとすると、メモリ使用量が減少することがわかります。 代わりにあなたが50Mにmemory_limitを設定することができますし、ここに発見されて、それは

+2

gc_collect_cycles(); tearDownでは何も変更されません。まったく同じメモリ使用量、またはメモリ使用量はまったく変わりません。 memory_limitは私が今まで行ったことですが、実際には私の実際のテストでは現在4G以上のメモリが使用されています!だからもう解決策ではありません – Cedric

1

あなたのためにこれをさらに容易にするために、あなたはティアダウン機能でBaseTestCase.phpを持っており、この内部を置くことができます。コードの一部は、いくつかの頭痛からあなたを救う

// Remove properties defined during the test 
    $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); 
     } 
    } 

:)

関連する問題