diff --git a/core/modules/simpletest/tests/src/Functional/BrowserTestBaseTest.php b/core/modules/simpletest/tests/src/Functional/BrowserTestBaseTest.php
index 4d1906e..082d1d2 100644
--- a/core/modules/simpletest/tests/src/Functional/BrowserTestBaseTest.php
+++ b/core/modules/simpletest/tests/src/Functional/BrowserTestBaseTest.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Tests\simpletest\Functional;
 
+use Drupal\Core\Config\Schema\SchemaIncompleteException;
 use Drupal\Core\Url;
 use Drupal\Tests\BrowserTestBase;
 
@@ -74,4 +75,20 @@ public function testError() {
     $this->drupalGet('test-error');
   }
 
+  /**
+   * Tests that configuration files missing schemas are detected.
+   */
+  public function testConfigSchemaCheckMissingSchema() {
+    $this->setExpectedException(SchemaIncompleteException::class, 'No schema for this.had.better.not.exist');
+    $this->config('this.had.better.not.exist')->set('foo', 'bar')->save();
+  }
+
+  /**
+   * Tests that schemas errors are detected.
+   */
+  public function testConfigSchemaCheckIncorrectSchema() {
+    $this->setExpectedException(SchemaIncompleteException::class, 'Schema errors for system.site with the following errors: system.site:foo missing schema');
+    $this->config('system.site')->set('foo', 'bar')->save();
+  }
+
 }
diff --git a/core/tests/Drupal/Tests/BrowserTestBase.php b/core/tests/Drupal/Tests/BrowserTestBase.php
index 01e15d0..f2e9565 100644
--- a/core/tests/Drupal/Tests/BrowserTestBase.php
+++ b/core/tests/Drupal/Tests/BrowserTestBase.php
@@ -155,6 +155,31 @@
   protected $configImporter;
 
   /**
+   * Set to TRUE to strict check all configuration saved.
+   *
+   * @see \Drupal\Core\Config\Testing\ConfigSchemaChecker
+   *
+   * @var bool
+   */
+  protected $strictConfigSchema = TRUE;
+
+  /**
+   * An array of config object names that are excluded from schema checking.
+   *
+   * @var string[]
+   */
+  protected static $configSchemaCheckerExclusions = array(
+    // Following are used to test lack of or partial schema. Where partial
+    // schema is provided, that is explicitly tested in specific tests.
+    'config_schema_test.noschema',
+    'config_schema_test.someschema',
+    'config_schema_test.schema_data_types',
+    'config_schema_test.no_schema_data_types',
+    // Used to test application of schema to filtering of configuration.
+    'config_test.dynamic.system',
+  );
+
+  /**
    * The profile to install as a basis for testing.
    *
    * @var string
@@ -990,6 +1015,17 @@ public function installDrupal() {
     }
     // Copy the testing-specific service overrides in place.
     copy($settings_services_file, $directory . '/services.yml');
+    if ($this->strictConfigSchema) {
+      // Add a listener to validate configuration schema on save.
+      $content = file_get_contents($directory . '/services.yml');
+      $services = Yaml::decode($content);
+      $services['services']['simpletest.config_schema_checker'] = [
+        'class' => 'Drupal\Core\Config\Testing\ConfigSchemaChecker',
+        'arguments' => ['@config.typed', $this->getConfigSchemaExclusions()],
+        'tags' => [['name' => 'event_subscriber']]
+      ];
+      file_put_contents($directory . '/services.yml', Yaml::encode($services));
+    }
 
     // Since Drupal is bootstrapped already, install_begin_request() will not
     // bootstrap into DRUPAL_BOOTSTRAP_CONFIGURATION (again). Hence, we have to
@@ -1686,4 +1722,23 @@ protected function setContainerParameter($name, $value) {
     $file_cache->delete($filename);
   }
 
+  /**
+   * Gets the config schema exclusions for this test.
+   *
+   * @return string[]
+   *   An array of config object names that are excluded from schema checking.
+   */
+  protected function getConfigSchemaExclusions() {
+    $class = get_class($this);
+    $exceptions = [];
+    while ($class) {
+      if (property_exists($class, 'configSchemaCheckerExclusions')) {
+        $exceptions = array_merge($exceptions, $class::$configSchemaCheckerExclusions);
+      }
+      $class = get_parent_class($class);
+    }
+    // Filter out any duplicates.
+    return array_unique($exceptions);
+  }
+
 }
