【问题标题】:PHPUnit Fatal error: Allowed memory size exhaustedPHPUnit 致命错误:允许的内存大小已用尽
【发布时间】:2019-02-21 13:47:00
【问题描述】:

当我运行我的测试时,PHPUnit 8 崩溃并生成一个致命错误:允许的内存大小为 x 字节已用尽。我认为它只会在某些测试失败时崩溃。

当我昨天第一次使用它时,我设置了 2 个非常简单的测试来比较 2 个字符串。当两个测试都通过时,一切正常。当我故意让 1 次测试失败时,它仍然有效。当两个测试都失败时,我得到了指定的错误。

我发现--process-isolation 在执行 PHPUnit 8 时解决了这个问题,但是现在执行测试需要花费难以置信的时间(大约 30 次简单的字符串比较需要 5 分钟),随着每个新测试的增加而增加,这是从长远来看显然不可行。

另外增加允许的内存真的不应该是这个问题的答案,因为 a)它可能只是一个临时修复,b)PHPUnit 8 不可能只使用所有可用内存来进行 2 个简单的失败测试。

我已经卸载并重新安装了 PHPUnit 8,这对问题没有任何影响。

也许很重要:我用Composer 安装了PHPUnit。

更新: 好的,我刚刚在我同事的机器上试用了它,它在那里使用相同的代码库运行得非常好。越来越奇怪了……

这是我用来测试我的方法的代码:

class MyClassTest extends TestCase
{
    public function myFunctionProvider()
    {
        // horizontal tab
        $ht = "\u{0009}";
        ...

        return [
            'descr_1' => ['   abc  ', 'abc'  ],
            'descr_2' => ['d e  f'  , 'd e f'],
            'descr_3' => ['ghi'     , 'ghi'  ],

            'descr_4' => [$ht . $ht . 'jkl' . $ht               , 'jkl'    ],
            'descr_5' => ['m' . $ht . $ht , 'n' . $ht . 'o'     , 'm n o'  ],
            ...
        ];
    }

    /**
     * @dataProvider myFunctionProvider
     */
    public function testMyFunction(string $dirtyString, string $expectedResult): void
    {
        $actualResult = MyClass::myFunction($dirtyString);

        $this->assertEquals(
            $expectedResult,
            $actualResult
        );
    }
}

我怎样才能让 PHPUnit 不吃掉我所有的资源并正常运行?

编辑: 根据 Jakub Zalas 的评论,这里是 myFunction() 的实现:

public static function myFunction(string $dirtyString): string
{                                                                          
    $regex = '/\s+| +/';                                                   
    $dirtyString = trim($dirtyString, $regex);                             
    $cleanedString = preg_replace($regex, ' ', $dirtyString);              

    return $cleanedString;                                                 
}      

【问题讨论】:

  • 如果您已经花时间对我的问题投反对票,请至少解释一下您这样做的原因。否则我不可能改进我的问题,也没有人能从中得到什么。
  • 看起来MyClass::myFunction 泄漏了内存。如果不知道该函数中的内容或测试数据的外观,很难为您提供帮助。
  • @JakubZalas 根据您的评论编辑了我的问题。
  • 我刚刚注意到:为什么您的测试类扩展了生产类? class MyClassTest extends MyClass ?您的测试类应该扩展 phpunit 的 TestCase
  • 无论如何,我会请一位同事在他的机器上安装phpunit,然后检查它是否有效,更新如下。

标签: php memory-leaks fatal-error phpunit


【解决方案1】:

我知道这是一个老问题,但我在使用 Symfony phpunit-bridge 运行 PHP 单元时遇到了同样的问题,即可怕的“内存耗尽”致命错误。对我来说,添加“--process-isolation”标志可以很好地运行测试。根据以前的经验,我发现这通常可以缓解引发内存错误的 PHP 单元测试。

对于 Symfony,具体的命令是:

$ ./vendor/bin/simple-phpunit --process-isolation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 2017-12-13
    • 2014-04-07
    • 2016-09-24
    • 2012-12-27
    • 2011-02-23
    • 2016-04-13
    相关资源
    最近更新 更多