PHPUnit_Framework_TestCase内存泄漏与大型DataProvider

时间:2012-05-06 15:53:46

标签: symfony phpunit dataprovider

当我运行PHPUnit时,在我看来,在单个测试类中运行许多测试时,它似乎有内存泄漏。但我不知道这是一个错误还是预期的行为。

重现:

  • 我用一个愚蠢的assertTrue(true)创建一个简单的testHello()。
  • 我从providerHello()提供它。只喂3个虚拟参数。
  • 使用$numberOfTests = 1;,消耗的内存为5.75MB。
    • PHPUnit输出= Time: 0 seconds, Memory: 5.75Mb
  • 使用$numberOfTests = 10000;,我不希望内存增长如此之多,只是新数组的大小。但是用过的内存是99.75MB,我觉得它太多了。
    • PHPUnit输出= Time: 4 seconds, Memory: 99.75Mb
  • 我在提供程序中添加了一个脏的echo(),只是为了知道该数组使脚本占用了多少内存。
    • 进行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;
    }

}
?>

1 个答案:

答案 0 :(得分:0)

您需要在phpunit.xml文件中将backupGlobals和backupStaticAttributes设置为false。如果不使用配置文件,也可以在命令行中执行此操作。

 --no-globals-backup
 --static-backup