test parallel form django django-orm django-testing

parallel - test form django



Django: ¿hay una manera de contar las consultas SQL de una prueba de unidad? (6)

Desde Django 1.3 hay un assertNumQueries disponible exactamente para este propósito.

Estoy intentando averiguar el número de consultas ejecutadas por una función de utilidad. He escrito una prueba de unidad para esta función y la función está funcionando bien. Lo que me gustaría hacer es rastrear la cantidad de consultas SQL ejecutadas por la función para que pueda ver si hay alguna mejora después de una refactorización.

def do_something_in_the_database(): # Does something in the database # return result class DoSomethingTests(django.test.TestCase): def test_function_returns_correct_values(self): self.assertEqual(n, <number of SQL queries executed>)

EDITAR: descubrí que hay una solicitud de función de Django pendiente para esto. Sin embargo, el boleto todavía está abierto. Mientras tanto, ¿hay otra manera de hacer esto?


En Django moderno (> = 1.8) está bien documentado (también está documentado en 1.7) here , tiene el método reset_queries en lugar de asignar connection.queries = [] que de hecho está generando un error, algo como eso funciona en django> = 1.8 :

class QueriesTests(django.test.TestCase): def test_queries(self): from django.conf import settings from django.db import connection, reset_queries try: settings.DEBUG = True # [... your ORM code ...] self.assertEquals(len(connection.queries), num_of_expected_queries) finally: settings.DEBUG = False reset_queries()

También puede considerar restablecer las consultas en setUp / tearDown para asegurarse de que las consultas se restablecen para cada prueba en lugar de hacerlo en la cláusula finally, pero de esta manera es más explícita (aunque más detallada), o puede usar reset_queries en la cláusula try tantas veces Como necesitas evaluar consultas contando desde 0.


La respuesta de Vinay es correcta, con una adición menor.

El marco de prueba de la unidad de Django en realidad establece DEBUG en False cuando se ejecuta, por lo que no importa lo que tenga en settings.py , no tendrá nada completado en las pruebas de connection.queries en su prueba de unidad a menos que vuelva a habilitar el modo de depuración. Los documentos de Django explican la justificación de esto como:

Independientemente del valor de la configuración DEBUG en su archivo de configuración, todas las pruebas de Django se ejecutan con DEBUG = False. Esto es para asegurar que la salida observada de su código coincida con lo que se verá en una configuración de producción.

Si está seguro de que habilitar la depuración no afectará sus pruebas (por ejemplo, si está probando específicamente las visitas a la base de datos, como suena), la solución es volver a habilitar temporalmente la depuración en su prueba de unidad y luego configurarla. de vuelta después

def test_myself(self): from django.conf import settings from django.db import connection settings.DEBUG = True connection.queries = [] # Test code as normal self.assert_(connection.queries) settings.DEBUG = False


Si está usando pytest , pytest-django tiene el accesorio django_assert_num_queries para este propósito:

def test_queries(django_assert_num_queries): with django_assert_num_queries(3): Item.objects.create(''foo'') Item.objects.create(''bar'') Item.objects.create(''baz'')


Si no desea usar TestCase (con assertNumQueries ) o cambiar la configuración a DEBUG = True, puede usar el administrador de contexto CaptureQueriesContext (igual que assertNumQueries usando).

from django.db import ConnectionHandler from django.test.utils import CaptureQueriesContext DB_NAME = "default" # name of db configured in settings you want to use - "default" is standard connection = ConnectionHandler()[DB_NAME] with CaptureQueriesContext(connection) as context: ... # do your thing num_queries = context.initial_queries - context.final_queries assert num_queries == expected_num_queries

configuración de db


Si tiene DEBUG configurado en Verdadero en su settings.py (probablemente en su entorno de prueba), entonces puede contar las consultas ejecutadas en su prueba de la siguiente manera:

from django.db import connection class DoSomethingTests(django.test.TestCase): def test_something_or_other(self): num_queries_old = len(connection.queries) do_something_in_the_database() num_queries_new = len(connection.queries) self.assertEqual(n, num_queries_new - num_queries_old)