Testen in Django (Teil 2) - Model Mommy vs Django Testgeräte

Testen in Django (Teil 2) - Model Mommy vs Django Testgeräte

In den letztenpost habe ich Ihnen das Testen in Django vorgestellt und wir haben uns Best Practices sowie einige Beispiele angesehen. Dieses Mal zeige ich Ihnen ein etwas komplizierteres Beispiel und stelle IhnenModel Mommy zum Erstellen von Beispieldaten vor.

Warum sollten Sie sich interessieren?

Im letzten Beitrag habe ich gesagt, dass „https://github.com/rbarrois/factory_boy[factory_boy],model_mommy undmock anstelle von Fixtures oder dem ORM zum Auffüllen verwendet werden benötigte Daten zum Testen. Beide Geräte und das ORM können langsam sein und müssen aktualisiert werden, wenn sich Ihr Modell ändert. “

Zusammenfassend sind die Django-Testvorrichtungen problematisch, weil sie:

  • muss jedes Mal aktualisiert werden, wenn sich Ihr Modell / Schema ändert.

  • sind wirklich sehr, sehr langsam; und

  • Manchmal können fest codierte Daten dazu führen, dass Ihre Tests in Zukunft fehlschlagen.

Mit Model Mommy können Sie also Geräte erstellen, die schneller geladen werden und im Laufe der Zeit viel einfacher zu warten sind.

Django-Testvorrichtungen

Schauen wir uns zunächst unser Beispiel zum Testen des Modells im letzten Beitrag an:

class WhateverTest(TestCase):

    def create_whatever(self, title="only a test", body="yes, this is only a test"):
        return Whatever.objects.create(
            title=title, body=body, created_at=timezone.now())

    def test_whatever_creation(self):
        w = self.create_whatever()
        self.assertTrue(isinstance(w, Whatever))
        self.assertEqual(w.__unicode__(), w.title)

Hier haben wir einfach einWhatever()-Objekt erstellt und festgestellt, dass der erstellte Titel mit dem erwarteten Titel übereinstimmt.

Wenn Sie das Projekt vonrepo heruntergeladen haben, starten Sie den Server und führen Sie die Tests aus:

$ coverage run manage.py test whatever -v 2

Sie werden sehen, dass die oben genannten Tests bestanden wurden:

test_whatever_creation (whatever.tests.WhateverTest) ... ok

Anstatt jetzt jedes Mal eine neue Instanz mit jedem Attribut erstellen zu müssen (langweilig!), Können wir Model Mommy verwenden, um den Prozess zu optimieren.

Model Mama

Installieren:

$ pip install model_mommy

Erinnerst du dich, wie unser Modell aussieht?

class Whatever(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return self.title

Jetzt können wir den obigen Test viel einfacher umschreiben:

from model_mommy import mommy

class WhateverTestMommy(TestCase):

    def test_whatever_creation_mommy(self):
        what = mommy.make(Whatever)
        self.assertTrue(isinstance(what, Whatever))
        self.assertEqual(what.__unicode__(), what.title)

Starte es. Ist es vorbei?

Wie einfach war das Keine Notwendigkeit, Argumente weiterzugeben.

Neues Modell

Schauen wir uns ein etwas komplizierteres Beispiel an.

Konfiguration

Erstellen Sie eine neue App:

$ python manage.py startapp whatevs

Fügen Sie die App zuInstalled_Apps in der Dateisettings.py hinzu

Erstellen Sie das Modell:

from django.db import models
from django.contrib.auth.models import User
from django.contrib import admin

class Forum(models.Model):
    title = models.CharField(max_length=100)

    def __unicode__(self):
        return self.title

class Post(models.Model):
    title = models.CharField(max_length=100)
    created = models.DateTimeField(auto_now_add=True)
    creator = models.ForeignKey(User, blank=True, null=True)
    forum = models.ForeignKey(Forum)
    body = models.TextField(max_length=10000)

    def __unicode__(self):
        return unicode(self.creator) + " - " + self.title

Synchronisieren Sie die DB.

Wie sieht unser Bericht aus?

Model Mommy test coverage

Test

Fügen Sie die Tests hinzu:

from model_mommy import mommy
from django.test import TestCase
from whatevs.models import Forum, Thread

class WhateverTestMommy(TestCase):

    def test_forum_creation_mommy(self):
        new_forum = mommy.make('whatevs.Forum')
        new_thread = mommy.make('whatevs.Thread')
        self.assertTrue(isinstance(new_forum, Forum))
        self.assertTrue(isinstance(new_thread, Thread))
        self.assertEqual(new_forum.__unicode__(), new_forum.title)
        self.assertEqual(
            new_thread.__unicode__(),
            (str(new_thread.forum) + " - " + str(new_thread.title)))

Führen Sie Ihre Tests erneut aus (die bestehen sollten), und erstellen Sie dann den Abdeckungsbericht:

$ coverage run manage.py test whatevs -v 2
$ coverage html

Gut?

Versuchen Sie, die oben genannten Tests mitJSON Fixtures durchzuführen, um zu sehen, wie die Tests mit den Django Testing Fixtures eingerichtet werden.

Ich bin mir nicht sicher, was wir für das nächste Tutorial auf Lager haben. Lassen Sie mich wissen, was Sie sehen möchten. Nimm den Codehere. Stellen Sie sicher, dass Sie unten einen Kommentar abgeben, wenn Sie Fragen haben. Prost!