test_debug_sql.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import unittest
  2. from django.db import connection
  3. from django.test import TestCase
  4. from django.test.runner import DiscoverRunner
  5. from django.utils import six
  6. from .models import Person
  7. @unittest.skipUnless(connection.vendor == 'sqlite', 'Only run on sqlite so we can check output SQL.')
  8. class TestDebugSQL(unittest.TestCase):
  9. class PassingTest(TestCase):
  10. def runTest(self):
  11. Person.objects.filter(first_name='pass').count()
  12. class FailingTest(TestCase):
  13. def runTest(self):
  14. Person.objects.filter(first_name='fail').count()
  15. self.fail()
  16. class ErrorTest(TestCase):
  17. def runTest(self):
  18. Person.objects.filter(first_name='error').count()
  19. raise Exception
  20. def _test_output(self, verbosity):
  21. runner = DiscoverRunner(debug_sql=True, verbosity=0)
  22. suite = runner.test_suite()
  23. suite.addTest(self.FailingTest())
  24. suite.addTest(self.ErrorTest())
  25. suite.addTest(self.PassingTest())
  26. old_config = runner.setup_databases()
  27. stream = six.StringIO()
  28. resultclass = runner.get_resultclass()
  29. runner.test_runner(
  30. verbosity=verbosity,
  31. stream=stream,
  32. resultclass=resultclass,
  33. ).run(suite)
  34. runner.teardown_databases(old_config)
  35. stream.seek(0)
  36. return stream.read()
  37. def test_output_normal(self):
  38. full_output = self._test_output(1)
  39. for output in self.expected_outputs:
  40. self.assertIn(output, full_output)
  41. for output in self.verbose_expected_outputs:
  42. self.assertNotIn(output, full_output)
  43. def test_output_verbose(self):
  44. full_output = self._test_output(2)
  45. for output in self.expected_outputs:
  46. self.assertIn(output, full_output)
  47. for output in self.verbose_expected_outputs:
  48. self.assertIn(output, full_output)
  49. if six.PY3:
  50. expected_outputs = [
  51. ('''QUERY = 'SELECT COUNT(%s) AS "__count" '''
  52. '''FROM "test_runner_person" WHERE '''
  53. '''"test_runner_person"."first_name" = %s' '''
  54. '''- PARAMS = ('*', 'error');'''),
  55. ('''QUERY = 'SELECT COUNT(%s) AS "__count" '''
  56. '''FROM "test_runner_person" WHERE '''
  57. '''"test_runner_person"."first_name" = %s' '''
  58. '''- PARAMS = ('*', 'fail');'''),
  59. ]
  60. else:
  61. expected_outputs = [
  62. ('''QUERY = u'SELECT COUNT(%s) AS "__count" '''
  63. '''FROM "test_runner_person" WHERE '''
  64. '''"test_runner_person"."first_name" = %s' '''
  65. '''- PARAMS = (u'*', u'error');'''),
  66. ('''QUERY = u'SELECT COUNT(%s) AS "__count" '''
  67. '''FROM "test_runner_person" WHERE '''
  68. '''"test_runner_person"."first_name" = %s' '''
  69. '''- PARAMS = (u'*', u'fail');'''),
  70. ]
  71. verbose_expected_outputs = [
  72. 'runTest (test_runner.test_debug_sql.FailingTest) ... FAIL',
  73. 'runTest (test_runner.test_debug_sql.ErrorTest) ... ERROR',
  74. 'runTest (test_runner.test_debug_sql.PassingTest) ... ok',
  75. ]
  76. if six.PY3:
  77. verbose_expected_outputs += [
  78. ('''QUERY = 'SELECT COUNT(%s) AS "__count" '''
  79. '''FROM "test_runner_person" WHERE '''
  80. '''"test_runner_person"."first_name" = %s' '''
  81. '''- PARAMS = ('*', 'pass');'''),
  82. ]
  83. else:
  84. verbose_expected_outputs += [
  85. ('''QUERY = u'SELECT COUNT(%s) AS "__count" '''
  86. '''FROM "test_runner_person" WHERE '''
  87. '''"test_runner_person"."first_name" = %s' '''
  88. '''- PARAMS = (u'*', u'pass');'''),
  89. ]