ergebnis/phpunit-slow-test-detector

为检测phpunit/phpunit中的慢速测试提供功能。

2.15.1 2024-09-05 08:34 UTC

README

Integrate Merge Release Renew

Code Coverage Type Coverage

Latest Stable Version Total Downloads Monthly Downloads

本项目提供了一个composer包和一个Phar存档,用于在phpunit/phpunit中检测慢速测试。

该扩展与以下版本的phpunit/phpunit兼容

安装

使用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配置文件并配置

 <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配置文件并配置

 <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配置文件并配置

 <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配置文件并配置

以下示例配置了慢速测试的最大数量为三个,所有测试的最大持续时间为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/phpunit调用PHPUnit\Framework\TestCase::runBare()时,它将在类的每个测试方法之后调用以下方法

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\PreparationStartedPHPUnit\Event\Test\Finished事件,并测量phpunit/phpunit发出前者和后者的时间点之间的持续时间。

phpunit/phpunit调用PHPUnit\Framework\TestCase::runBare()时,它将在类的第一个测试方法之前调用以下方法

phpunit/phpunit调用PHPUnit\Framework\TestCase::runBare()时,它将在类的每个测试方法之前调用以下方法

phpunit/phpunit调用PHPUnit\Framework\TestCase::runBare()时,它将在类的每个测试方法之后调用以下方法

phpunit/phpunit调用PHPUnit\Framework\TestCase::runBare()时,它将在类的最后一个测试方法之后调用以下方法

注意

由于这种行为,测量的测试持续时间会根据phpunit/phpunit执行测试的顺序而变化。

更新日志

本项目维护者将在更新日志中记录对项目的重大更改。

贡献

本项目维护者建议遵循贡献指南

行为准则

本项目维护者要求贡献者遵守行为准则

一般支持策略

本项目维护者提供有限的支持。

您可以通过赞助 @localheinz请求与本项目的服务相关的发票来支持本项目的维护。

PHP版本支持策略

本项目支持具有活跃和安全支持的PHP版本。

本项目维护者在其初始发布后添加对PHP版本的支持,并在其达到安全支持结束时停止对该PHP版本的支持。

安全策略

本项目有一个安全策略

许可证

本项目使用MIT许可证

致谢

此包受到johnkary/phpunit-speedtrap的启发,该包最初由John Kary以MIT许可证发布。

社交

关注Twitter上的@localheinz@ergebnis