Skip to content

Report slowest tests via PHPUnit extension - #8545

Closed
TomasVotruba wants to merge 3 commits into
mainfrom
worktree-phpunit-slow-test-collector
Closed

TomasVotruba wants to merge 3 commits into
mainfrom
worktree-phpunit-slow-test-collector

Conversation

@TomasVotruba

@TomasVotruba TomasVotruba commented Oct 8, 2026 •

Copy link
Copy Markdown
Member

Adds a PHPUnit extension that measures each test method duration and prints the slowest ones at the end of the run.

  • registers 3 event subscribers (prepared, finished, execution finished)
  • groups all data-provider fixtures under their test method, so a slow rule shows as one entry
  • prints the top 25 tests slower than 0.5s, sorted descending

Example output on rules-tests/DeadCode:

4 slowest tests (>= 0.5s):
  1.   1.10s  ...RemoveUnusedPrivateMethodRectorTest::test
  2.   0.96s  ...RemoveUnusedVariableAssignRectorTest::test
  3.   0.84s  ...RemoveAlwaysTrueIfConditionRectorTest::test
  4.   0.79s  ...RemoveDoubleAssignRectorTest::test

Fast runs print nothing, so normal output stays clean.


Top 50 slowest tests (full suite, local sequential run)
  1.   1.93s  Rector\Tests\Php83\Rector\ClassMethod\AddOverrideAttributeToOverriddenMethodsRector\AddOverrideAttributeToOverriddenMethodsRectorTest::test
  2.   1.20s  Rector\Tests\Parallel\ValueObject\ParallelProcessTest::testTimeoutTerminatesWorker
  3.   1.10s  Rector\Tests\Parallel\ValueObject\ParallelProcessTest::testQuitKeepsTimeoutOfBusyWorker
  4.   0.75s  Rector\Tests\CodeQuality\Rector\Foreach_\ForeachItemsAssignToEmptyArrayToAssignRector\ForeachItemsAssignToEmptyArrayToAssignRectorTest::test
  5.   0.71s  Rector\Tests\DeadCode\Rector\If_\RemoveAlwaysTrueIfConditionRector\RemoveAlwaysTrueIfConditionRectorTest::test
  6.   0.55s  Rector\Tests\Naming\Rector\ClassMethod\RenameVariableToMatchNewTypeRector\RenameVariableToMatchNewTypeRectorTest::test
  7.   0.53s  Rector\Tests\Php80\Rector\Switch_\ChangeSwitchToMatchRector\ChangeSwitchToMatchRectorTest::test
  8.   0.52s  Rector\Tests\DeadCode\Rector\Assign\RemoveUnusedVariableAssignRector\RemoveUnusedVariableAssignRectorTest::test
  9.   0.48s  Rector\Tests\DeadCode\Rector\ClassMethod\RemoveUnusedPrivateMethodRector\RemoveUnusedPrivateMethodRectorTest::test
 10.   0.44s  Rector\Tests\Issues\AutoImport\AutoImportTest::test
 11.   0.42s  Rector\Tests\Php81\Rector\Property\ReadOnlyPropertyRector\ReadOnlyPropertyRectorTest::test
 12.   0.41s  Rector\Tests\Php80\Rector\Class_\ClassPropertyAssignToConstructorPromotionRector\ClassPropertyAssignToConstructorPromotionRectorTest::test
 13.   0.38s  Rector\Tests\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromStrictNewArrayRector\ReturnTypeFromStrictNewArrayRectorTest::test
 14.   0.37s  Rector\Tests\DeadCode\Rector\Stmt\RemoveUnreachableStatementRector\RemoveUnreachableStatementRectorTest::test
 15.   0.37s  Rector\Tests\TypeDeclaration\Rector\Property\TypedPropertyFromAssignsRector\TypedPropertyFromAssignsRectorTest::test
 16.   0.37s  Rector\Tests\CodingStyle\Rector\ClassMethod\FuncGetArgsToVariadicParamRector\FuncGetArgsToVariadicParamRectorTest::test
 17.   0.34s  Rector\Tests\Naming\Rector\ClassMethod\RenameParamToMatchTypeRector\RenameParamToMatchTypeRectorTest::test
 18.   0.33s  Rector\Tests\DeadCode\Rector\Property\RemoveUnusedPrivatePropertyRector\RemoveUnusedPrivatePropertyRectorTest::test
 19.   0.32s  Rector\Tests\Naming\Rector\Foreach_\RenameForeachValueVariableToMatchExprVariableRector\RenameForeachValueVariableToMatchExprVariableRectorTest::test
 20.   0.32s  Rector\Tests\DependencyInjection\ConfigurableRectorImportConfigCallsMergeTest::testMainConfigValues
 21.   0.30s  Rector\Tests\Bin\RectorTest::testConsoleOutput
 22.   0.30s  Rector\Tests\Php81\Rector\FuncCall\NullToStrictStringFuncCallArgRector\NullToStrictStringFuncCallArgRectorTest::test
 23.   0.30s  Rector\Tests\TypeDeclarationDocblocks\Rector\Class_\ClassMethodArrayDocblockParamFromLocalCallsRector\ClassMethodArrayDocblockParamFromLocalCallsRectorTest::test
 24.   0.29s  Rector\Tests\DeadCode\Rector\If_\RemoveUnusedNonEmptyArrayBeforeForeachRector\RemoveUnusedNonEmptyArrayBeforeForeachRectorTest::test
 25.   0.29s  Rector\Tests\Php70\Rector\If_\IfToSpaceshipRector\IfToSpaceshipRectorTest::test
 26.   0.28s  Rector\Tests\CodeQuality\Rector\ClassMethod\OptionalParametersAfterRequiredRector\OptionalParametersAfterRequiredRectorTest::test
 27.   0.28s  Rector\Tests\DeadCode\Rector\FunctionLike\NarrowWideUnionReturnTypeRector\NarrowWideUnionReturnTypeRectorTest::test
 28.   0.28s  Rector\Tests\Php80\Rector\Class_\AnnotationToAttributeRector\AnnotationToAttributeRectorTest::test
 29.   0.28s  Rector\Tests\CodeQuality\Rector\If_\SimplifyIfReturnBoolRector\SimplifyIfReturnBoolRectorTest::test
 30.   0.27s  Rector\Tests\TypeDeclaration\Rector\Property\TypedPropertyFromStrictConstructorRector\TypedPropertyFromStrictConstructorRectorTest::test
 31.   0.27s  Rector\Tests\CodeQuality\Rector\FunctionLike\SimplifyUselessVariableRector\SimplifyUselessVariableRectorTest::test
 32.   0.27s  Rector\Tests\Privatization\Rector\ClassMethod\PrivatizeFinalClassMethodRector\PrivatizeFinalClassMethodRectorTest::test
 33.   0.26s  Rector\Tests\Naming\Rector\Class_\RenamePropertyToMatchTypeRector\RenamePropertyToMatchTypeRectorTest::test
 34.   0.26s  Rector\Tests\TypeDeclaration\Rector\ClassMethod\AddMethodCallBasedStrictParamTypeRector\AddMethodCallBasedStrictParamTypeRectorTest::test
 35.   0.25s  Rector\Tests\EarlyReturn\Rector\If_\RemoveAlwaysElseRector\RemoveAlwaysElseRectorTest::test
 36.   0.24s  Rector\Tests\Php84\Rector\Foreach_\ForeachToArrayAnyRector\ForeachToArrayAnyRectorTest::test
 37.   0.23s  Rector\Tests\Arguments\Rector\ClassMethod\ArgumentAdderRector\ArgumentAdderRectorTest::test
 38.   0.23s  Rector\Tests\Naming\Rector\Foreach_\RenameForeachValueVariableToMatchMethodCallReturnTypeRector\RenameForeachValueVariableToMatchMethodCallReturnTypeRectorTest::test
 39.   0.23s  Rector\Tests\DeadCode\Rector\Assign\RemoveDoubleAssignRector\RemoveDoubleAssignRectorTest::test
 40.   0.22s  Rector\Tests\CodingStyle\Rector\Namespace_\ImportFullyQualifiedNamesRector\ImportFullyQualifiedNamesRectorTest::test
 41.   0.22s  Rector\Tests\CodeQuality\Rector\ClassMethod\ExplicitReturnNullRector\ExplicitReturnNullRectorTest::test
 42.   0.22s  Rector\Tests\TypeDeclaration\Rector\ClassMethod\StrictArrayParamDimFetchRector\StrictArrayParamDimFetchRectorTest::test
 43.   0.22s  Rector\Tests\CodingStyle\Rector\ArrowFunction\ArrowFunctionDelegatingCallToFirstClassCallableRector\ArrowFunctionDelegatingCallToFirstClassCallableRectorTest::test
 44.   0.22s  Rector\Tests\Php72\Rector\FuncCall\CreateFunctionToAnonymousFunctionRector\CreateFunctionToAnonymousFunctionRectorTest::test
 45.   0.21s  Rector\Tests\TypeDeclaration\Rector\ClassMethod\ParamTypeByParentCallTypeRector\ParamTypeByParentCallTypeRectorTest::test
 46.   0.21s  Rector\Tests\Php84\Rector\Foreach_\ForeachToArrayAllRector\ForeachToArrayAllRectorTest::test
 47.   0.21s  Rector\Tests\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromStrictTypedCallRector\ReturnTypeFromStrictTypedCallRectorTest::test
 48.   0.21s  Rector\Tests\Php81\Rector\Array_\ArrayToFirstClassCallableRector\ArrayToFirstClassCallableRectorTest::test
 49.   0.19s  Rector\Tests\Naming\Rector\Assign\RenameVariableToMatchMethodCallReturnTypeRector\RenameVariableToMatchMethodCallReturnTypeRectorTest::test
 50.   0.19s  Rector\Tests\Php71\Rector\FuncCall\RemoveExtraParametersRector\RemoveExtraParametersRectorTest::test

@TomasVotruba
TomasVotruba deleted the worktree-phpunit-slow-test-collector branch October 10, 2026 21:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants