diff --git a/src/Runner/CodeCoverage.php b/src/Runner/CodeCoverage.php index 28620e4165..1b2aae5346 100644 --- a/src/Runner/CodeCoverage.php +++ b/src/Runner/CodeCoverage.php @@ -14,6 +14,9 @@ use function sprintf; use function sys_get_temp_dir; use PHPUnit\Event\Facade as EventFacade; +use PHPUnit\Event\Telemetry\MemoryMeter; +use PHPUnit\Event\Telemetry\MemoryUsage; +use PHPUnit\Event\Telemetry\SystemMemoryMeter; use PHPUnit\Framework\TestCase; use PHPUnit\TextUI\Configuration\CodeCoverageFilterRegistry; use PHPUnit\TextUI\Configuration\Configuration; @@ -52,16 +55,25 @@ */ final class CodeCoverage { + /** + * @var array + */ + private const array SIZES = [ + 'GB' => 1073741824, + 'MB' => 1048576, + 'KB' => 1024, + ]; private static ?self $instance = null; private ?\SebastianBergmann\CodeCoverage\CodeCoverage $codeCoverage = null; /** * @phpstan-ignore property.internalClass */ - private ?Driver $driver = null; - private bool $collecting = false; - private ?TestCase $test = null; - private ?Timer $timer = null; + private ?Driver $driver = null; + private bool $collecting = false; + private ?TestCase $test = null; + private ?Timer $timer = null; + private ?MemoryUsage $memoryStartUsage = null; public static function instance(): self { @@ -448,6 +460,7 @@ private function codeCoverageGenerationStart(Printer $printer, string $format): ); $this->timer()->start(); + $this->memoryStartUsage = $this->memoryMeter()->memoryUsage(); } /** @@ -457,8 +470,9 @@ private function codeCoverageGenerationSucceeded(Printer $printer): void { $printer->print( sprintf( - "done [%s]\n", + "done [Time: %s, Memory: %s]\n", $this->timer()->stop()->asString(), + $this->bytesToString($this->memoryMeter()->memoryUsage()->diff($this->memoryStartUsage)->bytes()), ), ); } @@ -470,8 +484,9 @@ private function codeCoverageGenerationFailed(Printer $printer, CodeCoverageExce { $printer->print( sprintf( - "failed [%s]\n%s\n", + "failed [Time: %s, Memory: %s]\n%s\n", $this->timer()->stop()->asString(), + $this->bytesToString($this->memoryMeter()->memoryUsage()->diff($this->memoryStartUsage)->bytes()), $e->getMessage(), ), ); @@ -485,4 +500,22 @@ private function timer(): Timer return $this->timer; } + + private function memoryMeter(): MemoryMeter + { + return new SystemMemoryMeter; + } + + private function bytesToString(int $bytes): string + { + foreach (self::SIZES as $unit => $value) { + if ($bytes >= $value) { + return sprintf('%.2f %s', $bytes / $value, $unit); + } + } + + // @codeCoverageIgnoreStart + return $bytes . ' byte' . ($bytes !== 1 ? 's' : ''); + // @codeCoverageIgnoreEnd + } }