Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/teqneers/phpunit-stopwatch

A stopwatch extension for phpunit. Get timing for parts of your code to detect performance bottlenecks.
https://github.com/teqneers/phpunit-stopwatch

bottleneck extension measure performance phpunit slow stopwatch test time

Last synced: 24 days ago
JSON representation

A stopwatch extension for phpunit. Get timing for parts of your code to detect performance bottlenecks.

Awesome Lists containing this project

README

        

# phpunit-stopwatch

[![Latest Stable Version](https://poser.pugx.org/teqneers/phpunit-stopwatch/v)](https://packagist.org/packages/teqneers/phpunit-stopwatch)
[![CI](https://github.com/teqneers/phpunit-stopwatch/actions/workflows/ci.yml/badge.svg)](https://github.com/teqneers/phpunit-stopwatch/actions)

[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/teqneers/phpunit-stopwatch/badges/quality-score.png?b=main)](https://scrutinizer-ci.com/g/teqneers/phpunit-stopwatch/?branch=main)
[![Code Coverage](https://scrutinizer-ci.com/g/teqneers/phpunit-stopwatch/badges/coverage.png?b=main)](https://scrutinizer-ci.com/g/teqneers/phpunit-stopwatch/?branch=main)
[![Code Climate](https://codeclimate.com/github/teqneers/phpunit-stopwatch/badges/gpa.svg)](https://codeclimate.com/github/teqneers/phpunit-stopwatch)
[![codecov](https://codecov.io/gh/teqneers/phpunit-stopwatch/graph/badge.svg?token=U1T7ZGW5XW)](https://codecov.io/gh/teqneers/phpunit-stopwatch)
[![Type Coverage](https://shepherd.dev/github/teqneers/phpunit-stopwatch/coverage.svg)](https://shepherd.dev/github/teqneers/phpunit-stopwatch)

Project
information: [![License](https://img.shields.io/github/license/teqneers/phpunit-stopwatch.svg?style=flat)](https://img.shields.io/github/license/teqneers/phpunit-stopwatch.svg?style=flat)
[![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/teqneers/phpunit-stopwatch.svg?style=flat)]((https://img.shields.io/github/languages/code-size/teqneers/phpunit-stopwatch.svg?style=flat))

Stopwatch is an essential [`phpunit/phpunit`](https://github.com/sebastianbergmann/phpunit) extension for performance
analysis!

Gain invaluable insights into your code's execution time and call frequency during test runs. The extension is designed
to elevate your code performance analysis. Track the execution time and frequency of any marked code segments to address
performance bottlenecks with precision.
You can identify performance bottlenecks (e.g., database cleanups or setup) or just monitor them over time. The
extension will generate stopwatch reports for each test as well as a summary report at the end of the test run.

This project provides a [`composer`](https://getcomposer.org) package and
a [Phar archive](https://www.php.net/manual/en/book.phar.php).

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

- [`phpunit/phpunit:^10.1.0`](https://github.com/sebastianbergmann/phpunit/tree/10.1.0)
- [`phpunit/phpunit:^11.0.0`](https://github.com/sebastianbergmann/phpunit/tree/11.0.0)

Once you've added some measurement points to your code, the extension will stop watch and count them. The results are
displayed for each test and as a total report at the end of the test run.

Here is an example of how the output of a single test class might look:

```console
Stopwatch for TQ\Tests\Example\SingleTest::testDataCalculation:
- TQ\Testing\Database::deleteData 0.117secs ( 3x, Ø 0.04) TOTAL 327.026secs ( 184x, Ø 1.78)
- ...onment\Testing::cleanupInstance 0.259secs ( 1x, Ø 0.26) TOTAL 6.159secs ( 60x, Ø 0.10)
- TQ\Testing\Database::import 7.889secs ( 11x, Ø 0.72) TOTAL 250.958secs ( 352x, Ø 0.71)
- Test 1.428secs ( 1x, Ø 1.43) TOTAL 1041.228secs ( 70x, Ø 14.87)
.

Stopwatch for TQ\Tests\Example\SingleTest::testDataTransfer:
- TQ\Testing\Database::deleteData 0.116secs ( 3x, Ø 0.04) TOTAL 327.142secs ( 187x, Ø 1.75)
- ...onment\Testing::cleanupInstance 0.256secs ( 1x, Ø 0.26) TOTAL 6.415secs ( 61x, Ø 0.11)
- TQ\Testing\Database::import 7.573secs ( 11x, Ø 0.69) TOTAL 258.531secs ( 363x, Ø 0.71)
- Test 5.998secs ( 1x, Ø 6.00) TOTAL 1047.226secs ( 71x, Ø 14.75)
.

Stopwatch for TQ\Tests\Example\SingleTest TearDown:
- TQ\Testing\Database::deleteData 38.486secs ( 6x, Ø 6.41) TOTAL 365.511secs ( 190x, Ø 1.92)
- ...onment\Testing::cleanupInstance 0.256secs ( 1x, Ø 0.26) TOTAL 6.415secs ( 61x, Ø 0.11)
- TQ\Testing\Database::import 7.573secs ( 11x, Ø 0.69) TOTAL 258.531secs ( 363x, Ø 0.71)
- Test 5.998secs ( 1x, Ø 6.00) TOTAL 1047.226secs ( 71x, Ø 14.75)
```

And at the end of the test run, you will get a summary of all stopwatches used, and it is going to look like this:

```console
Stopwatch TOTALS:
- Test TOTAL 1047.246secs ( 78x, Ø 13.43)
- TQ\Testing\Database::deleteData TOTAL 365.511secs ( 190x, Ø 1.92)
- TQ\Testing\Database::import TOTAL 258.531secs ( 363x, Ø 0.71)
- ...onment\Testing::cleanupInstance TOTAL 6.416secs ( 62x, Ø 0.10)
- TQ\Production\Monitoring::ping TOTAL 17.967secs ( 7x, Ø 2.57)
```

### Usage

Stopwatch is very easy to use. A single line of code wrapped around the code you want to measure is all it takes.

For instance, let's say your tests are pretty slow, but you don't know who's the culprit? You suspect that it might be
the
database setup that has to be done for each and every test. Simply wrap the suspected code block as follows:

```php
Stopwatch::start(__METHOD__);

self::initializeDatabase(
$db->getConnection(),
...static::createData()
);

Stopwatch::stop(__METHOD__);
```

Should the test, setup, teardown, or other relevant methods execute this code, Stopwatch will seamlessly measure its
execution time and count, and will present the results within the test output.

## Installation

### Installation with `composer`

Run

```sh
composer require --dev teqneers/phpunit-stopwatch
```

to install `teqneers/phpunit-stopwatch` as a `composer` package.

### Installation as Phar

Download `phpunit-stopwatch.phar` from
the [latest release](https://github.com/teqneers/phpunit-stopwatch/releases/latest).

## 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:^10.0.0`
- `phpunit/phpunit:^11.0.0`

adjust your `phpunit.xml` configuration file and configure the

- [`extensions` element](https://docs.phpunit.de/en/10.5/configuration.html#the-extensions-element)
on [`phpunit/phpunit:^10.1.0`](https://docs.phpunit.de/en/10.5/)
- [`extensions` element](https://docs.phpunit.de/en/11.0/configuration.html#the-extensions-element)
on [`phpunit/phpunit:^11.0.0`](https://docs.phpunit.de/en/11.0/)

```diff

+
+
+


test/Unit/



```

### Bootstrapping the extension as a PHAR

To bootstrap the extension as a PHAR when using

- `phpunit/phpunit:^10.1.0`
- `phpunit/phpunit:^11.0.0`

adjust your `phpunit.xml` configuration file and configure the

- [`extensionsDirectory` attribute](https://docs.phpunit.de/en/10.5/configuration.html#the-extensionsdirectory-attribute)
and the [`extensions` element](https://docs.phpunit.de/en/10.5/configuration.html#the-extensions-element)
on [`phpunit/phpunit:^10.0.0`](https://docs.phpunit.de/en/10.5/)
- [`extensionsDirectory` attribute](https://docs.phpunit.de/en/11.0/configuration.html#the-extensionsdirectory-attribute)
and the [`extensions` element](https://docs.phpunit.de/en/11.0/configuration.html#the-extensions-element)
on [`phpunit/phpunit:^11.0.0`](https://docs.phpunit.de/en/11.0/)

```diff

+
+
+


test/Unit/



```

### Configuring the extension

So far, there are no configuration settings for this extension.

### Running tests

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

```sh
vendor/bin/phpunit
```

When the extension is used somewhere in your code, it will give you a report:

## License

This project uses the [MIT license](LICENSE.md).

## Credits

This package is inspired by [`ergebnis/phpunit-slow-test-detector`](https://github.com/ergebnis/phpunit-slow-test-detector/).