talkinnl / dont-leak
安全清理所有自己的测试属性,防止PHPUnit内存泄漏
v1.0.1
2024-04-07 07:17 UTC
Requires
- php: >=8.2
- phpunit/phpunit: ^10.5.0 || ^11.0.0
README
已存档,不再需要。
此包不再需要,因为PHPUnit现在在运行期间会销毁TestCase实例。
- 初始PR由Sebastian 🔥完成,PR 5861,发布在PHPUnit 10.5.21 / 11.2.2。
- 最终PR由我 😎完成,PR 5875,发布在PHPUnit 10.5.23 / 11.2.4。
PHPUnit在整个运行期间都会保留所有测试实例在内存中。这会导致使用的内存持续增加,除非你在tearDown()期间清理所有属性。
毫无疑问,你最终会忘记这个繁琐的任务。
安装
composer require --dev talkinnl/dont-leak
使用方法
在你的测试类中,将此作为tearDown()的最后一行添加。
也许你希望总是使用一个公共的父类,这样你就永远不会忘记。
protected function tearDown(): void { // Start with some of your cleanups which are still needed. // Maybe removing files made during the test etc // Always call your parents; they might get worried. :) parent::tearDown(); // Unset any properties, prevent memory leaks. DontLeak::freeOwnProperties($this); }
它做了什么?
DontLeak::freeOwnProperites($object)
取消设置给定$object的自身作用域中可访问的所有属性,以及父对象的所有私有属性。
PHPUnit定义的属性将不会被修改。
下一步是什么
我真的希望这个包因为PHPUnit的改变而变得过时。
请阅读,也许可以投票 --> sebastianbergmann/phpunit#4705
致谢
Stack Overflow、Reddit、Github等网站上散布着许多使用反射来清理tearDown的建议。
实现受到了https://gist.github.com/malarzm/e8c6141b510708e52c8535d2a13cd613的启发,该实现取消设置而不是赋值null,并清除安全父对象的私有属性。