From 45fb82bb10de3831b33ba5ae85588c53c530e315 Mon Sep 17 00:00:00 2001 From: Dmitriy Derepko Date: Sat, 31 Jan 2026 11:13:16 +0400 Subject: [PATCH 1/7] test: auto-generate phpunit fast and slow suites from logs --- phpunit.xml.dist | 49 +++++++++++- tests/bootstrap.php | 9 ++- tests/phpunit-generate.php | 148 +++++++++++++++++++++++++++++++++++++ 3 files changed, 200 insertions(+), 6 deletions(-) create mode 100644 tests/phpunit-generate.php diff --git a/phpunit.xml.dist b/phpunit.xml.dist index a982abbf3..883e96ff8 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -14,9 +14,52 @@ displayDetailsOnTestsThatTriggerDeprecations="true" displayDetailsOnTestsThatTriggerErrors="true" displayDetailsOnTestsThatTriggerNotices="true" - displayDetailsOnTestsThatTriggerWarnings="true" -> + displayDetailsOnTestsThatTriggerWarnings="true"> + + tests/Acceptance/Extra + tests/Acceptance/Harness + tests/Acceptance/Harness/Query/TimeoutDueToNoActiveWorkersTest.php + tests/Acceptance/Extra/Versioning/DeploymentTest.php + tests/Acceptance/Harness/EagerWorkflow/SuccessfulStartTest.php + tests/Acceptance/Harness/Activity/CancelTryCancelTest.php + tests/Acceptance/Extra/Stability/ResetWorkerTest.php + tests/Acceptance/Harness/Activity/RetryOnErrorTest.php + tests/Acceptance/Harness/Update/WorkerRestartTest.php + tests/Acceptance/Harness/Schedule/BasicTest.php + tests/Acceptance/Harness/Update/AsyncAcceptTest.php + tests/Acceptance/Extra/Workflow/BuiltInPrefixedHandlersTest.php + tests/Acceptance/Harness/Schedule/TriggerTest.php + tests/Acceptance/Extra/Workflow/InitMethodTest.php + tests/Acceptance/Harness/Signal/PreventCloseTest.php + tests/Acceptance/Extra/Update/UntypedStubTest.php + tests/Acceptance/Extra/Update/TimeoutTest.php + tests/Acceptance/Extra/Workflow/DateTimeZoneWorkflowTest.php + tests/Acceptance/Extra/Schedule/ScheduleUpdateTest.php + tests/Acceptance/Harness/ChildWorkflow/CancelAbandonTest.php + tests/Acceptance/Harness/ContinueAsNew/ContinueAsSameTest.php + + + tests/Acceptance/Harness/Query/TimeoutDueToNoActiveWorkersTest.php + tests/Acceptance/Extra/Versioning/DeploymentTest.php + tests/Acceptance/Harness/EagerWorkflow/SuccessfulStartTest.php + tests/Acceptance/Harness/Activity/CancelTryCancelTest.php + tests/Acceptance/Extra/Stability/ResetWorkerTest.php + tests/Acceptance/Harness/Activity/RetryOnErrorTest.php + tests/Acceptance/Harness/Update/WorkerRestartTest.php + tests/Acceptance/Harness/Schedule/BasicTest.php + tests/Acceptance/Harness/Update/AsyncAcceptTest.php + tests/Acceptance/Extra/Workflow/BuiltInPrefixedHandlersTest.php + tests/Acceptance/Harness/Schedule/TriggerTest.php + tests/Acceptance/Extra/Workflow/InitMethodTest.php + tests/Acceptance/Harness/Signal/PreventCloseTest.php + tests/Acceptance/Extra/Update/UntypedStubTest.php + tests/Acceptance/Extra/Update/TimeoutTest.php + tests/Acceptance/Extra/Workflow/DateTimeZoneWorkflowTest.php + tests/Acceptance/Extra/Schedule/ScheduleUpdateTest.php + tests/Acceptance/Harness/ChildWorkflow/CancelAbandonTest.php + tests/Acceptance/Harness/ContinueAsNew/ContinueAsSameTest.php + tests/Acceptance/Extra tests/Acceptance/Harness @@ -45,4 +88,4 @@ src - + \ No newline at end of file diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 0dd2045e1..605bb7e4d 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -35,7 +35,10 @@ return null; })($GLOBALS['argv'] ?? []); +$suite = \substr($suite, 0, \strpos($suite, '-')); + # Include related bootstrap -$suite === null or (static fn(string $file) => \is_file($file) and include $file)( - __DIR__ . DIRECTORY_SEPARATOR . $suite . DIRECTORY_SEPARATOR . 'bootstrap.php', -); +$file = __DIR__ . DIRECTORY_SEPARATOR . $suite . DIRECTORY_SEPARATOR . 'bootstrap.php'; +if (\is_file($file)) { + include $file; +} diff --git a/tests/phpunit-generate.php b/tests/phpunit-generate.php new file mode 100644 index 000000000..e53799e0c --- /dev/null +++ b/tests/phpunit-generate.php @@ -0,0 +1,148 @@ +#!/usr/bin/env php +xpath('//testcase') as $testcase) { + $file = (string) $testcase['file']; + $time = (float) $testcase['time']; + + if (!isset($tests[$file])) { + $tests[$file] = 0.0; + } + $tests[$file] = \max($tests[$file], $time); // max instead of sum + } +} + +$slow = []; +$fast = []; + +foreach ($tests as $file => $time) { + if ($time >= $threshold) { + $slow[$file] = $time; + } else { + $fast[$file] = $time; + } +} + +\arsort($slow); + +$extractPath = static function (string $file): string { + if (\preg_match('#(tests/Acceptance/.+)$#', $file, $matches)) { + return $matches[1]; + } + return $file; +}; + +$slowFiles = \array_map($extractPath, \array_keys($slow)); + +$excludeLines = \implode("\n", \array_map( + static fn(string $file): string => " $file", + $slowFiles, +)); + +$fileLines = \implode("\n", \array_map( + static fn(string $file): string => " $file", + $slowFiles, +)); + +$template = <<<'XML' + + + + + tests/Acceptance/Extra + tests/Acceptance/Harness +{{EXCLUDES}} + + +{{FILES}} + + + tests/Acceptance/Extra + tests/Acceptance/Harness + + + tests/Arch + + + tests/Unit + + + tests/Functional + + + + + skip-on-test-server + + + + + + + + + src + + + +XML; + +$output = \str_replace( + ['{{EXCLUDES}}', '{{FILES}}'], + [$excludeLines, $fileLines], + $template, +); + +\file_put_contents($outputFile, $output); + +$slowTime = \array_sum($slow); +$fastTime = \array_sum($fast); + +echo "Generated: $outputFile (threshold: {$threshold}s)\n\n"; +echo "Fast: " . \count($fast) . " files (~" . \round($fastTime, 1) . "s)\n"; +echo "Slow: " . \count($slow) . " files (~" . \round($slowTime, 1) . "s)\n\n"; + +foreach ($slow as $file => $time) { + echo \sprintf("%6.2fs %s\n", $time, $extractPath($file)); +} From 3d9690a5c3d1b0ab54d1326f4c085b9efd236684 Mon Sep 17 00:00:00 2001 From: Dmitriy Derepko Date: Sat, 31 Jan 2026 11:13:29 +0400 Subject: [PATCH 2/7] test: add predefined run configurations --- .run/Acceptance Fast.run.xml | 6 ++++++ .run/Acceptance Slow.run.xml | 6 ++++++ .run/Acceptance.run.xml | 4 ++-- 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 .run/Acceptance Fast.run.xml create mode 100644 .run/Acceptance Slow.run.xml diff --git a/.run/Acceptance Fast.run.xml b/.run/Acceptance Fast.run.xml new file mode 100644 index 000000000..687a546d5 --- /dev/null +++ b/.run/Acceptance Fast.run.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/.run/Acceptance Slow.run.xml b/.run/Acceptance Slow.run.xml new file mode 100644 index 000000000..d9d8e85c0 --- /dev/null +++ b/.run/Acceptance Slow.run.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/.run/Acceptance.run.xml b/.run/Acceptance.run.xml index af5f7ae9a..ae1d8ef29 100644 --- a/.run/Acceptance.run.xml +++ b/.run/Acceptance.run.xml @@ -1,6 +1,6 @@ - + - \ No newline at end of file + From b4188a4041804b53365498295d088487a60998d7 Mon Sep 17 00:00:00 2001 From: Dmitriy Derepko Date: Sat, 31 Jan 2026 11:16:24 +0400 Subject: [PATCH 3/7] test: skip broken files --- tests/phpunit-generate.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/phpunit-generate.php b/tests/phpunit-generate.php index e53799e0c..2a3bbb85b 100644 --- a/tests/phpunit-generate.php +++ b/tests/phpunit-generate.php @@ -27,6 +27,9 @@ foreach ($junitFiles as $junitFile) { $xml = \simplexml_load_file($junitFile); + if ($xml === false) { + continue; + } foreach ($xml->xpath('//testcase') as $testcase) { $file = (string) $testcase['file']; $time = (float) $testcase['time']; From e64170bddc00f77c3ad0b88ab2440ec6048d4bc2 Mon Sep 17 00:00:00 2001 From: Dmitriy Derepko Date: Sat, 31 Jan 2026 11:18:44 +0400 Subject: [PATCH 4/7] test: diff tests --- phpunit.xml.dist | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 883e96ff8..43bb60c76 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -19,7 +19,9 @@ tests/Acceptance/Extra tests/Acceptance/Harness + tests/Acceptance/Harness/Update/SelfTest.php tests/Acceptance/Harness/Query/TimeoutDueToNoActiveWorkersTest.php + tests/Acceptance/Extra/Activity/ActivityPausedTest.php tests/Acceptance/Extra/Versioning/DeploymentTest.php tests/Acceptance/Harness/EagerWorkflow/SuccessfulStartTest.php tests/Acceptance/Harness/Activity/CancelTryCancelTest.php @@ -40,7 +42,9 @@ tests/Acceptance/Harness/ContinueAsNew/ContinueAsSameTest.php + tests/Acceptance/Harness/Update/SelfTest.php tests/Acceptance/Harness/Query/TimeoutDueToNoActiveWorkersTest.php + tests/Acceptance/Extra/Activity/ActivityPausedTest.php tests/Acceptance/Extra/Versioning/DeploymentTest.php tests/Acceptance/Harness/EagerWorkflow/SuccessfulStartTest.php tests/Acceptance/Harness/Activity/CancelTryCancelTest.php From 82389f8c3416a528d29d14d460b9146fe88bcce9 Mon Sep 17 00:00:00 2001 From: Dmitriy Derepko Date: Sat, 31 Jan 2026 11:20:47 +0400 Subject: [PATCH 5/7] ci: diff acceptance tests --- .github/workflows/testing.yml | 12 ++++++++++-- composer.json | 4 +++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 72cf1a4bf..cac426cc9 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -22,10 +22,18 @@ jobs: test-command: composer test:func download-binaries: true - acceptance: + acceptance-slow: name: Acceptance Testing uses: ./.github/workflows/run-test-suite.yml with: fail-fast: false - test-command: composer test:accept + test-command: composer test:accept-slow + download-binaries: true + + acceptance-fast: + name: Acceptance Testing + uses: ./.github/workflows/run-test-suite.yml + with: + fail-fast: false + test-command: composer test:accept-fast download-binaries: true diff --git a/composer.json b/composer.json index e9fba1200..6aeef7290 100644 --- a/composer.json +++ b/composer.json @@ -102,7 +102,9 @@ "test:unit": "tests/runner.php vendor/bin/phpunit --testsuite=Unit --color=always --testdox", "test:func": "tests/runner.php vendor/bin/phpunit --testsuite=Functional --color=always --testdox", "test:arch": "phpunit --testsuite=Arch --color=always --testdox", - "test:accept": "tests/runner.php vendor/bin/phpunit --testsuite=Acceptance --color=always --testdox" + "test:accept": "tests/runner.php vendor/bin/phpunit --testsuite=Acceptance --color=always --testdox", + "test:accept-slow": "tests/runner.php vendor/bin/phpunit --testsuite=\"Acceptance-Slow\" --color=always --testdox", + "test:accept-fast": "tests/runner.php vendor/bin/phpunit --testsuite=\"Acceptance-Fast\" --color=always --testdox" }, "config": { "sort-packages": true, From 2b3328101fa4ee1e8d15a4c33fd078437e4fb816 Mon Sep 17 00:00:00 2001 From: Dmitriy Derepko Date: Sat, 31 Jan 2026 11:25:54 +0400 Subject: [PATCH 6/7] test: correct suite extraction logic --- tests/bootstrap.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 605bb7e4d..fc34416df 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -35,7 +35,7 @@ return null; })($GLOBALS['argv'] ?? []); -$suite = \substr($suite, 0, \strpos($suite, '-')); +$suite = \substr($suite, 0, \strpos($suite, '-') ?: \strlen($suite)); # Include related bootstrap $file = __DIR__ . DIRECTORY_SEPARATOR . $suite . DIRECTORY_SEPARATOR . 'bootstrap.php'; From 104d5743963341c561f78767f10823f550ebc575 Mon Sep 17 00:00:00 2001 From: Dmitriy Derepko Date: Sun, 1 Feb 2026 19:54:46 +0400 Subject: [PATCH 7/7] fix: rename test suites --- .github/workflows/testing.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index cac426cc9..85b6c4e5a 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -23,7 +23,7 @@ jobs: download-binaries: true acceptance-slow: - name: Acceptance Testing + name: Acceptance Testing (Slow) uses: ./.github/workflows/run-test-suite.yml with: fail-fast: false @@ -31,7 +31,7 @@ jobs: download-binaries: true acceptance-fast: - name: Acceptance Testing + name: Acceptance Testing (Fast) uses: ./.github/workflows/run-test-suite.yml with: fail-fast: false