2
0

test_debug_sql.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import sys
  2. import unittest
  3. from django.db import connection
  4. from django.test import TestCase
  5. from django.test.runner import DiscoverRunner
  6. from django.utils import six
  7. from django.utils.encoding import force_text
  8. from .models import Person
  9. @unittest.skipUnless(connection.vendor == 'sqlite', 'Only run on sqlite so we can check output SQL.')
  10. class TestDebugSQL(unittest.TestCase):
  11. class PassingTest(TestCase):
  12. def runTest(self):
  13. Person.objects.filter(first_name='pass').count()
  14. class FailingTest(TestCase):
  15. def runTest(self):
  16. Person.objects.filter(first_name='fail').count()
  17. self.fail()
  18. class ErrorTest(TestCase):
  19. def runTest(self):
  20. Person.objects.filter(first_name='error').count()
  21. raise Exception
  22. def _test_output(self, verbosity):
  23. runner = DiscoverRunner(debug_sql=True, verbosity=0)
  24. suite = runner.test_suite()
  25. suite.addTest(self.FailingTest())
  26. suite.addTest(self.ErrorTest())
  27. suite.addTest(self.PassingTest())
  28. old_config = runner.setup_databases()
  29. stream = six.StringIO()
  30. resultclass = runner.get_resultclass()
  31. runner.test_runner(
  32. verbosity=verbosity,
  33. stream=stream,
  34. resultclass=resultclass,
  35. ).run(suite)
  36. runner.teardown_databases(old_config)
  37. if six.PY2:
  38. stream.buflist = [force_text(x) for x in stream.buflist]
  39. return stream.getvalue()
  40. def test_output_normal(self):
  41. full_output = self._test_output(1)
  42. for output in self.expected_outputs:
  43. self.assertIn(output, full_output)
  44. for output in self.verbose_expected_outputs:
  45. self.assertNotIn(output, full_output)
  46. def test_output_verbose(self):
  47. full_output = self._test_output(2)
  48. for output in self.expected_outputs:
  49. self.assertIn(output, full_output)
  50. for output in self.verbose_expected_outputs:
  51. self.assertIn(output, full_output)
  52. expected_outputs = [
  53. ('''SELECT COUNT(*) AS "__count" '''
  54. '''FROM "test_runner_person" WHERE '''
  55. '''"test_runner_person"."first_name" = 'error';'''),
  56. ('''SELECT COUNT(*) AS "__count" '''
  57. '''FROM "test_runner_person" WHERE '''
  58. '''"test_runner_person"."first_name" = 'fail';'''),
  59. ]
  60. verbose_expected_outputs = [
  61. # Output format changed in Python 3.5+
  62. x.format('' if sys.version_info < (3, 5) else 'TestDebugSQL.') for x in [
  63. 'runTest (test_runner.test_debug_sql.{}FailingTest) ... FAIL',
  64. 'runTest (test_runner.test_debug_sql.{}ErrorTest) ... ERROR',
  65. 'runTest (test_runner.test_debug_sql.{}PassingTest) ... ok',
  66. ]
  67. ] + [
  68. ('''SELECT COUNT(*) AS "__count" '''
  69. '''FROM "test_runner_person" WHERE '''
  70. '''"test_runner_person"."first_name" = 'pass';'''),
  71. ]