ergebnis / phpunit-slow-test-detector
为检测phpunit/phpunit中的慢速测试提供功能。
Requires
- php: ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0
- phpunit/phpunit: ^6.5.0 || ^7.5.0 || ^8.5.19 || ^9.0.0 || ^10.0.0 || ^11.0.0
Requires (Dev)
- ergebnis/composer-normalize: ^2.43.0
- ergebnis/license: ^2.4.0
- ergebnis/php-cs-fixer-config: ^6.36.0
- fakerphp/faker: ~1.20.0
- psalm/plugin-phpunit: ~0.19.0
- psr/container: ~1.0.0
- rector/rector: ^1.2.4
- vimeo/psalm: ^5.25.0
- dev-main
- 2.15.1
- 2.15.0
- 2.14.0
- 2.13.0
- 2.12.0
- 2.11.0
- 2.10.0
- 2.9.0
- 2.8.0
- 2.7.0
- 2.6.0
- 2.5.0
- 2.4.0
- 2.3.2
- 2.3.1
- 2.3.0
- 2.2.0
- 2.1.1
- 2.1.0
- 2.0.0
- 1.0.0
- dev-dependabot/composer/vimeo/psalm-5.26.1
- dev-dependabot/composer/vimeo/psalm-5.26.0
- dev-dependabot/composer/rector/rector-1.2.5
- dev-fix/maximum-duration
- dev-feature/seconds
This package is auto-updated.
Last update: 2024-09-10 12:15:34 UTC
README
本项目提供了一个composer
包和一个Phar存档,用于在phpunit/phpunit
中检测慢速测试。
该扩展与以下版本的phpunit/phpunit
兼容
phpunit/phpunit:^6.5.0
phpunit/phpunit:^7.5.0
phpunit/phpunit:^8.5.19
phpunit/phpunit:^9.0.0
phpunit/phpunit:^10.0.0
phpunit/phpunit:^11.0.0
安装
使用composer
进行安装
运行
composer require --dev ergebnis/phpunit-slow-test-detector
以安装ergebnis/phpunit-slow-test-detector
作为composer
包。
作为Phar安装
从最新版本下载phpunit-slow-test-detector.phar
。
使用方法
初始化扩展
在扩展能够检测phpunit/phpunit
中的慢速测试之前,您需要初始化它。初始化机制取决于您使用的phpunit/phpunit
版本。
作为composer包初始化扩展
当使用
phpunit/phpunit:^6.5.0
调整您的phpunit.xml
配置文件并配置
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd" bootstrap="vendor/autoload.php" > + <listeners> + <listener class="Ergebnis\PHPUnit\SlowTestDetector\Extension"/> + </listeners> <testsuites> <testsuite name="unit"> <directory>test/Unit/</directory> </testsuite> </testsuites> </phpunit>
当使用
phpunit/phpunit:^7.5.0
phpunit/phpunit:^8.5.19
phpunit/phpunit:^9.0.0
调整您的phpunit.xml
配置文件并配置
extensions
元素在phpunit/phpunit:^7.5.0
extensions
元素在phpunit/phpunit:^8.5.19
extensions
元素在phpunit/phpunit:^9.0.0
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd" bootstrap="vendor/autoload.php" > + <extensions> + <extension class="Ergebnis\PHPUnit\SlowTestDetector\Extension"/> + </extensions> <testsuites> <testsuite name="unit"> <directory>test/Unit/</directory> </testsuite> </testsuites> </phpunit>
当使用
phpunit/phpunit:^10.0.0
phpunit/phpunit:^11.0.0
调整您的phpunit.xml
配置文件并配置
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd" bootstrap="vendor/autoload.php" > + <extensions> + <bootstrap class="Ergebnis\PHPUnit\SlowTestDetector\Extension"/> + </extensions> <testsuites> <testsuite name="unit"> <directory>test/Unit/</directory> </testsuite> </testsuites> </phpunit>
作为Phar初始化扩展
当使用
phpunit/phpunit:^7.5.0
phpunit/phpunit:^8.5.19
phpunit/phpunit:^9.0.0
调整您的phpunit.xml
配置文件并配置
extensionsDirectory
属性和extensions
元素在phpunit/phpunit:^7.5.0
extensionsDirectory
属性和extensions
元素在phpunit/phpunit:^8.5.19
extensionsDirectory
属性和extensions
元素在phpunit/phpunit:^9.0.0
上
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd" bootstrap="vendor/autoload.php" + extensionsDirectory="directory/where/you/saved/the/extension/phars" > + <extensions> + <bootstrap class="Ergebnis\PHPUnit\SlowTestDetector\Extension"/> + </extensions> <testsuites> <testsuite name="unit"> <directory>test/Unit/</directory> </testsuite> </testsuites> </phpunit>
当使用
phpunit/phpunit:^10.0.0
phpunit/phpunit:^11.0.0
调整您的phpunit.xml
配置文件并配置
extensionsDirectory
属性和extensions
元素在phpunit/phpunit:^10.0.0
上extensionsDirectory
属性和extensions
元素在phpunit/phpunit:^11.0.0
上
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd" bootstrap="vendor/autoload.php" + extensionsDirectory="directory/where/you/saved/the/extension/phars" > + <extensions> + <extension class="Ergebnis\PHPUnit\SlowTestDetector\Extension"/> + </extensions> <testsuites> <testsuite name="unit"> <directory>test/Unit/</directory> </testsuite> </testsuites> </phpunit>
配置扩展
您可以在您的phpunit.xml
配置文件中使用以下选项来配置扩展
maximum-count
,一个int
,应该报告的慢速测试的最大数量,默认为10
maximum-duration
,一个int
,在扩展将其视为慢速测试之前,测试的最大持续时间(以毫秒为单位),默认为500
配置机制取决于您使用的phpunit/phpunit
版本。
配置扩展
当使用时配置扩展
phpunit/phpunit:^6.5.0
调整您的phpunit.xml
配置文件并配置
以下示例配置了慢速测试的最大数量为三个,所有测试的最大持续时间为250毫秒
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd" bootstrap="vendor/autoload.php" > <listeners> - <listener class="Ergebnis\PHPUnit\SlowTestDetector\Extension"/> + <listener class="Ergebnis\PHPUnit\SlowTestDetector\Extension"> + <arguments> + <array> + <element key="maximum-count"> + <integer>3</integer> + </element> + <element key="maximum-duration"> + <integer>250</integer> + </element> + </array> + </arguments> + </listener> </listeners> <testsuites> <testsuite name="unit"> <directory>test/Unit/</directory> </testsuite> </testsuites> </phpunit>
当使用时配置扩展
phpunit/phpunit:^7.5.0
phpunit/phpunit:^8.5.19
phpunit/phpunit:^9.0.0
调整您的phpunit.xml
配置文件并配置
arguments
元素在phpunit/phpunit:^7.5.0
arguments
元素在phpunit/phpunit:^8.5.19
arguments
元素在phpunit/phpunit:^9.0.0
以下示例配置了慢速测试的最大数量为三个,所有测试的最大持续时间为250毫秒
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd" bootstrap="vendor/autoload.php" > <extensions> - <extension class="Ergebnis\PHPUnit\SlowTestDetector\Extension"/> + <extension class="Ergebnis\PHPUnit\SlowTestDetector\Extension"> + <arguments> + <array> + <element key="maximum-count"> + <integer>3</integer> + </element> + <element key="maximum-duration"> + <integer>250</integer> + </element> + </array> + </arguments> + </extension> </extensions> <testsuites> <testsuite name="unit"> <directory>test/Unit/</directory> </testsuite> </testsuites> </phpunit>
当使用时配置扩展
phpunit/phpunit:^10.0.0
phpunit/phpunit:^11.0.0
调整您的phpunit.xml
配置文件并配置一个或多个
以下示例配置了慢速测试的最大数量为三个,所有测试的最大持续时间为250毫秒
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd" bootstrap="vendor/autoload.php" > <extensions> - <bootstrap class="Ergebnis\PHPUnit\SlowTestDetector\Extension"/> + <bootstrap class="Ergebnis\PHPUnit\SlowTestDetector\Extension"> + <parameter name="maximum-count" value="3"/> + <parameter name="maximum-duration" value="250"/> + </bootstrap> </extensions> <testsuites> <testsuite name="unit"> <directory>test/Unit/</directory> </testsuite> </testsuites> </phpunit>
配置每个测试用例的最大持续时间
您可以使用以下方式配置单个测试用例的最大持续时间
- 使用
Attribute\MaximumDuration
属性,当使用时phpunit/phpunit:^10.0.0
phpunit/phpunit:^11.0.0
- 在DocBlock中使用
@maximumDuration
注释,当使用时phpunit/phpunit:^6.5.0
phpunit/phpunit:^7.5.0
phpunit/phpunit:^8.5.19
phpunit/phpunit:^9.0.0
- 在DocBlock中使用
@slowThreshold
注释,当使用时phpunit/phpunit:^6.5.0
phpunit/phpunit:^7.5.0
phpunit/phpunit:^8.5.19
phpunit/phpunit:^9.0.0
以下示例配置单个测试用例的最大持续时间为5.000 ms、4.000 ms和3.000 ms
<?php declare(strict_types=1); use PHPUnit\Framework; use Ergebnis\PHPUnit\SlowTestDetector; final class ExtraSlowTest extends Framework\TestCase { /** */ #[SlowTestDetector\Attribute\MaximumDuration(5000)] public function testExtraExtraSlow(): void { // ... } /** * @maximumDuration 4000 */ public function testAlsoQuiteSlow(): void { // ... } /** * @slowThreshold 3000 */ public function testQuiteSlow(): void { // ... } }
注意
@slowThreshold
注释的支持仅用于帮助您从johnkary/phpunit-speedtrap
迁移。它将很快被弃用并删除。
运行测试
当您已初始化扩展时,您可以像通常一样运行您的测试
vendor/bin/phpunit
当扩展检测到慢速测试时,它将报告它们
PHPUnit 10.0.0 by Sebastian Bergmann and contributors. Runtime: PHP 8.1.0 Configuration: test/EndToEnd/Default/phpunit.xml Random Seed: 1676103726 ............. 13 / 13 (100%) Detected 11 tests where the duration exceeded the maximum duration. 1. 1.604 (0.500) Ergebnis\PHPUnit\SlowTestDetector\Test\EndToEnd\Default\SleeperTest::testSleeperSleepsLongerThanDefaultMaximumDurationWithDataProvider#9 2. 1.505 (0.500) Ergebnis\PHPUnit\SlowTestDetector\Test\EndToEnd\Default\SleeperTest::testSleeperSleepsLongerThanDefaultMaximumDurationWithDataProvider#8 3. 1.403 (0.500) Ergebnis\PHPUnit\SlowTestDetector\Test\EndToEnd\Default\SleeperTest::testSleeperSleepsLongerThanDefaultMaximumDurationWithDataProvider#7 4. 1.303 (0.500) Ergebnis\PHPUnit\SlowTestDetector\Test\EndToEnd\Default\SleeperTest::testSleeperSleepsLongerThanDefaultMaximumDurationWithDataProvider#6 5. 1.205 (0.500) Ergebnis\PHPUnit\SlowTestDetector\Test\EndToEnd\Default\SleeperTest::testSleeperSleepsLongerThanDefaultMaximumDurationWithDataProvider#5 6. 1.103 (0.500) Ergebnis\PHPUnit\SlowTestDetector\Test\EndToEnd\Default\SleeperTest::testSleeperSleepsLongerThanDefaultMaximumDurationWithDataProvider#4 7. 1.005 (0.500) Ergebnis\PHPUnit\SlowTestDetector\Test\EndToEnd\Default\SleeperTest::testSleeperSleepsLongerThanDefaultMaximumDurationWithDataProvider#3 8. 0.905 (0.500) Ergebnis\PHPUnit\SlowTestDetector\Test\EndToEnd\Default\SleeperTest::testSleeperSleepsLongerThanDefaultMaximumDurationWithDataProvider#2 9. 0.805 (0.500) Ergebnis\PHPUnit\SlowTestDetector\Test\EndToEnd\Default\SleeperTest::testSleeperSleepsLongerThanDefaultMaximumDurationWithDataProvider#1 10. 0.705 (0.500) Ergebnis\PHPUnit\SlowTestDetector\Test\EndToEnd\Default\SleeperTest::testSleeperSleepsLongerThanDefaultMaximumDurationWithDataProvider#0 There is 1 additional slow test that is not listed here. Time: 00:12.601, Memory: 8.00 MB OK (13 tests, 13 assertions)
理解测量的测试持续时间
当使用时
-
phpunit/phpunit:^6.5.0
-
phpunit/phpunit:^7.5.0
-
phpunit/phpunit:^8.5.19
-
phpunit/phpunit:^9.0.0
-
扩展使用
phpunit/phpunit
的钩子事件系统。
钩子事件系统支持11个钩子方法,这些方法在执行测试时由phpunit/phpunit
调用。
当扩展使用钩子事件系统时,它使用PHPUnit\Runner\AfterTestHook
,该钩子接收调用PHPUnit\Framework\TestCase::runBare()
的持续时间以及更多信息。
当phpunit/phpunit
调用PHPUnit\Framework\TestCase::runBare()
时,它将在类的第一个测试方法之前调用以下方法
当phpunit/phpunit
调用PHPUnit\Framework\TestCase::runBare()
时,它将在类的每个测试方法之前调用以下方法
PHPUnit\Framework\TestCase::setUp()
和带有@before
注解的方法PHPUnit\Framework\TestCase::assertPreConditions()
当phpunit/phpunit
调用PHPUnit\Framework\TestCase::runBare()
时,它将在类的每个测试方法之后调用以下方法
PHPUnit\Framework\TestCase::assertPostConditions()
PHPUnit\Framework\TestCase::tearDown()
和带有@after
注解的方法
当phpunit/phpunit
调用PHPUnit\Framework\TestCase::runBare()
时,它将在类的最后一个测试方法之后调用以下方法
注意
由于这种行为,测量的测试持续时间会根据phpunit/phpunit
执行测试的顺序而变化。
当使用时
phpunit/phpunit:^10.0.0
phpunit/phpunit:^11.0.0
该扩展使用phpunit/phpunit
的新事件系统。
新的事件系统支持phpunit/phpunit
在测试执行期间发出的广泛事件。
当扩展使用新的事件系统时,它使用并订阅了PHPUnit\Event\Test\PreparationStarted
和PHPUnit\Event\Test\Finished
事件,并测量phpunit/phpunit
发出前者和后者的时间点之间的持续时间。
当phpunit/phpunit
调用PHPUnit\Framework\TestCase::runBare()
时,它将在类的第一个测试方法之前调用以下方法
当phpunit/phpunit
调用PHPUnit\Framework\TestCase::runBare()
时,它将在类的每个测试方法之前调用以下方法
PHPUnit\Framework\TestCase::setUp()
和带有@before
注解的方法PHPUnit\Framework\TestCase::assertPreConditions()
当phpunit/phpunit
调用PHPUnit\Framework\TestCase::runBare()
时,它将在类的每个测试方法之后调用以下方法
PHPUnit\Framework\TestCase::assertPostConditions()
PHPUnit\Framework\TestCase::tearDown()
和带有@after
注解的方法
当phpunit/phpunit
调用PHPUnit\Framework\TestCase::runBare()
时,它将在类的最后一个测试方法之后调用以下方法
注意
由于这种行为,测量的测试持续时间会根据phpunit/phpunit
执行测试的顺序而变化。
更新日志
本项目维护者将在更新日志中记录对项目的重大更改。
贡献
本项目维护者建议遵循贡献指南。
行为准则
本项目维护者要求贡献者遵守行为准则。
一般支持策略
本项目维护者提供有限的支持。
您可以通过赞助 @localheinz或请求与本项目的服务相关的发票来支持本项目的维护。
PHP版本支持策略
本项目支持具有活跃和安全支持的PHP版本。
本项目维护者在其初始发布后添加对PHP版本的支持,并在其达到安全支持结束时停止对该PHP版本的支持。
安全策略
本项目有一个安全策略。
许可证
本项目使用MIT许可证。
致谢
此包受到johnkary/phpunit-speedtrap
的启发,该包最初由John Kary以MIT许可证发布。
社交
关注Twitter上的@localheinz和@ergebnis。