PHPUnit致命错误:允许的内存大小用尽

时间:2019-02-21 13:47:01

标签: php memory-leaks phpunit fatal-error phpunit-testing

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

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

我发现--process-isolation在执行PHPUnit 8时可以解决此问题,但是现在执行测试需要花费大量时间(大约30分钟进行简单的字符串比较需要5分钟),并且每次进行新测试时都会增加,从长远来看,这显然是不可行的。

另外,增加允许的内存确实不能解决这个问题,因为a)可能只是临时解决方案,b)PHPUnit 8不可能仅将所有可用内存用于两次简单的失败测试。

我已经卸载并重新安装了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;                                                 
}      

1 个答案:

答案 0 :(得分:0)

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

对于Symfony来说,该命令特别是:

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