live627/phpunit-garbage-collector

在每个测试后重置属性以节省内存

1.0.0 2022-11-15 23:04 UTC

This package is auto-updated.

Last update: 2024-09-16 08:33:48 UTC


README

Tests Scrutinizer Code Quality Code Coverage

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>