mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #28360 -- Fixed test runner crash with --debug-sql on fail/error in subTest.
This commit is contained in:
		
				
					committed by
					
						 Tim Graham
						Tim Graham
					
				
			
			
				
	
			
			
			
						parent
						
							61fd2b494a
						
					
				
				
					commit
					6de2930078
				
			| @@ -56,6 +56,13 @@ class DebugSQLTextTestResult(unittest.TextTestResult): | |||||||
|         self.debug_sql_stream.seek(0) |         self.debug_sql_stream.seek(0) | ||||||
|         self.failures[-1] = self.failures[-1] + (self.debug_sql_stream.read(),) |         self.failures[-1] = self.failures[-1] + (self.debug_sql_stream.read(),) | ||||||
|  |  | ||||||
|  |     def addSubTest(self, test, subtest, err): | ||||||
|  |         super().addSubTest(test, subtest, err) | ||||||
|  |         if err is not None: | ||||||
|  |             self.debug_sql_stream.seek(0) | ||||||
|  |             errors = self.failures if issubclass(err[0], test.failureException) else self.errors | ||||||
|  |             errors[-1] = errors[-1] + (self.debug_sql_stream.read(),) | ||||||
|  |  | ||||||
|     def printErrorList(self, flavour, errors): |     def printErrorList(self, flavour, errors): | ||||||
|         for test, err, sql_debug in errors: |         for test, err, sql_debug in errors: | ||||||
|             self.stream.writeln(self.separator1) |             self.stream.writeln(self.separator1) | ||||||
|   | |||||||
| @@ -26,12 +26,32 @@ class TestDebugSQL(unittest.TestCase): | |||||||
|             Person.objects.filter(first_name='error').count() |             Person.objects.filter(first_name='error').count() | ||||||
|             raise Exception |             raise Exception | ||||||
|  |  | ||||||
|  |     class PassingSubTest(TestCase): | ||||||
|  |         def runTest(self): | ||||||
|  |             with self.subTest(): | ||||||
|  |                 Person.objects.filter(first_name='subtest-pass').count() | ||||||
|  |  | ||||||
|  |     class FailingSubTest(TestCase): | ||||||
|  |         def runTest(self): | ||||||
|  |             with self.subTest(): | ||||||
|  |                 Person.objects.filter(first_name='subtest-fail').count() | ||||||
|  |                 self.fail() | ||||||
|  |  | ||||||
|  |     class ErrorSubTest(TestCase): | ||||||
|  |         def runTest(self): | ||||||
|  |             with self.subTest(): | ||||||
|  |                 Person.objects.filter(first_name='subtest-error').count() | ||||||
|  |                 raise Exception | ||||||
|  |  | ||||||
|     def _test_output(self, verbosity): |     def _test_output(self, verbosity): | ||||||
|         runner = DiscoverRunner(debug_sql=True, verbosity=0) |         runner = DiscoverRunner(debug_sql=True, verbosity=0) | ||||||
|         suite = runner.test_suite() |         suite = runner.test_suite() | ||||||
|         suite.addTest(self.FailingTest()) |         suite.addTest(self.FailingTest()) | ||||||
|         suite.addTest(self.ErrorTest()) |         suite.addTest(self.ErrorTest()) | ||||||
|         suite.addTest(self.PassingTest()) |         suite.addTest(self.PassingTest()) | ||||||
|  |         suite.addTest(self.PassingSubTest()) | ||||||
|  |         suite.addTest(self.FailingSubTest()) | ||||||
|  |         suite.addTest(self.ErrorSubTest()) | ||||||
|         old_config = runner.setup_databases() |         old_config = runner.setup_databases() | ||||||
|         stream = StringIO() |         stream = StringIO() | ||||||
|         resultclass = runner.get_resultclass() |         resultclass = runner.get_resultclass() | ||||||
| @@ -65,6 +85,12 @@ class TestDebugSQL(unittest.TestCase): | |||||||
|         ('''SELECT COUNT(*) AS "__count" ''' |         ('''SELECT COUNT(*) AS "__count" ''' | ||||||
|             '''FROM "test_runner_person" WHERE ''' |             '''FROM "test_runner_person" WHERE ''' | ||||||
|             '''"test_runner_person"."first_name" = 'fail';'''), |             '''"test_runner_person"."first_name" = 'fail';'''), | ||||||
|  |         ('''SELECT COUNT(*) AS "__count" ''' | ||||||
|  |             '''FROM "test_runner_person" WHERE ''' | ||||||
|  |             '''"test_runner_person"."first_name" = 'subtest-error';'''), | ||||||
|  |         ('''SELECT COUNT(*) AS "__count" ''' | ||||||
|  |             '''FROM "test_runner_person" WHERE ''' | ||||||
|  |             '''"test_runner_person"."first_name" = 'subtest-fail';'''), | ||||||
|     ] |     ] | ||||||
|  |  | ||||||
|     verbose_expected_outputs = [ |     verbose_expected_outputs = [ | ||||||
| @@ -73,9 +99,17 @@ class TestDebugSQL(unittest.TestCase): | |||||||
|             'runTest (test_runner.test_debug_sql.{}FailingTest) ... FAIL', |             'runTest (test_runner.test_debug_sql.{}FailingTest) ... FAIL', | ||||||
|             'runTest (test_runner.test_debug_sql.{}ErrorTest) ... ERROR', |             'runTest (test_runner.test_debug_sql.{}ErrorTest) ... ERROR', | ||||||
|             'runTest (test_runner.test_debug_sql.{}PassingTest) ... ok', |             'runTest (test_runner.test_debug_sql.{}PassingTest) ... ok', | ||||||
|  |             'runTest (test_runner.test_debug_sql.{}PassingSubTest) ... ok', | ||||||
|  |             # If there are errors/failures in subtests but not in test itself, | ||||||
|  |             # the status is not written. That behavior comes from Python. | ||||||
|  |             'runTest (test_runner.test_debug_sql.{}FailingSubTest) ...', | ||||||
|  |             'runTest (test_runner.test_debug_sql.{}ErrorSubTest) ...', | ||||||
|         ] |         ] | ||||||
|     ] + [ |     ] + [ | ||||||
|         ('''SELECT COUNT(*) AS "__count" ''' |         ('''SELECT COUNT(*) AS "__count" ''' | ||||||
|             '''FROM "test_runner_person" WHERE ''' |             '''FROM "test_runner_person" WHERE ''' | ||||||
|             '''"test_runner_person"."first_name" = 'pass';'''), |             '''"test_runner_person"."first_name" = 'pass';'''), | ||||||
|  |         ('''SELECT COUNT(*) AS "__count" ''' | ||||||
|  |             '''FROM "test_runner_person" WHERE ''' | ||||||
|  |             '''"test_runner_person"."first_name" = 'subtest-pass';'''), | ||||||
|     ] |     ] | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user