diff --git a/package_manager/src/Validator/XdebugValidator.php b/package_manager/src/Validator/XdebugValidator.php
index d9983474b10662caf0dea22b6d9d15aa8dbc1ee6..32017c25be317efc73ef9b43f9c7a067fc909f73 100644
--- a/package_manager/src/Validator/XdebugValidator.php
+++ b/package_manager/src/Validator/XdebugValidator.php
@@ -4,6 +4,7 @@ declare(strict_types = 1);
 
 namespace Drupal\package_manager\Validator;
 
+use Drupal\Component\FileSystem\FileSystem as DrupalFilesystem;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
 use Drupal\package_manager\Event\StatusCheckEvent;
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
@@ -40,6 +41,15 @@ class XdebugValidator implements EventSubscriberInterface {
    *   Returns an array of warnings or null if Xdebug isn't detected.
    */
   protected function checkForXdebug(): ?array {
+    // Xdebug is allowed to be enabled while running tests, for debugging
+    // purposes. It's just not allowed to be enabled while using Package Manager
+    // in a real environment. Except when specifically testing this validator.
+    // @see \Drupal\Tests\package_manager\Kernel\XdebugValidatorTest::testXdebugValidation()
+    // @see \Drupal\Tests\automatic_updates\Kernel\StatusCheck\XdebugValidatorTest::simulateXdebugEnabled()
+    if (self::insideTest() && !function_exists('xdebug_break_TESTED')) {
+      return NULL;
+    }
+
     if (function_exists('xdebug_break')) {
       return [
         $this->t('Xdebug is enabled, which may have a negative performance impact on Package Manager and any modules that use it.'),
@@ -48,6 +58,21 @@ class XdebugValidator implements EventSubscriberInterface {
     return NULL;
   }
 
+  /**
+   * Whether this validator is running inside a test.
+   *
+   * @return bool
+   */
+  private static function insideTest(): bool {
+    // @see \Drupal\Core\CoreServiceProvider::registerTest()
+    $in_functional_test = drupal_valid_test_ua();
+    // @see \Drupal\Core\DependencyInjection\DependencySerializationTrait::__wakeup()
+    $in_kernel_test = isset($GLOBALS['__PHPUNIT_BOOTSTRAP']);
+    // @see \Drupal\BuildTests\Framework\BuildTestBase::setUp()
+    $in_build_test = str_contains(__FILE__, DrupalFilesystem::getOsTemporaryDirectory() . '/build_workspace_');
+    return $in_functional_test || $in_kernel_test || $in_build_test;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/package_manager/tests/src/Kernel/XdebugValidatorTest.php b/package_manager/tests/src/Kernel/XdebugValidatorTest.php
index 7b13ca692dbd51a0ae240c5602e11ba82079003c..2c324819d867caba812faa0d9d8ad104cd37c2da 100644
--- a/package_manager/tests/src/Kernel/XdebugValidatorTest.php
+++ b/package_manager/tests/src/Kernel/XdebugValidatorTest.php
@@ -21,6 +21,9 @@ class XdebugValidatorTest extends PackageManagerKernelTestBase {
     if (!function_exists('xdebug_break')) {
       // @codingStandardsIgnoreLine
       eval('function xdebug_break() {}');
+      // @see \Drupal\package_manager\Validator\XdebugValidator::checkForXdebug()
+      // @codingStandardsIgnoreLine
+      eval('function xdebug_break_TESTED() {}');
     }
 
     $result = ValidationResult::createWarning([
diff --git a/tests/src/Functional/AutomaticUpdatesFunctionalTestBase.php b/tests/src/Functional/AutomaticUpdatesFunctionalTestBase.php
index dbc10849046f93d64e3cf0952df6a6af018b9be5..f1869aa91c676fe3f2677d1a0b9fc352d5836a36 100644
--- a/tests/src/Functional/AutomaticUpdatesFunctionalTestBase.php
+++ b/tests/src/Functional/AutomaticUpdatesFunctionalTestBase.php
@@ -44,8 +44,6 @@ abstract class AutomaticUpdatesFunctionalTestBase extends BrowserTestBase {
     // package_manager_bypass is disabling those operations.
     // @todo https://www.drupal.org/project/automatic_updates/issues/3320755.
     'package_manager.validator.composer_executable',
-    // Always allow tests to run with Xdebug on.
-    'package_manager.validator.xdebug',
   ];
 
   /**
diff --git a/tests/src/Kernel/AutomaticUpdatesKernelTestBase.php b/tests/src/Kernel/AutomaticUpdatesKernelTestBase.php
index 800ec5f403cebbf4dc9a8909d2637ccfd91e40da..44c25ce6d7e1e3c95d40d308aa4ea938b235e84d 100644
--- a/tests/src/Kernel/AutomaticUpdatesKernelTestBase.php
+++ b/tests/src/Kernel/AutomaticUpdatesKernelTestBase.php
@@ -50,8 +50,6 @@ abstract class AutomaticUpdatesKernelTestBase extends PackageManagerKernelTestBa
     if (in_array('package_manager.validator.symlink', $this->disableValidators, TRUE)) {
       $this->disableValidators[] = 'automatic_updates.validator.symlink';
     }
-    // Always disable the Xdebug validator to allow test to run with Xdebug on.
-    $this->disableValidators[] = 'package_manager.validator.xdebug';
     parent::setUp();
     // Enable cron updates, which will eventually be the default.
     // @todo Remove in https://www.drupal.org/project/automatic_updates/issues/3284443
diff --git a/tests/src/Kernel/StatusCheck/XdebugValidatorTest.php b/tests/src/Kernel/StatusCheck/XdebugValidatorTest.php
index 48652a8946be50491c6e980d68ec59b1420bf267..0a53dc20e78e833c7c3e0cfe82ab5993e20fc6ba 100644
--- a/tests/src/Kernel/StatusCheck/XdebugValidatorTest.php
+++ b/tests/src/Kernel/StatusCheck/XdebugValidatorTest.php
@@ -29,18 +29,6 @@ class XdebugValidatorTest extends AutomaticUpdatesKernelTestBase {
    */
   protected static $modules = ['automatic_updates'];
 
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp(): void {
-    parent::setUp();
-
-    // The parent class unconditionally disables the Xdebug validator we're
-    // testing, so undo that here.
-    $validator = $this->container->get('package_manager.validator.xdebug');
-    $this->container->get('event_dispatcher')->addSubscriber($validator);
-  }
-
   /**
    * Tests warnings and/or errors if Xdebug is enabled.
    */
@@ -121,6 +109,9 @@ class XdebugValidatorTest extends AutomaticUpdatesKernelTestBase {
     if (!function_exists('xdebug_break')) {
       // @codingStandardsIgnoreLine
       eval('function xdebug_break() {}');
+      // @see \Drupal\package_manager\Validator\XdebugValidator::checkForXdebug()
+      // @codingStandardsIgnoreLine
+      eval('function xdebug_break_TESTED() {}');
     }
   }