diff --git a/django/test/simple.py b/django/test/simple.py
--- a/django/test/simple.py
+++ b/django/test/simple.py
@@ -73,8 +73,8 @@
     return suite
 
 def build_test(label):
-    """Construct a test case a test with the specified label. Label should 
-    be of the form model.TestClass or model.TestClass.test_method. Returns
+    """Construct a test case with the specified label. Label should
+    be of the form app.TestClass or app.TestClass.test_method. Returns
     an instantiated test or test suite corresponding to the label provided.
         
     """
@@ -99,7 +99,7 @@
     else: # label is app.TestClass.test_method
         return TestClass(parts[2])
 
-def run_tests(test_labels, verbosity=1, interactive=True, extra_tests=[]):
+def run_tests(test_labels, verbosity=1, interactive=True, extra_tests=None, exclude_labels=None):
     """
     Run the unit tests for all the test labels in the provided list.
     Labels must be of the form:
@@ -115,16 +115,28 @@
     
     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.
     """
     setup_test_environment()
-    
-    settings.DEBUG = False    
+
+    if extra_tests is None:
+        extra_tests = []
+    if exclude_labels is None:
+        exclude_labels = []
+
+    settings.DEBUG = False
     suite = unittest.TestSuite()
     
     if test_labels:
         for label in test_labels:
+            if label in exclude_labels:
+                if verbosity >= 1:
+                    print 'Skipping test %s' % label
+                continue
             if '.' in label:
                 suite.addTest(build_test(label))
             else:
diff --git a/tests/runtests.py b/tests/runtests.py
--- a/tests/runtests.py
+++ b/tests/runtests.py
@@ -32,24 +32,24 @@
     'django.contrib.admin',
 ]
 
-def get_test_models():
-    models = []
+def get_test_modules():
+    modules = []
     for loc, dirpath in (MODEL_TESTS_DIR_NAME, MODEL_TEST_DIR), (REGRESSION_TESTS_DIR_NAME, REGRESSION_TEST_DIR), (CONTRIB_DIR_NAME, CONTRIB_DIR):
         for f in os.listdir(dirpath):
             if f.startswith('__init__') or f.startswith('.') or f.startswith('sql') or f.startswith('invalid'):
                 continue
-            models.append((loc, f))
-    return models
+            modules.append((loc, f))
+    return modules
 
-def get_invalid_models():
-    models = []
+def get_invalid_tests_modules():
+    modules = []
     for loc, dirpath in (MODEL_TESTS_DIR_NAME, MODEL_TEST_DIR), (REGRESSION_TESTS_DIR_NAME, REGRESSION_TEST_DIR), (CONTRIB_DIR_NAME, CONTRIB_DIR):
         for f in os.listdir(dirpath):
             if f.startswith('__init__') or f.startswith('.') or f.startswith('sql'):
                 continue
             if f.startswith('invalid'):
-                models.append((loc, f))
-    return models
+                modules.append((loc, f))
+    return modules
 
 class InvalidModelTestCase(unittest.TestCase):
     def __init__(self, model_label):
@@ -85,8 +85,11 @@
         self.assert_(not unexpected, "Unexpected Errors: " + '\n'.join(unexpected))
         self.assert_(not missing, "Missing Errors: " + '\n'.join(missing))
 
-def django_tests(verbosity, interactive, test_labels):
+def django_tests(verbosity, interactive, test_labels, exclude_labels=None):
     from django.conf import settings
+
+    if exclude_labels is None:
+        exclude_labels = []
 
     old_installed_apps = settings.INSTALLED_APPS
     old_test_database_name = settings.TEST_DATABASE_NAME
@@ -118,39 +121,46 @@
     get_apps()
 
     # Load all the test model apps.
-    for model_dir, model_name in get_test_models():
-        model_label = '.'.join([model_dir, model_name])
+    test_labels_set = set([label.split('.')[0] for label in test_labels if label not in exclude_labels])
+    for module_dir, module_name in get_test_modules():
+        module_label = '.'.join([module_dir, module_name])
         try:
-            # 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 not test_labels or model_name in set([label.split('.')[0] for label in test_labels]):
+            # if the module was named on the command line, or
+            # no modules were named (i.e., run all), import
+            # this module and add it to the list to test.
+            if not test_labels or module_name in test_labels_set:
+                if module_name in exclude_labels:
+                    if verbosity >= 1:
+                        print "Skipping app %s" % module_name
+                    continue
                 if verbosity >= 1:
-                    print "Importing model %s" % model_name
-                mod = load_app(model_label)
+                    print "Importing app %s" % module_name
+                mod = load_app(module_label)
                 if mod:
-                    if model_label not in settings.INSTALLED_APPS:
-                        settings.INSTALLED_APPS.append(model_label)
+                    if module_label not in settings.INSTALLED_APPS:
+                        settings.INSTALLED_APPS.append(module_label)
         except Exception, e:
-            sys.stderr.write("Error while importing %s:" % model_name + ''.join(traceback.format_exception(*sys.exc_info())[1:]))
+            sys.stderr.write("Error while importing %s:" % module_name + ''.join(traceback.format_exception(*sys.exc_info())[1:]))
             continue
 
-    # Add tests for invalid models.
+    # Add tests for invalid models apps.
     extra_tests = []
-    for model_dir, model_name in get_invalid_models():
-        model_label = '.'.join([model_dir, model_name])
-        if not test_labels or model_name in test_labels:
-            extra_tests.append(InvalidModelTestCase(model_label))
+    for module_dir, module_name in get_invalid_tests_modules():
+        module_label = '.'.join([module_dir, module_name])
+        if not test_labels or module_name in test_labels:
+            extra_tests.append(InvalidModelTestCase(module_label))
             try:
-                # Invalid models are not working apps, so we cannot pass them into
-                # the test runner with the other test_labels
-                test_labels.remove(model_name)
+                # Invalid models apps are not working apps, so we cannot pass
+                # them into the test runner with the other test_labels
+                test_labels.remove(module_name)
             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.simple import run_tests
-    failures = run_tests(test_labels, verbosity=verbosity, interactive=interactive, extra_tests=extra_tests)
+    failures = run_tests(test_labels, verbosity=verbosity, interactive=interactive,
+        extra_tests=extra_tests, exclude_labels=exclude_labels)
     if failures:
         sys.exit(failures)
 
@@ -165,7 +175,7 @@
 
 if __name__ == "__main__":
     from optparse import OptionParser
-    usage = "%prog [options] [model model model ...]"
+    usage = "%prog [options] [module module module ...]"
     parser = OptionParser(usage=usage)
     parser.add_option('-v','--verbosity', action='store', dest='verbosity', default='0',
         type='choice', choices=['0', '1', '2'],
@@ -174,10 +184,12 @@
         help='Tells Django to NOT prompt the user for input of any kind.')
     parser.add_option('--settings',
         help='Python path to settings module, e.g. "myproject.settings". If this isn\'t provided, the DJANGO_SETTINGS_MODULE environment variable will be used.')
+    parser.add_option('-e', '--exclude', action='append', dest='exclude', default=[],
+        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
     elif "DJANGO_SETTINGS_MODULE" not in os.environ:
         parser.error("DJANGO_SETTINGS_MODULE is not set in the environment. "
                       "Set it or use --settings.")
-    django_tests(int(options.verbosity), options.interactive, args)
+    django_tests(int(options.verbosity), options.interactive, args, options.exclude)
