From fd1bcbe5aa7e220943b00744a50c5f7e1876e630 Mon Sep 17 00:00:00 2001 From: nod_ <nod_@598310.no-reply.drupal.org> Date: Thu, 25 Jul 2024 21:55:11 +0200 Subject: [PATCH] Issue #3463351 by catch, heddn: Consolidate Umami performance tests (cherry picked from commit 27fcad90d9a14053ddd16a917a8e0e1cd32cf8f7) --- .../OpenTelemetryFrontPagePerformanceTest.php | 27 ++++++++-- .../OpenTelemetryNodePagePerformanceTest.php | 32 ++++++++--- .../FunctionalJavascript/PerformanceTest.php | 53 ------------------- .../StandardPerformanceTest.php | 1 + .../Drupal/Tests/PerformanceTestTrait.php | 1 - 5 files changed, 50 insertions(+), 64 deletions(-) delete mode 100644 core/profiles/demo_umami/tests/src/FunctionalJavascript/PerformanceTest.php diff --git a/core/profiles/demo_umami/tests/src/FunctionalJavascript/OpenTelemetryFrontPagePerformanceTest.php b/core/profiles/demo_umami/tests/src/FunctionalJavascript/OpenTelemetryFrontPagePerformanceTest.php index 9cdf35039f78..a0a7c558e8a9 100644 --- a/core/profiles/demo_umami/tests/src/FunctionalJavascript/OpenTelemetryFrontPagePerformanceTest.php +++ b/core/profiles/demo_umami/tests/src/FunctionalJavascript/OpenTelemetryFrontPagePerformanceTest.php @@ -4,6 +4,7 @@ namespace Drupal\Tests\demo_umami\FunctionalJavascript; +use Drupal\Core\Cache\Cache; use Drupal\FunctionalJavascriptTests\PerformanceTestBase; /** @@ -20,10 +21,19 @@ class OpenTelemetryFrontPagePerformanceTest extends PerformanceTestBase { */ protected $profile = 'demo_umami'; + /** + * Tests performance of the Umami demo front page. + */ + public function testFrontPagePerformance(): void { + $this->testFrontPageColdCache(); + $this->testFrontPageCoolCache(); + $this->testFrontPageHotCache(); + } + /** * Logs front page tracing data with a cold cache. */ - public function testFrontPageColdCache(): void { + protected function testFrontPageColdCache(): void { // @todo Chromedriver doesn't collect tracing performance logs for the very // first request in a test, so warm it up. // https://www.drupal.org/project/drupal/issues/3379750 @@ -40,7 +50,7 @@ public function testFrontPageColdCache(): void { * * Hot here means that all possible caches are warmed. */ - public function testFrontPageHotCache(): void { + protected function testFrontPageHotCache(): void { // Request the page twice so that asset aggregates and image derivatives are // definitely cached in the browser cache. The first response builds the // file and serves from PHP with private, no-store headers. The second @@ -76,10 +86,10 @@ public function testFrontPageHotCache(): void { * Cool here means that 'global' site caches are warm but anything * specific to the front page is cold. */ - public function testFrontPageCoolCache(): void { + protected function testFrontPageCoolCache(): void { // First of all visit the front page to ensure the image style exists. $this->drupalGet('<front>'); - $this->rebuildAll(); + $this->clearCaches(); // Now visit a different page to warm non-route-specific caches. $this->drupalGet('user/login'); $this->collectPerformanceData(function () { @@ -87,4 +97,13 @@ public function testFrontPageCoolCache(): void { }, 'umamiFrontPageCoolCache'); } + /** + * Clear caches. + */ + protected function clearCaches(): void { + foreach (Cache::getBins() as $bin) { + $bin->deleteAll(); + } + } + } diff --git a/core/profiles/demo_umami/tests/src/FunctionalJavascript/OpenTelemetryNodePagePerformanceTest.php b/core/profiles/demo_umami/tests/src/FunctionalJavascript/OpenTelemetryNodePagePerformanceTest.php index 2e3597ea7294..8b9c5df083b1 100644 --- a/core/profiles/demo_umami/tests/src/FunctionalJavascript/OpenTelemetryNodePagePerformanceTest.php +++ b/core/profiles/demo_umami/tests/src/FunctionalJavascript/OpenTelemetryNodePagePerformanceTest.php @@ -4,6 +4,7 @@ namespace Drupal\Tests\demo_umami\FunctionalJavascript; +use Drupal\Core\Cache\Cache; use Drupal\FunctionalJavascriptTests\PerformanceTestBase; /** @@ -20,10 +21,20 @@ class OpenTelemetryNodePagePerformanceTest extends PerformanceTestBase { */ protected $profile = 'demo_umami'; + /** + * Test canonical node page performance with various cache permutations. + */ + public function testNodePage(): void { + $this->testNodePageColdCache(); + $this->testNodePageCoolCache(); + $this->testNodePageWarmCache(); + $this->testNodePageHotCache(); + } + /** * Logs node page tracing data with a cold cache. */ - public function testNodePageColdCache(): void { + protected function testNodePageColdCache(): void { // @todo Chromedriver doesn't collect tracing performance logs for the very // first request in a test, so warm it up. // https://www.drupal.org/project/drupal/issues/3379750 @@ -40,7 +51,7 @@ public function testNodePageColdCache(): void { * * Hot here means that all possible caches are warmed. */ - public function testNodePageHotCache(): void { + protected function testNodePageHotCache(): void { // Request the page twice so that asset aggregates are definitely cached in // the browser cache. $this->drupalGet('node/1'); @@ -64,10 +75,10 @@ public function testNodePageHotCache(): void { * Cool here means that 'global' site caches are warm but anything * specific to the route or path is cold. */ - public function testNodePageCoolCache(): void { + protected function testNodePageCoolCache(): void { // First of all visit the node page to ensure the image style exists. $this->drupalGet('node/1'); - $this->rebuildAll(); + $this->clearCaches(); // Now visit a non-node page to warm non-route-specific caches. $this->drupalGet('user/login'); $this->collectPerformanceData(function () { @@ -82,10 +93,10 @@ public function testNodePageCoolCache(): void { * Warm here means that 'global' site caches and route-specific caches are * warm but caches specific to this particular node/path are not. */ - public function testNodePageWarmCache(): void { + protected function testNodePageWarmCache(): void { // First of all visit the node page to ensure the image style exists. $this->drupalGet('node/1'); - $this->rebuildAll(); + $this->clearCaches(); // Now visit a different node page to warm non-path-specific caches. $this->drupalGet('node/2'); $this->collectPerformanceData(function () { @@ -94,4 +105,13 @@ public function testNodePageWarmCache(): void { $this->assertSession()->pageTextContains('quiche'); } + /** + * Clear caches. + */ + protected function clearCaches(): void { + foreach (Cache::getBins() as $bin) { + $bin->deleteAll(); + } + } + } diff --git a/core/profiles/demo_umami/tests/src/FunctionalJavascript/PerformanceTest.php b/core/profiles/demo_umami/tests/src/FunctionalJavascript/PerformanceTest.php deleted file mode 100644 index aec2ec911522..000000000000 --- a/core/profiles/demo_umami/tests/src/FunctionalJavascript/PerformanceTest.php +++ /dev/null @@ -1,53 +0,0 @@ -<?php - -declare(strict_types=1); - -namespace Drupal\Tests\demo_umami\FunctionalJavascript; - -use Drupal\FunctionalJavascriptTests\PerformanceTestBase; - -/** - * Tests demo_umami profile performance. - * - * @group Performance - */ -class PerformanceTest extends PerformanceTestBase { - - /** - * {@inheritdoc} - */ - protected $profile = 'demo_umami'; - - /** - * Just load the front page. - */ - public function testPagesAnonymous(): void { - $performance_data = $this->collectPerformanceData(function () { - $this->drupalGet('<front>'); - }); - $this->assertSession()->pageTextContains('Umami'); - $this->assertSame(2, $performance_data->getStylesheetCount()); - $this->assertSame(1, $performance_data->getScriptCount()); - - $performance_data = $this->collectPerformanceData(function () { - $this->drupalGet('node/1'); - }); - $this->assertSame(2, $performance_data->getStylesheetCount()); - $this->assertSame(1, $performance_data->getScriptCount()); - } - - /** - * Load the front page as a user with access to Toolbar. - */ - public function testFrontPagePerformance(): void { - $admin_user = $this->drupalCreateUser(['access toolbar']); - $this->drupalLogin($admin_user); - $performance_data = $this->collectPerformanceData(function () { - $this->drupalGet('<front>'); - }); - $this->assertSession()->pageTextContains('Umami'); - $this->assertSame(2, $performance_data->getStylesheetCount()); - $this->assertSame(2, $performance_data->getScriptCount()); - } - -} diff --git a/core/profiles/standard/tests/src/FunctionalJavascript/StandardPerformanceTest.php b/core/profiles/standard/tests/src/FunctionalJavascript/StandardPerformanceTest.php index 4aadd45d5f4f..543540dbc84a 100644 --- a/core/profiles/standard/tests/src/FunctionalJavascript/StandardPerformanceTest.php +++ b/core/profiles/standard/tests/src/FunctionalJavascript/StandardPerformanceTest.php @@ -16,6 +16,7 @@ * Stark is used as the default theme so that this test is not Olivero specific. * * @group Common + * @group #slow * @requires extension apcu */ class StandardPerformanceTest extends PerformanceTestBase { diff --git a/core/tests/Drupal/Tests/PerformanceTestTrait.php b/core/tests/Drupal/Tests/PerformanceTestTrait.php index 014fac12d5fa..ed85aafb78d0 100644 --- a/core/tests/Drupal/Tests/PerformanceTestTrait.php +++ b/core/tests/Drupal/Tests/PerformanceTestTrait.php @@ -111,7 +111,6 @@ public function collectPerformanceData(callable $callable, ?string $service_name $session = $this->getSession(); $session->getDriver()->getWebDriverSession()->log('performance'); - $collection = \Drupal::keyValue('performance_test'); $collection->deleteAll(); $return = $callable(); $performance_data = $this->processChromeDriverPerformanceLogs($service_name); -- GitLab