Ich habe Djangos Tutorial viermal erklärt, Letztes Mal hat den vollständigen Antrag ausgefüllt.
Teil 5 erklärt die Einführung des automatisierten Testens.
Ein Test ist ein einfaches Programm, das das Verhalten Ihres Codes überprüft.
Die Tests werden auf einer anderen Ebene ausgeführt als der Code in anderen Apps. Einige Tests können mit kleinen Funktionen durchgeführt werden (gibt eine Methode in einem bestimmten Modell den erwarteten Wert zurück?), Und ein weiterer Test wird mit dem Verhalten der gesamten Software durchgeführt. (Erzeugt die Reihenfolge der Eingaben des Benutzers auf der Site die erwarteten Ergebnisse?)
Das Besondere an automatisierten Tests ist, dass die Testarbeiten vom System ausgeführt werden. Sobald Sie einen Testsatz erstellt haben, können Sie jedes Mal, wenn Sie Änderungen an Ihrer App vornehmen, feststellen, ob Ihr Code wie beabsichtigt funktioniert. Das manuelle Testen dauert nicht lange.
Wenn Sie den Testcode haben, können Sie sicher sein, dass es für die Benutzer in Ordnung ist, ihn auf GitHub zu sehen. (Wenn nicht, ist dieses Projekt in Ordnung.)
Wenn Sie den Code für diesen Test ausführen und Suceess zurückgeben, ist er fehlerfrei und startbereit, unabhängig davon, welche Korrekturen Sie vorgenommen haben.
Das Schreiben von Testcode ist mehr als nur Testen Es beruhigt den Leser des Codes und garantiert, dass eine Reihe von Tests garantiert werden kann, wenn sie von mehreren Personen entwickelt werden.
Schreiben Sie nach dem "testgetriebenen" Prinzip! Ganz zu schweigen davon, dass Sie sich unbedingt auf den Test vorbereiten müssen.
Django empfiehlt außerdem, Testcode zu schreiben. Es gibt Module, die das Erstellen von Tests vereinfachen.
Ich möchte den Testcode tatsächlich mit einem Beispiel ausführen.
Tatsächlich haben die Abstimmungs-Apps, die ich bisher erstellt habe, einen kleinen Fehler.
polls/models.py
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
from django.utils import timezone
import datetime
# Create your models here.
@python_2_unicode_compatible
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
#Diese Methode
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
@python_2_unicode_compatible
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
Die obige `` `was_published_recently``` Methode ist eine Methode, die True zurückgibt, wenn die Frage nach gestern erstellt wurde.
Das ist in Ordnung, aber diese Methode gibt auch in zukünftigen Daten True zurück. (Es gibt keine solche Abstimmung.)
Lassen Sie uns den Vorgang mit dem von Django bereitgestellten Shell-Befehl überprüfen.
Führen Sie den folgenden Befehl im Terminal aus.
>>> import datetime
>>> from django.utils import timezone
>>> from polls.models import Question
>>> # create a Question instance with pub_date 30 days in the future
>>> future_question = Question(pub_date=timezone.now() + datetime.timedelta(days=30))
>>> # was it published recently?
>>> future_question.was_published_recently()
True
Wie erwartet ist True zurückgekehrt. Dieses Ergebnis ist falsch, da das zukünftige Datum nicht aktuell ist.
Es wäre praktisch, wenn Sie das, was Sie oben im Projekt getan haben, als Testcode belassen und jederzeit testen könnten. (Sie wissen auch, was die Methode tun möchte.)
Erstellen Sie tatsächlich den Testcode.
Zunächst die Verzeichnisstruktur, in der der Testcode platziert wird, Erstellen Sie es mit dem Namen tests.py im Umfrageverzeichnis.
polls/tests.py
from django.test import TestCase
import datetime
from django.utils import timezone
from .models import Question
# Create your tests here.
class QuestionMethodTest(TestCase):
def test_was_published_recently_with_future_question(self):
time = timezone.now() + datetime.timedelta(days=30)
future_question = Question(pub_date=time)
self.assertIs(future_question.was_published_recently(), False)
Zuerst erstellen wir eine Unterklasse, die von django.test.TestCase erbt, und erstellen eine Instanz von Question mit einem pub_date eines zukünftigen Datums. Dann überprüfe ich die Ausgabe von was_published_recently (). Dies sollte falsch sein.
Es ist ein sehr intuitiver Code und es scheint Python / Django zu sein.
Führen Sie den folgenden Befehl im Terminal aus, um den automatisierten Test zu starten.
$ python manage.py test polls
Dann wird das folgende Ausführungsergebnis erhalten.
Creating test database for alias 'default'...
F
======================================================================
FAIL: test_was_published_recently_with_future_question (polls.tests.QuestionMethodTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/path/to/mysite/polls/tests.py", line 16, in test_was_published_recently_with_future_question
self.assertIs(future_question.was_published_recently(), False)
AssertionError: True is not False
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (failures=1)
Destroying test database for alias 'default'...
Oben werden die folgenden Dinge getan.
--python manage.py test polls sucht nach Tests in Polling-Anwendungen --Entdecken Sie eine Unterklasse der Klasse django.test.TestCase --Erstellen Sie eine spezielle Datenbank zum Testen
Lassen Sie uns Question.was_published_recently tatsächlich beheben.
polls/models.py
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
from django.utils import timezone
import datetime
# Create your models here.
@python_2_unicode_compatible
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
#Geänderte Methode
def was_published_recently(self):
now = timezone.now()
return now - datetime.timedelta(days=1) <= self.pub_date <= now
@python_2_unicode_compatible
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
Führen Sie nach der Korrektur den Testbefehl erneut aus.
Creating test database for alias 'default'....
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
Destroying test database for alias 'default'...
Wie oben erwähnt, wurde der Test erfolgreich abgeschlossen und OK angezeigt.
Dieser automatisierte Test konzentrierte sich auf das Testen des Modells, aber es gibt natürlich auch Ansichten und andere Tests.
Ich habe den gesamten Test kurz vorgestellt und erst den Beginn des Schreibens des Testcodes.
Ich hoffe, ich kann Ihnen zeigen, wie Sie zu einem anderen Zeitpunkt anderen Testcode schreiben können.
Das nächste Mal werde ich im letzten Kapitel erklären, wie Django mit statischen Dateien umgeht.
Recommended Posts