diff --git a/django/test/simple.py b/django/test/simple.py
--- a/django/test/simple.py
+++ b/django/test/simple.py
@@ -1,6 +1,3 @@
-import sys
-import signal
-
 from django.conf import settings
 from django.db.models import get_app, get_apps
 from django.test import _doctest as doctest
@@ -26,7 +23,7 @@
     try:
         app_path = app_module.__name__.split('.')[:-1]
         test_module = __import__('.'.join(app_path + [TEST_MODULE]), {}, {}, TEST_MODULE)
-    except ImportError, e:
+    except ImportError:
         # Couldn't import tests.py. Was it due to a missing file, or
         # due to an import error in a tests.py that actually exists?
         import os.path
@@ -198,8 +195,19 @@
     def build_suite(self, test_labels, extra_tests=None, **kwargs):
         suite = unittest.TestSuite()
 
+        exclude_labels = kwargs.get('exclude_labels')
+        if exclude_labels is None:
+            exclude_labels = []
+
         if test_labels:
             for label in test_labels:
+                if label in exclude_labels:
+                    if self.verbosity >= 1:
+                        if '.' in label:
+                            print 'Skipping %s test' % label
+                        else:
+                            print 'Skipping tests from app %s' % label
+                    continue
                 if '.' in label:
                     suite.addTest(build_test(label))
                 else:
@@ -269,10 +277,14 @@
         A list of 'extra' tests may also be provided; these tests
         will be added to the test suite.
 
+        It's also possible to specify a list of labels to exclude from the
+        test suite by using the exclude_labels parameter.
+
         Returns the number of tests that failed.
         """
+        exclude_labels = kwargs.get('exclude_labels')
         self.setup_test_environment()
-        suite = self.build_suite(test_labels, extra_tests)
+        suite = self.build_suite(test_labels, extra_tests, exclude_labels=exclude_labels)
         old_config = self.setup_databases()
         result = self.run_suite(suite)
         self.teardown_databases(old_config)
diff --git a/tests/runtests.py b/tests/runtests.py
--- a/tests/runtests.py
+++ b/tests/runtests.py
@@ -1,5 +1,7 @@
 #!/usr/bin/env python
-import os, subprocess, sys, traceback
+import os
+import subprocess
+import sys
 
 import django.contrib as contrib
 from django.utils import unittest
@@ -63,7 +65,7 @@
 
         try:
             module = load_app(self.model_label)
-        except Exception, e:
+        except Exception:
             self.fail('Unable to load invalid model module')
 
         # Make sure sys.stdout is not a tty so that we get errors without
@@ -72,7 +74,7 @@
         orig_stdout = sys.stdout
         s = StringIO()
         sys.stdout = s
-        count = get_validation_errors(s, module)
+        get_validation_errors(s, module)
         sys.stdout = orig_stdout
         s.seek(0)
         error_log = s.read()
@@ -85,7 +87,7 @@
         self.assert_(not unexpected, "Unexpected Errors: " + '\n'.join(unexpected))
         self.assert_(not missing, "Missing Errors: " + '\n'.join(missing))
 
-def setup(verbosity, test_labels):
+def setup(verbosity, test_labels, exclude_labels):
     from django.conf import settings
     state = {
         'INSTALLED_APPS': settings.INSTALLED_APPS,
@@ -116,20 +118,31 @@
     # in our tests.
     settings.MANAGERS = ("admin@djangoproject.com",)
 
+    if exclude_labels is None:
+        exclude_labels = []
+
     # Load all the ALWAYS_INSTALLED_APPS.
     # (This import statement is intentionally delayed until after we
     # access settings because of the USE_I18N dependency.)
     from django.db.models.loading import get_apps, load_app
     get_apps()
 
+    # Only avoid loading an app if it is fully excluded, if testcases or test
+    # methods names were excluded then load its apps normally
+    exclude_apps = [label for label in exclude_labels if '.' not in label]
+
     # Load all the test model apps.
-    test_labels_set = set([label.split('.')[0] for label in test_labels])
+    test_labels_set = set([label.split('.')[0] for label in test_labels if label not in exclude_apps])
     for model_dir, model_name in get_test_models():
         model_label = '.'.join([model_dir, model_name])
-        # if the model was named on the command line, or
-        # no models were named (i.e., run all), import
-        # this model and add it to the list to test.
+        # if the model was named on the command line, or no models were named
+        # (i.e., run all), import this model and add it to the list to test.
+        # Also, skip importing the test apps explicitly excluded by the user.
         if not test_labels or model_name in test_labels_set:
+            if model_name in exclude_apps:
+                if verbosity >= 2:
+                    print "Skipping import of app %s" % model_name
+                continue
             if verbosity >= 2:
                 print "Importing model %s" % model_name
             mod = load_app(model_label)
@@ -145,9 +158,9 @@
     for key, value in state.items():
         setattr(settings, key, value)
 
-def django_tests(verbosity, interactive, failfast, test_labels):
+def django_tests(verbosity, interactive, failfast, test_labels, exclude_labels=None):
     from django.conf import settings
-    state = setup(verbosity, test_labels)
+    state = setup(verbosity, test_labels, exclude_labels)
 
     # Add tests for invalid models.
     extra_tests = []
@@ -162,7 +175,8 @@
             except ValueError:
                 pass
 
-    # Run the test suite, including the extra validation tests.
+    # Run the test suite, including the extra validation tests and skipping
+    # the test explicitely excluded.
     from django.test.utils import get_runner
     if not hasattr(settings, 'TEST_RUNNER'):
         settings.TEST_RUNNER = 'django.test.simple.DjangoTestSuiteRunner'
@@ -180,7 +194,7 @@
             extra_tests=extra_tests)
     else:
         test_runner = TestRunner(verbosity=verbosity, interactive=interactive, failfast=failfast)
-        failures = test_runner.run_tests(test_labels, extra_tests=extra_tests)
+        failures = test_runner.run_tests(test_labels, extra_tests=extra_tests, exclude_labels=exclude_labels)
 
     teardown(state)
     return failures
@@ -299,6 +313,8 @@
         help="Bisect the test suite to discover a test that causes a test failure when combined with the named test.")
     parser.add_option('--pair', action='store', dest='pair', default=None,
         help="Run the test suite in pairs with the named test to find problem pairs.")
+    parser.add_option('-e', '--exclude', action='append', dest='exclude', default=None,
+        help='Test to exclude (use multiple times to exclude multiple tests).')
     options, args = parser.parse_args()
     if options.settings:
         os.environ['DJANGO_SETTINGS_MODULE'] = options.settings
@@ -311,6 +327,12 @@
     elif options.pair:
         paired_tests(options.pair, options, args)
     else:
-        failures = django_tests(int(options.verbosity), options.interactive, options.failfast, args)
+        failures = django_tests(
+                int(options.verbosity),
+                options.interactive,
+                options.failfast,
+                args,
+                options.exclude
+            )
         if failures:
             sys.exit(bool(failures))
