Как-то раз мне понадобилось проверить, что после вызова определенной функции кол-во SQL запросов не изменилось. Просто? Конечно :)
from django.db import connection
from django.test import TestCase
class TestSomething(TestCase):
def test_something(self):
counter = len(connection.queries)
something()
self.assertEquals(len(connection.queries), counter)
И все бы ничего, но не реализовав необходимый функционал в something
, я запустил тесты и с удивлением обнаружил, что они прошли чисто. Хм, не порядок, подумал я и добавил еще одну проверку:
self.assertNotEquals(len(connection.queries), counter)
Потом я запустил еще раз тесты и получил AssertionError: 0 == 0
. Теперь все стало ясно, по дефолту в Django тестах нельзя посчитать количество SQL запросов, как len(connection.queries)
.
Однако я явно был не первым человеком, который столкнулся с этой проблемой и потому после недолгого гугления, я нашел весьма себе решение. Начальная его версия описана в комментах к похожему вопросу на StackedOverflow. Я просто укажу, как я применил это решение в моем случае. Итак, начальный код преобразовался в:
from django.conf import settings
from django.db import connection
from django.test import TestCase
class TestSomething(TestCase):
def setUp(self):
self.old_DEBUG = settings.DEBUG
self.old_queries = connection.queries
settings.DEBUG = True
connection.queries = []
def tearDown(self):
settings.DEBUG = self.old_DEBUG
connection.queries = self.old_queries
def test_something(self):
counter = len(connection.queries)
something()
self.assertEquals(len(connection.queries), counter)
И после запуска, тест упал как и ему было положено. Вот таким образом я смог посчитать кол-во запросов в Django тестах, чего и вам желаю!
зы. В комментариях подсказали более элегантный способ для подсчета количества SQL запросов в Django 1.3, просто используя метод assertNumQueries
.