5 июля 2011 г.

Считаем количество SQL запросов в Django тестах

Как-то раз мне понадобилось проверить, что после вызова определенной функции кол-во 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.

blog comments powered by Disqus