[PYTHON] AssertNumQueries ist nützlich, wenn Sie N + 1-Abfragen einfach mit django testen möchten

AssertNumQueries ist nützlich, wenn Sie N + 1-Abfragen einfach mit django testen möchten

Bei der Migration von django 1.7 gibt assertNumQueries das Ergebnis der erfassten Abfrage aus, wenn dies fehlschlägt. Es kam, um mir zu geben. Wenn Sie also den folgenden Code schreiben, können Sie die Abfrage der Datenbank verstehen, die in dem mit beiliegenden Teil ausgegeben wurde.

from django.test import TestCase

class Test(TestCase):
    def _callFUT(self):
        Model(name="foo").save()
        return Model.objects.count()

    def test_it(self):
        with self.assertNumQueries(3):
            self.assertEqual(self._callFUT(), 1)

Im obigen Code können Sie beispielsweise herausfinden, wie viele Abfragen in "self._callFUT ()" ausgeführt wurden. Ursprünglich gibt es zwei Fälle, aber ich habe 3 für "assertNumQueries ()" angegeben und es absichtlich zum Scheitern gebracht.

Ausführungsergebnis

Creating test database for alias 'default'...
F
======================================================================
FAIL: test_it (__main__.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "qr_34141zLt.py", line 46, in test_it
    self.assertEqual(self._callFUT(), 1)
  File "/home/podhmo/vboxshare/venvs/django/lib/python3.3/site-packages/django/test/testcases.py", line 90, in __exit__
    query['sql'] for query in self.captured_queries
AssertionError: 2 != 3 : 2 queries executed, 3 expected
Captured queries were:
QUERY = 'INSERT INTO "model" ("name") VALUES (%s)' - PARAMS = ('foo',)
QUERY = 'SELECT COUNT(*) AS "__count" FROM "model"' - PARAMS = ()

----------------------------------------------------------------------
Ran 1 test in 0.005s

FAILED (failures=1)
Destroying test database for alias 'default'...

Sie können die ausgegebene Abfrage sehen.

Wenn Sie die Abfrage kennen möchten, die in einem anderen Bereich als test ausgegeben wurde

Möglicherweise können Sie django.test.utils.CaptureQueriesContext verwenden.

Bitte geben Sie Ihr Bestes mit dem folgenden Gefühl

from django.test.utils import CaptureQueriesContext
from django.db import connections

with CaptureQueriesContext(connections["default"]):
    do_something()

Wrote by PileMd

Referenz

Recommended Posts

AssertNumQueries ist nützlich, wenn Sie N + 1-Abfragen einfach mit django testen möchten
[OpenCV] Wenn Sie überprüfen möchten, ob es mit imread richtig gelesen wird
nb_conda_kernels wird empfohlen, wenn Sie die virtuelle Umgebung mit jupyter betreten möchten
Wenn Sie mit dem Django REST-Framework filtern möchten
Wenn Sie Datenwissenschaftler werden möchten, beginnen Sie mit Kaggle
Schreiben Sie Python nicht, wenn Sie es mit Python beschleunigen möchten
[TensorFlow] Wenn Sie TensorBoard ausführen möchten, installieren Sie es mit pip.
Wenn Sie es so verwenden möchten, wie es ist, wenn Sie es mit Lambda-Memo verwenden
Wenn Sie awsebcli in CircleCI aufnehmen möchten, geben Sie die Python-Version an
Wenn Sie mehrere Statistiken mit groupby of pandas v1 erhalten möchten
Ist Qt nicht die stärkste Bibliothek für die einfache Ausgabe von SVG?
Wenn Sie nicht wissen, wie Sie das gewünschte Diagramm mit matplotlib zeichnen sollen, können Sie sich die Galerie bequem ansehen
Wenn Sie den Wert mithilfe von Auswahlmöglichkeiten in der Vorlage im Django-Modell anzeigen möchten
5 Gründe, warum die Verarbeitung für diejenigen nützlich ist, die mit Python beginnen möchten
Wenn Sie einen Discord-Bot mit Python erstellen möchten, verwenden wir ein Framework
Wenn Sie Word Cloud erstellen möchten.
Manchmal möchten Sie mit DRF (Django REST Framework) auf View information from Serializer zugreifen.
Wenn die Variable, die Sie in Matplotlib als hochgestellt verwenden möchten, aus zwei oder mehr Zeichen besteht
Einstellungen, wenn Sie Python-Mecab mit Travis ausführen möchten
Wenn Sie Cython verwenden möchten, schließen Sie auch python-dev ein
Links, um mit Sublime Text zu tun, was Sie wollen
Dinge zu tun, wenn Sie anfangen, sich mit Django zu entwickeln
Nützliche Operation, wenn Sie alle Probleme in mehreren Programmiersprachen mit Codewars lösen möchten
Ein Liner, den Sie treffen sollten, wenn Sie vergessen, wo heute ist
Ich möchte initialisieren, wenn der Wert leer ist (Python)
Ich möchte R-Funktionen einfach mit ipython notebook verwenden
[Python] Wenn Sie plötzlich ein Anfrageformular erstellen möchten
Ich möchte einen Blog-Editor mit dem Administrator von Django erstellen
Verwenden Sie aggdraw, wenn Sie mit Kissen schön zeichnen möchten
Was tun, wenn Sie keine Dateien mit Indizes sortieren können?
Wenn Sie die Anfangsdaten von Django mit Relationen registrieren möchten
Wenn Sie möchten, dass Ihre Kollegen dieselbe Sprache verwenden
[Django] Was tun, wenn das zu erstellende Modell viele Felder enthält?
[Django] Erklären Sie den Fluchtweg sorgfältig, wenn Sie die Tabelle einer anderen Anwendung wirklich verwenden möchten