diff --git a/core/scripts/run-tests.sh b/core/scripts/run-tests.sh
index 54f619b..3733407 100755
--- a/core/scripts/run-tests.sh
+++ b/core/scripts/run-tests.sh
@@ -307,11 +307,19 @@ function simpletest_script_execute_batch($test_classes) {
       if (empty($test_classes)) {
         break;
       }
+      // Do not attempt to execute abstract classes.
+      // Abstract classes should be filtered out at this point already.
+      // This is the last line of defense.
+      // @see simpletest_script_get_test_list()
+      $test_class = array_shift($test_classes);
+      $class_info = new \ReflectionClass($test_class);
+      if ($class_info->isAbstract()) {
+        continue;
+      }
 
       // Fork a child process.
       $test_id = db_insert('simpletest_test_id')->useDefaults(array('test_id'))->execute();
       $test_ids[] = $test_id;
-      $test_class = array_shift($test_classes);
       $command = simpletest_script_command($test_id, $test_class);
       $process = proc_open($command, array(), $pipes, NULL, NULL, array('bypass_shell' => TRUE));
 
@@ -549,6 +557,13 @@ function simpletest_script_get_test_list() {
     }
   }
 
+  // Filter out abstract classes.
+  foreach ($test_list as $i => $test_class) {
+    $class_info = new \ReflectionClass($test_class);
+    if ($class_info->isAbstract()) {
+      unset($test_list[$i]);
+    }
+  }
   if (empty($test_list)) {
     simpletest_script_print_error('No valid tests were specified.');
     exit;
