• Stars
    star
    115
  • Rank 305,916 (Top 7 %)
  • Language
    PHP
  • License
    MIT License
  • Created almost 4 years ago
  • Updated about 1 month ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

⏱️ Provides a composer package with an extension for detecting slow tests in phpunit/phpunit.

phpunit-slow-test-detector

Integrate Merge Release Renew

Code Coverage Type Coverage

Latest Stable Version Total Downloads Monthly Downloads

This project provides a composer package and a Phar archive with an extension for detecting slow tests in phpunit/phpunit.

The extension is compatible with the following versions of phpunit/phpunit:

Installation

Installation with composer

Run

composer require --dev ergebnis/phpunit-slow-test-detector

to install ergebnis/phpunit-slow-test-detector as a composer package.

Installation as Phar

Download phpunit-slow-test-detector.phar from the latest release.

Usage

Bootstrapping the extension

Before the extension can detect slow tests in phpunit/phpunit, you need to bootstrap it. The bootstrapping mechanism depends on the version of phpunit/phpunit you are using.

Bootstrapping the extension as a composer package

To bootstrap the extension as a composer package when using

  • phpunit/phpunit:^6.5.0

adjust your phpunit.xml configuration file and configure the

 <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>

To bootstrap the extension as a composer package when using

  • phpunit/phpunit:^7.5.0
  • phpunit/phpunit:^8.5.19
  • phpunit/phpunit:^9.0.0

adjust your phpunit.xml configuration file and configure the

 <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>

To bootstrap the extension as a composer package when using

  • phpunit/phpunit:^10.0.0
  • phpunit/phpunit:^11.0.0

adjust your phpunit.xml configuration file and configure the

 <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>

Bootstrapping the extension as a PHAR

To bootstrap the extension as a PHAR when using

  • phpunit/phpunit:^7.5.0
  • phpunit/phpunit:^8.5.19
  • phpunit/phpunit:^9.0.0

adjust your phpunit.xml configuration file and configure the

 <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>

To bootstrap the extension as a PHAR when using

  • phpunit/phpunit:^10.0.0
  • phpunit/phpunit:^11.0.0

adjust your phpunit.xml configuration file and configure the

 <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>

Configuring the extension

You can configure the extension with the following options in your phpunit.xml configuration file:

  • maximum-count, an int, the maximum count of slow test that should be reported, defaults to 10
  • maximum-duration, an int, the maximum duration in milliseconds for a test before the extension considers it as a slow test, defaults to 500

The configuration mechanism depends on the version of phpunit/phpunit you are using.

Configuring the extension

To configure the extension when using

  • phpunit/phpunit:^6.5.0

adjust your phpunit.xml configuration file and configure the

The following example configures the maximum count of slow tests to three, and the maximum duration for all tests to 250 milliseconds:

 <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>

To configure the extension when using

  • phpunit/phpunit:^7.5.0
  • phpunit/phpunit:^8.5.19
  • phpunit/phpunit:^9.0.0

adjust your phpunit.xml configuration file and configure the

The following example configures the maximum count of slow tests to three, and the maximum duration for all tests to 250 milliseconds:

 <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>

To configure the extension when using

  • phpunit/phpunit:^10.0.0
  • phpunit/phpunit:^11.0.0

adjust your phpunit.xml configuration file and configure one or more

The following example configures the maximum count of slow tests to three, and the maximum duration for all tests to 250 milliseconds:

 <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>

Configuring the maximum duration per test case

You can configure the maximum duration for a single test case with

  • an Attribute\MaximumDuration attribute when using
    • phpunit/phpunit:^10.0.0
    • phpunit/phpunit:^11.0.0
  • a @maximumDuration annotation in the DocBlock when using
    • phpunit/phpunit:^6.5.0
    • phpunit/phpunit:^7.5.0
    • phpunit/phpunit:^8.5.19
    • phpunit/phpunit:^9.0.0
  • a @slowThreshold annotation in the DocBlock when using
    • phpunit/phpunit:^6.5.0
    • phpunit/phpunit:^7.5.0
    • phpunit/phpunit:^8.5.19
    • phpunit/phpunit:^9.0.0

The following example configures the maximum durations for single test cases to 5.000 ms, 4.000 ms, and 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
    {
        // ...
    }
}

Note

Support for the @slowThreshold annotation exists only to help you move from johnkary/phpunit-speedtrap. It will be deprecated and removed in the near future.

Running tests

When you have bootstrapped the extension, you can run your tests as usually:

vendor/bin/phpunit

When the extension has detected slow tests, it will report them:

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)

Understanding measured test durations

When using

  • phpunit/phpunit:^6.5.0

  • phpunit/phpunit:^7.5.0

  • phpunit/phpunit:^8.5.19

  • phpunit/phpunit:^9.0.0

  • the extension uses the hooks event system of phpunit/phpunit.

The hooks event system supports eleven hook methods that phpunit/phpunit invokes during the execution of tests.

When the extension uses the hooks event system, it uses the PHPUnit\Runner\AfterTestHook, which receives the duration of invoking PHPUnit\Framework\TestCase::runBare() and more.

When phpunit/phpunit invokes PHPUnit\Framework\TestCase::runBare(), it will invoke the following methods before the first test method in the class:

When phpunit/phpunit invokes PHPUnit\Framework\TestCase::runBare(), it will invoke the following methods before every test method in the class:

When phpunit/phpunit invokes PHPUnit\Framework\TestCase::runBare(), it will invoke the following methods after every test method in the class:

When phpunit/phpunit invokes PHPUnit\Framework\TestCase::runBare(), it will invoke the following methods after the last test method in the class:

Note

Because of this behavior, the measured test durations can and will vary depending on the order in which phpunit/phpunit executes tests.

When using

  • phpunit/phpunit:^10.0.0
  • phpunit/phpunit:^11.0.0

the extension uses the new event system of phpunit/phpunit.

The new event system supports a wide range of events that phpunit/phpunit emits during the execution of tests.

When the extension uses the new event system, it uses and subscribes to the PHPUnit\Event\Test\PreparationStarted and PHPUnit\Event\Test\Finished events and measures the duration between the points in time when phpunit/phpunit emits the former and the latter.

When phpunit/phpunit invokes PHPUnit\Framework\TestCase::runBare(), it will invoke the following methods before the first test method in the class:

When phpunit/phpunit invokes PHPUnit\Framework\TestCase::runBare(), it will invoke the following methods before every test method in the class:

When phpunit/phpunit invokes PHPUnit\Framework\TestCase::runBare(), it will invoke the following methods after every test method in the class:

When phpunit/phpunit invokes PHPUnit\Framework\TestCase::runBare(), it will invoke the following methods after the last test method in the class:

Note

Because of this behavior, the measured test durations can and will vary depending on the order in which phpunit/phpunit executes tests.

Changelog

The maintainers of this project record notable changes to this project in a changelog.

Contributing

The maintainers of this project suggest following the contribution guide.

Code of Conduct

The maintainers of this project ask contributors to follow the code of conduct.

General Support Policy

The maintainers of this project provide limited support.

You can support the maintenance of this project by sponsoring @localheinz or requesting an invoice for services related to this project.

PHP Version Support Policy

This project supports PHP versions with active and security support.

The maintainers of this project add support for a PHP version following its initial release and drop support for a PHP version when it has reached the end of security support.

Security Policy

This project has a security policy.

License

This project uses the MIT license.

Credits

This package is inspired by johnkary/phpunit-speedtrap, originally licensed under MIT by John Kary.

Social

Follow @localheinz and @ergebnis on Twitter.

More Repositories

1

composer-normalize

🎵 Provides a composer plugin for normalizing composer.json.
PHP
1,035
star
2

phpstan-rules

👓 Provides a composer package with rules for phpstan/phpstan.
PHP
345
star
3

php-package-template

:octocat: + 📒 Provides a GitHub repository template for a composer package with GitHub Actions workflows using standard PHP development tools.
PHP
303
star
4

http-method

📟 Provides a composer package with constants for HTTP request methods.
PHP
92
star
5

json-printer

📃 Provides a composer package with a JSON printer, allowing for flexible indentation.
PHP
86
star
6

factory-bot

🤖 Provides a composer package with a fixture factory for doctrine/orm entities.
PHP
78
star
7

json-normalizer

📃 Provides a composer package with generic and vendor-specific normalizers for normalizing JSON documents.
PHP
76
star
8

php-cs-fixer-config

📓 Provides a composer package with a configuration factory and rule set factories for friendsofphp/php-cs-fixer.
PHP
68
star
9

github-changelog

:octocat: Provides a command line tool that generates a changelog based on titles of pull requests merged between specified references.
PHP
47
star
10

environment-variables

🌳 Provides a composer package with an abstraction of environment variables.
PHP
39
star
11

classy

🔍 Provides a composer package with a finder for classy constructs (classes, enums, interfaces, and traits).
PHP
33
star
12

clock

⏰ Provides a composer package with abstractions of a clock.
PHP
30
star
13

json-schema-validator

📃 Provides a composer package with a JSON schema validator, building on top of justinrainbow/json-schema.
PHP
30
star
14

data-provider

👓 Provides a composer package with generic data providers for use with phpunit/phpunit.
PHP
27
star
15

composer-normalize-action

:octocat: + 🎵 Provides a GitHub action for running ergebnis/composer-normalize.
Makefile
26
star
16

composer-json-normalizer

🎵 Provides normalizers for normalizing composer.json.
PHP
20
star
17

json

📃 Provides a composer package with a Json value object for representing a valid JSON string.
PHP
20
star
18

.github

❤️ Provides default community health files and composite actions for the @ergebnis organization.
Shell
18
star
19

version

💾 Provides a composer package with an abstraction of a semantic version.
PHP
17
star
20

symfony-application-template

:octocat: + 🎼 Provides a GitHub template repository for a Symfony application, using GitHub Actions.
PHP
16
star
21

test-util

👓 Provides utilities for tests.
PHP
15
star
22

json-pointer

📃 Provides a composer package with an abstraction of a JSON pointer.
PHP
15
star
23

license

💼 Provides a composer package with an abstraction of an open-source license.
PHP
14
star
24

php-cs-fixer-config-template

:octocat: + 📓 Provides a GitHub repository template for a configuration factory and rule set factories for friendsofphp/php-cs-fixer.
PHP
11
star
25

composer-root-version-action

:octocat: + 🎵 Provides a GitHub Action that sets a COMPOSER_ROOT_VERSION environment variable from the value of the branch alias defined in composer.json.
Shell
10
star
26

factory-girl-definition

👧 Provides an interface for, and an easy way to find and register entity definitions for breerly/factory-girl-php.
PHP
9
star
27

day-one-to-obsidian-converter

📓 Provides a composer package with a console command for converting DayOne journals to Obsidian notes.
PHP
8
star
28

rector-rules

👓 Provides a composer package with rules for rector/rector.
PHP
6
star
29

keep-a-changelog

📓 Provides a composer package with tools for keeping a changelog.
PHP
5
star
30

front-matter

👀 Provides a composer package with a front-matter parser.
PHP
4
star
31

factory-bot-example

🤖 + 📔 Provides usage examples for ergebnis/factory-bot.
PHP
4
star
32

phpunit-framework-constraint

👓 Provides additional constraints and assertions for phpunit/phpunit
PHP
4
star
33

laravel-application-template

:octocat: + 📒 Provides a GitHub repository template for a Laravel application, using GitHub Actions.
PHP
3
star
34

json-normalize

📃 Provides a composer package with a console command for normalizing JSON documents.
PHP
3
star
35

faker-provider

🐙 Provides additional providers for fzaninotto/faker.
PHP
3
star
36

twig-front-matter

🌱 + 👀 Provides a composer package with a Twig loader for files with YAML front-matter.
PHP
2
star
37

playground

🏀 A playground.
PHP
2
star
38

rector-config-template

👓 Provides a GitHub repository template for a composer package with a configuration factory and custom rule sets for rector/rector.
PHP
2
star
39

factory-muffin-definition

👧 Provides an interface for, and an easy way to find and register entity definitions for league/factory-muffin.
PHP
2
star
40

version-constraint

🎚️ Provides a composer package with abstractions of version constraints.
PHP
1
star
41

data-generator

🗄 Provides a composer package with data generators.
PHP
1
star