diff -r 93cbbb7609e6 django/test/simple.py
--- a/django/test/simple.py	Sat Aug 16 09:33:36 2008 -0300
+++ b/django/test/simple.py	Sat Aug 16 11:32:12 2008 -0300
@@ -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=[], all_excluded=False):
     """
     Run the unit tests for all the test labels in the provided list.
     Labels must be of the form:
@@ -122,14 +122,24 @@
     
     settings.DEBUG = False    
     suite = unittest.TestSuite()
-    
-    if test_labels:
+
+    if all_excluded:
+        tmp = [model[1:] for model in test_labels]
+        test_labels = set(tmp)
+
+    if test_labels and not all_excluded:
         for label in test_labels:
             if '.' in label:
                 suite.addTest(build_test(label))
             else:
                 app = get_app(label)
                 suite.addTest(build_suite(app))
+    elif all_excluded:
+        for app in get_apps():
+            if app.__name__.split('.')[-2] in test_labels:
+                print 'skipping %s' % app.__name__
+                continue
+            suite.addTest(build_suite(app))
     else:
         for app in get_apps():
             suite.addTest(build_suite(app))
diff -r 93cbbb7609e6 tests/runtests.py
--- a/tests/runtests.py	Sat Aug 16 09:33:36 2008 -0300
+++ b/tests/runtests.py	Sat Aug 16 11:32:12 2008 -0300
@@ -117,14 +117,23 @@
     from django.db.models.loading import get_apps, load_app
     get_apps()
 
+    if not test_labels:
+        all_excluded = False
+    else:
+        all_excluded = True
+        for tl in test_labels:
+            if tl[0] != '-':
+                all_excluded = False
+
     # Load all the test model apps.
+    test_label_set = set([label.split('.')[0] for label in test_labels])
     for model_dir, model_name in get_test_models():
         model_label = '.'.join([model_dir, model_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 not test_labels or all_excluded or model_name in test_label_set:
                 if verbosity >= 1:
                     print "Importing model %s" % model_name
                 mod = load_app(model_label)
@@ -150,7 +159,7 @@
     
     # Run the test suite, including the extra validation tests.
     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, all_excluded=all_excluded)
     if failures:
         sys.exit(failures)
 
