[PYTHON] Wenn Sie einen Test mit DB mit django schreiben, ist es möglicherweise schneller, `setUpTestData ()` zu verwenden

Wenn Sie einen Test mit DB mit django schreiben, ist es möglicherweise schneller, setUpTestData () zu verwenden

Wenn Sie einen Test mit DB mit django schreiben, können Sie ihn möglicherweise schneller ausführen, indem Sie setUpTestData () verwenden.

setUpTestData()

setUpTestData () ist normalerweise setUp () für jede Methode Dies dient zur Durchführung der Modellinitialisierung usw., die in Klasseneinheiten durchgeführt wird. (Es kann ein wenig interessant sein, wenn Sie sich die interne Implementierung ansehen.)

Wenn Sie klassenweise initialisiert werden, wird dies natürlich nur einmal aufgerufen. Sie müssen also vorsichtig sein, wenn Sie den Status aktualisieren.

class Tests(TestCase):
    def setUp(self):
        from django.contrib.auth.models import User
        for i in range(110):
            User.objects.create_superuser("admin{}".format(i), "myemail{}@example.com".format(i), '')

    def test_query(self):
        from django.contrib.auth.models import User
        with self.assertNumQueries(1):
            actual = User.objects.filter(username__startswith="admin1").count()
            self.assertEqual(actual, 11)

    def test_query1(self):
        from django.contrib.auth.models import User
        with self.assertNumQueries(1):
            actual = User.objects.filter(username__startswith="admin1").count()
            self.assertEqual(actual, 11)

    def test_query2(self):
        from django.contrib.auth.models import User
        with self.assertNumQueries(1):
            actual = User.objects.filter(username__startswith="admin1").count()
            self.assertEqual(actual, 11)

class Tests(TestCase):
    @classmethod
    def setUpTestData(cls):
        from django.contrib.auth.models import User
        for i in range(100):
            User.objects.create_superuser("admin{}".format(i), "myemail{}@example.com".format(i), '')

    def test_query(self):
        from django.contrib.auth.models import User
        with self.assertNumQueries(1):
            actual = User.objects.filter(username__startswith="admin1").count()
            self.assertEqual(actual, 11)

    def test_query1(self):
        from django.contrib.auth.models import User
        with self.assertNumQueries(1):
            actual = User.objects.filter(username__startswith="admin1").count()
            self.assertEqual(actual, 11)

    def test_query2(self):
        from django.contrib.auth.models import User
        with self.assertNumQueries(1):
            actual = User.objects.filter(username__startswith="admin1").count()
            self.assertEqual(actual, 11)

Angenommen, Sie schreiben einen Test für eine Suche nach "django.contrib.auth.models.User" in Texto. (Es gibt keinen besonderen Grund, "Benutzer" zu wählen. Es war nur ein Chaos, das Modell zu definieren.) Aufrufen von "setUp ()" jedes Mal Im folgenden Testfall erfolgt die Generierung des Benutzermodells Es wird so oft durchgeführt, wie es Testmethoden gibt. langsam. Vergleich der Ausführungszeit mit setUpTestData ()

Vergleichen wir die Ausführungszeit. Je mehr setUp () von der Anzahl der Testmethoden aufgerufen wird, desto langsamer wird es und desto weniger aussagekräftig ist das Verhältnis der Ergebnisse. Da es 3 Testmethoden gibt, dauert das Generieren von Daten mit setUp () ungefähr dreimal länger.

setUp setUpTestData
Anzahl der Nutzer 100 100
Anzahl der Testmethoden 3 3
verstrichene Zeit 11.7s 3.6s

Wenn Sie es ausprobieren möchten, können Sie es anhand der folgenden Übersicht überprüfen.

https://gist.github.com/podhmo/ffc6f96e4688dfb53810f4e4d6ba4d92

Recommended Posts

Wenn Sie einen Test mit DB mit django schreiben, ist es möglicherweise schneller, `setUpTestData ()` zu verwenden
Dinge zu tun, wenn Sie anfangen, sich mit Django zu entwickeln
Was tun, wenn ein Video von cv2.VideoCapture nicht gelesen werden kann?
Was tun, wenn bei Verwendung von Python mit der NetBeans-IDE die Warnung "Falsche Python-Plattform" angezeigt wird?
Wenn Sie es so verwenden möchten, wie es ist, wenn Sie es mit Lambda-Memo verwenden
Wenn Sie eine Spalte spaltenweise durch einen fehlenden Wert (NaN) ersetzen möchten
Es ist bequemer, csv-table zu verwenden, wenn Sie eine Tabelle mit Python-Sphinx schreiben
Eine Geschichte, die vorbereitet werden musste, wenn versucht wurde, ein Django-Tutorial mit einfachen Centos7 zu erstellen
Ein Anfänger versuchte, eine Strichzeichnung mit einem Kettenmesser zu färben. Ich konnte es schaffen.
Wenn Sie mit dem Django REST-Framework filtern möchten
Passwort für ein PDF mit Passwort vergessen? pdfcrack kann etwas dagegen tun
[Django] Memorandum, wenn Sie asynchron kommunizieren möchten [Python3]
[AWS] Was tun, wenn Sie mit Lambda pfeifen möchten?
So lösen Sie den CSRF-Schutz bei Verwendung von AngularJS mit Django
[Für IT-Anfänger] Was tun, wenn der Befehl rev nicht mit Git Bash verwendet werden kann?
Wenn Sie einen go table-gesteuerten Test in Python schreiben, ist es möglicherweise besser, subTest zu verwenden
Wenn es schwierig ist, das zu kopieren, was Sie mit vue erstellt haben
Was tun, wenn bei der Pip-Installation ein Unicode-Dekodierungsfehler auftritt?
Wenn Sie ein Objekt mit Anforderungen mithilfe der Flasche senden möchten
Wenn Sie eine mehrdimensionale Liste nach mehreren Zeilen sortieren möchten
[Django] Ich wollte testen, wenn ich eine große Datei poste [TDD]
[Tipps] Die Vorgehensweise beim Erstellen von HTML mit Django wird erweitert