Time: 1.89 minutes, Memory: 526.00MB
OK (487 tests, 2324 assertions)
这是我测试我的Laravel API的PHPunittest结果,内存消耗不断增加,感觉我在互联网上尝试了所有帖子和答案,以便在测试时保持内存.从自己的调试开始,每次测试都应该删除App.
一切都非常标准,createApplication方法看起来像这样.
public function createApplication()
{
// Ran out of memory
ini_set('memory_limit', '1024M');
$app = require __DIR__ . '/../bootstrap/app.PHP';
$app->make(Kernel::class)->bootstrap();
return $app;
}
得出内存泄漏的结论,没有得到正确的清理.
$app = require __DIR__ . '/../bootstrap/app.PHP';
$app->make(Kernel::class)->bootstrap();
解决方法:
这是我发现的最简单,最可靠的解决方案.它没有my previous answer中描述的缺点.
更改< PHPunit>在PHPunit.xml文件中将processIsolation属性值标记为true.启动正确的PHPunit.xml文件的示例:
<?xml version="1.0" encoding="UTF-8"?>
<PHPunit backupGlobals="false"
backupStaticAttributes="false"
bootstrap="vendor/autoload.PHP"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="true"
stopOnFailure="false">
...
它是如何工作的:它使PHPUnit为每个测试启动一个新的PHP进程.在单独的进程中运行测试会强制PHP在测试结束后释放所有内存.它减慢了测试速度,但这是低内存消耗和可靠性的代价.
或者,如果需要在单独的进程中仅运行某些测试,则可以将@runTestsInSeparateProcesses
annotation添加到测试类的doc块:
/**
* @runTestsInSeparateProcesses
*/
class HeavyTest extends TestCase
{
// ...
}