【发布时间】: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