live627 / phpunit-garbage-collector
在每个测试后重置属性以节省内存
Requires
- php: >=7.4
- phpunit/phpunit: >=8.0
Requires (Dev)
- scrutinizer/ocular: ^1.9
This package is auto-updated.
Last update: 2024-09-16 08:33:48 UTC
README
PHPUnit看起来浪费了很多内存,因为它在开始任何测试之前实例化了大量的对象,这意味着初始内存使用量取决于可用的测试数量。
比如说,你有一个包含1k测试方法的UserTest
。不幸的是,在运行任何测试之前,这将导致1k个UserTest类实例。这实际上是按照设计来的。为了确定测试数量,PHPUnit在运行测试(以及setUp方法)之前会运行@dataProvider
方法。
问题在于一旦测试用例中的所有测试都完成了。由于对象在内存中没有被解引用,它们看起来比实际更近。幸运的是,这个问题已经引起了关注。[链接](https://github.com/sebastianbergmann/phpunit/issues/4705)
受[Kris Wallsmith的更快PHPUnit文章](http://kriswallsmith.net/post/18029585104/faster-phpunit)的启发。这个测试监听器通过释放内存来加速PHPUnit测试约20%的说法值得怀疑,并且现在PHP 7已经重写了zval
以使其更加紧凑,可能已经过时了。[链接](https://www.npopov.com/2015/06/19/Internal-value-representation-in-PHP-7-part-2.html)
安装
要安装这个库,运行以下命令,你将获得最新版本
composer require live627/phpunit-garbage-collector --dev
用法
只需将其添加到您的phpunit.xml
配置文件中
<phpunit> <listeners> <listener class="\live627\PHPUnitGarbageCollector\MemoryGuard"/> </listeners> </phpunit>
忽略测试
有时有必要忽略特定的测试,在这些测试中,释放它们的属性是不希望的。为此,您可以通过实现IgnoreTestPolicy
接口来扩展监听器的行为。
例如,如果我们假设想忽略所有包含"Legacy"的测试文件名的测试,我们可以创建一个自定义的忽略策略,如下所示
<?php use live627\PHPUnitGarbageCollector\IgnoreTestPolicy; class IgnoreLegacyTestPolicy implements IgnoreTestPolicy { public function shouldIgnore(\ReflectionObject $testReflection): bool { return strpos($testReflection->getFileName(), 'Legacy') !== false; } }
并将它传递给phpunit.xml
配置中的测试监听器构造函数
<phpunit> <listeners> <listener class="\live627\PHPUnitGarbageCollector\MemoryGuard"> <arguments> <object class="\IgnoreLegacyTestPolicy"/> </arguments> </listener> </listeners> </phpunit>