【问题标题】:PHPUnit_Framework_TestCase memory leak with large DataProvider带有大型 DataProvider 的 PHPUnit_Framework_TestCase 内存泄漏
【发布时间】:2012-05-15 08:39:55
【问题描述】:

当我运行 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;
    }

}
?>

【问题讨论】:

    标签: symfony phpunit dataprovider


    【解决方案1】:

    您需要在 phpunit.xml 文件中将 backupGlobals 和 backupStaticAttributes 设置为 false。如果你不使用配置文件,你也可以在命令行上这样做。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      相关资源
      最近更新 更多