Cal*_*dge 11 php memory phpunit
我遇到了一个有趣的问题.我正在使用PHPUnit,我的测试每次运行时都会占用更多内存.IE浏览器...
2.25 MB
2.5 MB
3.0 MB
3.5 MB .......
有谁知道如何清除正在消耗的内存,任何人都可以建议我深入探讨这个问题吗?当前的问题是我的一些较大的测试耗尽了内存,并且只是继续增加PHP中的最大内存分配还不够......我需要知道为什么从命令行运行的PHPUnit测试会有内存在运行之间"粘附"的用法.
edo*_*ian 25
内存增加有三到四个原因:
除了关闭代码覆盖率之外,你无能为力.
您可以<phpunit cacheTokens="false">在PHPUnit xml中使用.请参阅http://phpunit.de/manual/current/en/installation.html#installing.upgrading中有关此内容的说明
在其当前实现中,它保留了测试用例,因为存储结果数据的位置.在未来,这将被改变为更有效,但现在它是如何工作的.
由于TestCase实例保持不变,因此您的成员变量也会被保留.
意思是你可以通过使用来节省大量内存
public function tearDown() {
unset($this->whatever);
}
Run Code Online (Sandbox Code Playgroud)
但这样做非常乏味.
我的建议是为你的所有TestCase建立一个基础测试类并使用它:
class MyBaseTest extends \PHPUnit_Framework_TestCase {
protected function tearDown()
{
$refl = new \ReflectionObject($this);
foreach ($refl->getProperties() as $prop) {
if (!$prop->isStatic() && 0 !== strpos($prop->getDeclaringClass()->getName(), 'PHPUnit_')) {
$prop->setAccessible(true);
$prop->setValue($this, null);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这将以一种不错的自动方式清理完毕.
(该片段的道具请访问:http://kriswallsmith.net/post/18029585104/faster-phpunit)
PHPUnit不能以向后兼容的方式执行此操作,不会破坏人们的项目,因此您必须为自己添加它:)
小智 6
PHPUnit 垃圾收集背后的技术细节已经由 @edorian 和 @mauris 介绍,但我想补充一点,PHPUnit(至少在我正在运行的 3.7.21 版本中)使您能够添加注释:
/**
* @backupGlobals disabled
*/
class MyClassTests extends PHPUnit_Framework_TestCase{}
Run Code Online (Sandbox Code Playgroud)
在添加注释之前,我在每次运行测试套件时大约将内存使用量增加了一倍,最后一次运行时内存使用量约为 1100 MB。现在它们的运行速度为 15 MB。
根据聊天中的讨论,Calvin 是由于缺少重置功能.
在测试时,我们必须确保测试环境一致,以便我们能够获得准确的结果.计算是输入/输出,因此我们应该使用PHPUnit中的Fixtures重置存储以防止像这样的"内存泄漏".
| 归档时间: |
|
| 查看次数: |
8353 次 |
| 最近记录: |