diff options
Diffstat (limited to 'tests/phpunit/unit/includes/composer/PhpUnitSplitter/TestSuiteBuilderTest.php')
-rw-r--r-- | tests/phpunit/unit/includes/composer/PhpUnitSplitter/TestSuiteBuilderTest.php | 190 |
1 files changed, 186 insertions, 4 deletions
diff --git a/tests/phpunit/unit/includes/composer/PhpUnitSplitter/TestSuiteBuilderTest.php b/tests/phpunit/unit/includes/composer/PhpUnitSplitter/TestSuiteBuilderTest.php index 78b2648f9e5d..f0f22def0b65 100644 --- a/tests/phpunit/unit/includes/composer/PhpUnitSplitter/TestSuiteBuilderTest.php +++ b/tests/phpunit/unit/includes/composer/PhpUnitSplitter/TestSuiteBuilderTest.php @@ -4,6 +4,7 @@ declare( strict_types = 1 ); namespace MediaWiki\Tests\Unit\composer\PhpUnitSplitter; +use MediaWiki\Composer\PhpUnitSplitter\PhpUnitTestListProcessor; use MediaWiki\Composer\PhpUnitSplitter\TestDescriptor; use MediaWiki\Composer\PhpUnitSplitter\TestSuiteBuilder; use MediaWikiCoversValidator; @@ -16,6 +17,9 @@ use PHPUnit\Framework\TestCase; class TestSuiteBuilderTest extends TestCase { use MediaWikiCoversValidator; + private const TEST_LIST_FIXTURE_FILE = __DIR__ . "/fixtures/tests-list-large.xml"; + private const CACHE_RESULTS_FIXTURE_FILE = __DIR__ . "/fixtures/cache-results-large.json"; + public function testBuildSuitesInAlphabeticalOrder() { $testList = [ new TestDescriptor( "ZTest", [ "MediaWiki" ], "MediaWiki/ZTest.php" ), @@ -53,44 +57,222 @@ class TestSuiteBuilderTest extends TestCase { public function testGroupsWithSimilarDurations() { $testList = [ new TestDescriptor( "ZTest", [ "MediaWiki" ], "MediaWiki/ZTest.php", 400 ), - new TestDescriptor( "YTest", [ "MediaWiki" ], "MediaWiki/YTest.php", 200 ), + new TestDescriptor( "YTest", [ "MediaWiki" ], "MediaWiki/YTest.php", 0 ), new TestDescriptor( "XTest", [ "MediaWiki" ], "MediaWiki/XTest.php", 200 ), - new TestDescriptor( "WTest", [ "MediaWiki" ], "MediaWiki/WTest.php", 100 ), + new TestDescriptor( "WTest", [ "MediaWiki" ], "MediaWiki/WTest.php", 0 ), new TestDescriptor( "VTest", [ "MediaWiki" ], "MediaWiki/VTest.php", 100 ), new TestDescriptor( "UTest", [ "MediaWiki" ], "MediaWiki/UTest.php", 0 ), + new TestDescriptor( "TTest", [ "MediaWiki" ], "MediaWiki/TTest.php", 200 ), + new TestDescriptor( "STest", [ "MediaWiki" ], "MediaWiki/STest.php", 0 ), + new TestDescriptor( "RTest", [ "MediaWiki" ], "MediaWiki/RTest.php", 100 ), + new TestDescriptor( "QTest", [ "MediaWiki" ], "MediaWiki/QTest.php", 0 ), + new TestDescriptor( "PTest", [ "MediaWiki" ], "MediaWiki/PTest.php", 0 ), + ]; + $suites = ( new TestSuiteBuilder() )->buildSuites( $testList, 4 ); + $expected = [ + [ + "list" => [ + "MediaWiki/PTest.php", + "MediaWiki/QTest.php", + "MediaWiki/RTest.php", + ], + "time" => 100 + ], + [ + "list" => [ + "MediaWiki/STest.php", + "MediaWiki/TTest.php", + ], + "time" => 200 + ], + [ + "list" => [ + "MediaWiki/UTest.php", + "MediaWiki/VTest.php", + "MediaWiki/WTest.php", + "MediaWiki/XTest.php", + ], + "time" => 300 + ], + [ + "list" => [ + "MediaWiki/YTest.php", + "MediaWiki/ZTest.php", + ], + "time" => 400 + ], + ]; + $this->assertEquals( $expected, $suites, "Expected suites to be built correctly" ); + } + + public function testBehavesWellIfAllTestsAreZero() { + $testList = [ + new TestDescriptor( "ZTest", [ "MediaWiki" ], "MediaWiki/ZTest.php", 0 ), + new TestDescriptor( "YTest", [ "MediaWiki" ], "MediaWiki/YTest.php", 0 ), + new TestDescriptor( "XTest", [ "MediaWiki" ], "MediaWiki/XTest.php", 0 ), + new TestDescriptor( "WTest", [ "MediaWiki" ], "MediaWiki/WTest.php", 0 ), + new TestDescriptor( "VTest", [ "MediaWiki" ], "MediaWiki/VTest.php", 0 ), + new TestDescriptor( "UTest", [ "MediaWiki" ], "MediaWiki/UTest.php", 0 ), new TestDescriptor( "TTest", [ "MediaWiki" ], "MediaWiki/TTest.php", 0 ), new TestDescriptor( "STest", [ "MediaWiki" ], "MediaWiki/STest.php", 0 ), new TestDescriptor( "RTest", [ "MediaWiki" ], "MediaWiki/RTest.php", 0 ), new TestDescriptor( "QTest", [ "MediaWiki" ], "MediaWiki/QTest.php", 0 ), new TestDescriptor( "PTest", [ "MediaWiki" ], "MediaWiki/PTest.php", 0 ), ]; - $suites = ( new TestSuiteBuilder() )->buildSuites( $testList, 3 ); + $suites = ( new TestSuiteBuilder() )->buildSuites( $testList, 4 ); $expected = [ [ "list" => [ "MediaWiki/PTest.php", "MediaWiki/QTest.php", "MediaWiki/RTest.php", + ], + "time" => 0 + ], + [ + "list" => [ "MediaWiki/STest.php", + "MediaWiki/TTest.php", + "MediaWiki/UTest.php", ], "time" => 0 ], [ "list" => [ + "MediaWiki/VTest.php", + "MediaWiki/WTest.php", + "MediaWiki/XTest.php", + ], + "time" => 0 + ], + [ + "list" => [ + "MediaWiki/YTest.php", + "MediaWiki/ZTest.php", + ], + "time" => 0 + ], + ]; + $this->assertEquals( $expected, $suites, "Expected suites to be built correctly" ); + } + + public function testBehavesWellIfFewerTestsHaveDurationThanWeHaveBuckets() { + $testList = [ + new TestDescriptor( "ZTest", [ "MediaWiki" ], "MediaWiki/ZTest.php", 0 ), + new TestDescriptor( "YTest", [ "MediaWiki" ], "MediaWiki/YTest.php", 0 ), + new TestDescriptor( "XTest", [ "MediaWiki" ], "MediaWiki/XTest.php", 100 ), + new TestDescriptor( "WTest", [ "MediaWiki" ], "MediaWiki/WTest.php", 0 ), + new TestDescriptor( "VTest", [ "MediaWiki" ], "MediaWiki/VTest.php", 100 ), + new TestDescriptor( "UTest", [ "MediaWiki" ], "MediaWiki/UTest.php", 0 ), + new TestDescriptor( "TTest", [ "MediaWiki" ], "MediaWiki/TTest.php", 100 ), + new TestDescriptor( "STest", [ "MediaWiki" ], "MediaWiki/STest.php", 0 ), + new TestDescriptor( "RTest", [ "MediaWiki" ], "MediaWiki/RTest.php", 0 ), + new TestDescriptor( "QTest", [ "MediaWiki" ], "MediaWiki/QTest.php", 0 ), + new TestDescriptor( "PTest", [ "MediaWiki" ], "MediaWiki/PTest.php", 0 ), + ]; + $suites = ( new TestSuiteBuilder() )->buildSuites( $testList, 4 ); + $expected = [ + [ + "list" => [ + "MediaWiki/PTest.php", + "MediaWiki/QTest.php", + "MediaWiki/RTest.php", + "MediaWiki/STest.php", "MediaWiki/TTest.php", + ], + "time" => 100 + ], + [ + "list" => [ "MediaWiki/UTest.php", + ], + "time" => 0 + ], + [ + "list" => [ "MediaWiki/VTest.php", + ], + "time" => 100 + ], + [ + "list" => [ "MediaWiki/WTest.php", + "MediaWiki/XTest.php", + "MediaWiki/YTest.php", + "MediaWiki/ZTest.php", + ], + "time" => 100 + ], + ]; + $this->assertEquals( $expected, $suites, "Expected suites to be built correctly" ); + } + + public function testWithRealData() { + $testList = new PhpUnitTestListProcessor( + self::TEST_LIST_FIXTURE_FILE, + self::CACHE_RESULTS_FIXTURE_FILE, + 'database' + ); + $suites = ( new TestSuiteBuilder() )->buildSuites( $testList->getTestClasses(), 8 ); + $minDuration = array_reduce( $suites, static fn ( $min, $suite ) => min( $min, $suite["time"] ), PHP_INT_MAX ); + $maxDuration = array_reduce( $suites, static fn ( $max, $suite ) => max( $max, $suite["time"] ), 0 ); + $avgDuration = array_reduce( $suites, static fn ( $acc, $suite ) => $acc + $suite["time"], 0 ) / count( $suites ); + $aboveAverageBuckets = array_reduce( $suites, static fn ( $acc, $suite ) => $acc + ( $suite["time"] > $avgDuration ? 1 : 0 ), 0 ); + $belowAverageBuckets = array_reduce( $suites, static fn ( $acc, $suite ) => $acc + ( $suite["time"] <= $avgDuration ? 1 : 0 ), 0 ); + $zeroClassBuckets = array_reduce( $suites, static fn ( $acc, $suite ) => $acc + ( count( $suite["list"] ) === 0 ? 1 : 0 ), 0 ); + $this->assertGreaterThanOrEqual( 2, $aboveAverageBuckets ); + $this->assertGreaterThanOrEqual( 2, $belowAverageBuckets ); + $this->assertLessThan( $avgDuration * 2, $maxDuration ); + $this->assertSame( 0, $zeroClassBuckets ); + } + + public function testFallbackInTheCaseOfAnError() { + $testList = [ + new TestDescriptor( "ZTest", [ "MediaWiki" ], "MediaWiki/ZTest.php", 400 ), + new TestDescriptor( "YTest", [ "MediaWiki" ], "MediaWiki/YTest.php", 0 ), + new TestDescriptor( "XTest", [ "MediaWiki" ], "MediaWiki/XTest.php", 200 ), + new TestDescriptor( "WTest", [ "MediaWiki" ], "MediaWiki/WTest.php", 0 ), + new TestDescriptor( "VTest", [ "MediaWiki" ], "MediaWiki/VTest.php", 100 ), + new TestDescriptor( "UTest", [ "MediaWiki" ], "MediaWiki/UTest.php", 0 ), + new TestDescriptor( "TTest", [ "MediaWiki" ], "MediaWiki/TTest.php", 200 ), + new TestDescriptor( "STest", [ "MediaWiki" ], "MediaWiki/STest.php", 0 ), + new TestDescriptor( "RTest", [ "MediaWiki" ], "MediaWiki/RTest.php", 100 ), + new TestDescriptor( "QTest", [ "MediaWiki" ], "MediaWiki/QTest.php", 0 ), + new TestDescriptor( "PTest", [ "MediaWiki" ], "MediaWiki/PTest.php", 0 ), + ]; + // Set the chunk size larger than the number of tests + $suites = ( new TestSuiteBuilder() )->buildSuites( $testList, 4, 20 ); + $expected = [ + [ + "list" => [ + "MediaWiki/PTest.php", + "MediaWiki/QTest.php", + "MediaWiki/RTest.php", + ], + "time" => 100 + ], + [ + "list" => [ + "MediaWiki/STest.php", + "MediaWiki/TTest.php", + "MediaWiki/UTest.php", ], "time" => 200 ], [ "list" => [ + "MediaWiki/VTest.php", + "MediaWiki/WTest.php", "MediaWiki/XTest.php", + ], + "time" => 300 + ], + [ + "list" => [ "MediaWiki/YTest.php", "MediaWiki/ZTest.php", ], - "time" => 800 + "time" => 400 ], ]; $this->assertEquals( $expected, $suites, "Expected suites to be built correctly" ); |