2012-05-06 2 views
0

Когда я запускаю PHPUnit, мне кажется, что у него была утечка памяти при запуске многих тестов внутри одного тестового класса. Но я не знаю, является ли это ошибкой или это ожидаемое поведение.Утечка памяти PHPUnit_Framework_TestCase с большим DataProvider

Для воспроизведения:

  • Я создаю простой testHello() с глупой assertTrue (правда).
  • Я подаю его от поставщикаHello(). Просто кормить 3 фиктивных параметра.
  • С $numberOfTests = 1;, потребляемая память 5.75MB.
    • PHPUnit выход = Time: 0 seconds, Memory: 5.75Mb
  • С $numberOfTests = 10000;, я не ожидал, что память расти так много, только размер нового массива. Но используемая память составляет 99,75 МБ, что я чувствую, что это слишком много.
    • PHPUnit выход = Time: 4 seconds, Memory: 99.75Mb
  • Я добавил грязное эхо() в поставщике, только чтобы узнать, сколько памяти массив сделал скрипт для потребляет.
    • С 1 тест: Memory = 5294552 (5.2MB)
    • С 10.000 тестов: Memory = 15735352 (15.7MB)

вопросы:

  • Почему я рыхлую 84MB в путь? (99.75 реально потребляется - 15.75 действительно используется массивом)
  • Является ли это гормоном, что он выделяет память на каждой итерации, возможно, ее внутреннюю setUp(), но не освобождает ту же сумму на внутренней tearDown()?
  • Я делаю что-то неправильно?

Моя версия:

phpunit --version дает PHPUnit 3.6.10 by Sebastian Bergmann..

Это код:

<?php 
class DemoTest extends \PHPUnit_Framework_TestCase 
{ 
    /** @dataProvider providerHello */ 
    public function testHello($a, $b, $c) 
    { 
     $this->assertTrue(true); 
    } 

    public function providerHello() 
    { 
     $numberOfTests = 10000; 

     $data = array(); 

     for($i = 0; $i < $numberOfTests; $i++) 
     { 
      $data[] = array(1, 2, 3); 
     } 

     echo("Memory = " . memory_get_peak_usage() . PHP_EOL); 

     return $data; 
    } 

} 
?> 

ответ

0

вам необходимо установить backupGlobals и backupStaticAttributes к ложным в файле phpunit.xml. Если вы не используете файл конфигурации, вы также можете сделать это в командной строке.

--no-globals-backup 
--static-backup 
Смежные вопросы