Index: django/core/management/commands/loaddata.py
===================================================================
--- django/core/management/commands/loaddata.py	(revision 6669)
+++ django/core/management/commands/loaddata.py	(working copy)
@@ -58,11 +58,16 @@
                 else:
                     formats = []
 
-            if verbosity > 0:
-                if formats:
+            if formats:
+                if verbosity > 0:
                     print "Loading '%s' fixtures..." % fixture_name
-                else:
-                    print "Skipping fixture '%s': %s is not a known serialization format" % (fixture_name, format)
+            else:
+                sys.stderr.write(
+                    self.style.ERROR("Problem installing fixture '%s': %s is not a known serialization format." %
+                         (fixture_name, format)))
+                transaction.rollback()
+                transaction.leave_transaction_management()
+                return
 
             for fixture_dir in app_fixtures + list(settings.FIXTURE_DIRS) + ['']:
                 if verbosity > 1:
@@ -109,7 +114,7 @@
                         if verbosity > 1:
                             print "No %s fixture '%s' in %s." % \
                                 (format, fixture_name, humanize(fixture_dir))
-
+                
         if count[0] > 0:
             sequence_sql = connection.ops.sequence_reset_sql(self.style, models)
             if sequence_sql:
@@ -117,6 +122,14 @@
                     print "Resetting sequences"
                 for line in sequence_sql:
                     cursor.execute(line)
+        elif count[1] > 0:
+            # If we found a fixture file to load, but no objects were loaded, assume error.
+            sys.stderr.write(
+                self.style.ERROR("No fixture data found for '%s'. (File format may be invalid.)" %
+                    (fixture_name)))
+            transaction.rollback()
+            transaction.leave_transaction_management()
+            return
 
         transaction.commit()
         transaction.leave_transaction_management()
Index: tests/regressiontests/fixtures_regress/models.py
===================================================================
--- tests/regressiontests/fixtures_regress/models.py	(revision 6669)
+++ tests/regressiontests/fixtures_regress/models.py	(working copy)
@@ -49,4 +49,26 @@
 >>> Stuff.objects.all()
 [<Stuff: None is owned by None>]
 
+###############################################
+# Test for ticket #4371 -- fixture loading fails silently in testcases
+# Validate that error conditions are caught correctly
+
+# redirect stderr for the next few tests...
+>>> import sys
+>>> savestderr = sys.stderr
+>>> sys.stderr = sys.stdout
+
+# Loading data of an unknown format should fail
+>>> management.call_command('loaddata', 'bad_fixture1.unkn', verbosity=0)
+Problem installing fixture 'bad_fixture1': unkn is not a known serialization format.
+
+# Loading a fixture file with invalid data using explicit filename
+>>> management.call_command('loaddata', 'bad_fixture2.xml', verbosity=0)
+No fixture data found for 'bad_fixture2'. (File format may be invalid.)
+
+# Loading a fixture file with invalid data without file extension
+>>> management.call_command('loaddata', 'bad_fixture2', verbosity=0)
+No fixture data found for 'bad_fixture2'. (File format may be invalid.)
+
+>>> sys.stderr = savestderr
 """}
