PhpUnit 随机卡住 60 秒
Posted
技术标签:
【中文标题】PhpUnit 随机卡住 60 秒【英文标题】:PhpUnit getting randomly stuck for 60 seconds 【发布时间】:2019-10-16 09:39:34 【问题描述】:有一个带有测试套件的 Laravel 应用程序可以在大约 3 分钟内完全运行。
大约 2 分钟后,测试冻结了约 60094 毫秒。每次都是不同的测试,所以它似乎与任何特定的测试无关。
没有一个测试失败,他们只是经历了这种奇怪的延迟。 什么可能导致 phpUnit 延迟 60 秒?
You should really fix these slow tests (>200ms)...
1. 60094ms to run Tests\Feature\Superadmin\BusinessActivityTest:testDestroyBusinessActivityProductionProcess
2. 3357ms to run Tests\Feature\AccessTokenTest:testOauthToken
3. 1124ms to run Tests\Feature\Superadmin\ArticleTest:testUpdateArticleForAdmin
4. 969ms to run Tests\Feature\VtaDocumentTest:testUploadVehiclesFileHappyPathWithFilePDF
5. 737ms to run Tests\Feature\VtaDocumentTest:testUploadCertificateFilePDF
...and there are 22 more above your threshold hidden from view
Time: 2.46 minutes, Memory: 144.25MB
操作系统 phpunit 版本 phpunit -v Sebastian Bergmann 和贡献者的 PHPUnit 7.3.0。 运行时:PHP 7.3.5-1+ubuntu18.04.1+deb.sury.org+1 和 Xdebug 2.7.1
问题也存在 供应商/bin/phpunit --version Sebastian Bergmann 和贡献者的 PHPUnit 7.5.2。
<?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="false"
stopOnFailure="false">
<testsuites>
<testsuite name="Feature">
<directory suffix="Test.php">./tests/Feature</directory>
</testsuite>
<testsuite name="Unit">
<directory suffix="Test.php">./tests/Unit</directory>
</testsuite>
</testsuites>
<filter>
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">./app</directory>
</whitelist>
</filter>
<php>
<env name="APP_ENV" value="testing"/>
<env name="DB_DATABASE" value="testing"/>
<env name="BCRYPT_ROUNDS" value="4"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/>
<env name="MAIL_DRIVER" value="array"/>
</php>
<listeners>
<listener class="JohnKary\PHPUnit\Listener\SpeedTrapListener">
<arguments>
<array>
<element key="slowThreshold">
<integer>200</integer>
</element>
<element key="reportLength">
<integer>5</integer>
</element>
</array>
</arguments>
</listener>
</listeners>
</phpunit>
【问题讨论】:
有任何代码可以链接到吗?还是我真的对您在这里问的内容感到困惑? 添加了样本测试结果。每次运行 60000+ 毫秒的测试都是不同的。测试需要很长时间在时间上或多或少相同的位置。 您使用的是哪个 Phpunit 版本,您是否为 Phpuni 测试套件使用了任何其他扩展? 添加了 phpunit 版本和配置。删除 SpeedTrapListener 并不能避免 60 秒的等待。 您是否尝试过打开/跟踪您的 test.log 以查看是否可以在其中找到任何有用的信息? 【参考方案1】:关闭互联网可避免此问题。
在Print PHP Call Stack的帮助下调试并获取卡住进程的堆栈跟踪后发现线程卡在了MixPanel代码中。
[New LWP 2893]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
0x00007f04c2136bf9 in poll () from /lib/x86_64-linux-gnu/libc.so.6
main@/usr/local/bin/phpunit:0
main@/usr/local/bin/phpunit:594
run@phar:///usr/local/bin/phpunit/phpunit/TextUI/Command.php:159
doRun@phar:///usr/local/bin/phpunit/phpunit/TextUI/Command.php:203
run@phar:///usr/local/bin/phpunit/phpunit/TextUI/TestRunner.php:587
run@phar:///usr/local/bin/phpunit/phpunit/Framework/TestSuite.php:750
run@phar:///usr/local/bin/phpunit/phpunit/Framework/TestSuite.php:750
run@phar:///usr/local/bin/phpunit/phpunit/Framework/TestSuite.php:750
run@phar:///usr/local/bin/phpunit/phpunit/Framework/TestCase.php:798
runBare@phar:///usr/local/bin/phpunit/phpunit/Framework/TestResult.php:665
tearDown@phar:///usr/local/bin/phpunit/phpunit/Framework/TestCase.php:887
flush@/app/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php:142
flush@/app/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:1152
__destruct@/app/vendor/laravel/framework/src/Illuminate/Container/Container.php:1174
flush@/app/vendor/mixpanel/mixpanel-php/lib/Producers/MixpanelBaseProducer.php:96
_persist@/app/vendor/mixpanel/mixpanel-php/lib/Producers/MixpanelBaseProducer.php:117
persist@/app/vendor/mixpanel/mixpanel-php/lib/Producers/MixpanelBaseProducer.php:217
_write@/app/vendor/mixpanel/mixpanel-php/lib/ConsumerStrategies/SocketConsumer.php:122
fwrite@/app/vendor/mixpanel/mixpanel-php/lib/ConsumerStrategies/SocketConsumer.php:210
此外,在 MixPanel 中创建新用户的事件导致该事件被发送。
现在测试已与 MixPanel 正确分离,不再出现突然延迟。
【讨论】:
以上是关于PhpUnit 随机卡住 60 秒的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 phpunit 测试 JsonArray 中的随机值
如何加快 PHPUnit + DBUnit 测试套件的执行速度?