[PYTHON] Fangen Sie mit Django an! ~ Tutorial ⑤ ~

Überblick

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.

Was ist ein automatisierter Test?

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.

Projekt ohne Testcode

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.

Erstellen Sie Ihren ersten Test

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 Test aus

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

Fehler beheben

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.

Zusammenfassung

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.

GitHub

Serie

Recommended Posts

Fangen Sie mit Django an! ~ Tutorial ⑤ ~
Fangen Sie mit Django an! ~ Tutorial ④ ~
Fangen Sie mit Django an! ~ Tutorial ⑥ ~
Wie fange ich mit Django an?
Django 1.11 wurde mit Python3.6 gestartet
Schritt Notizen, um mit Django zu beginnen
Erste Schritte mit Django 1
Beginnen Sie mit MicroPython
Beginnen Sie mit Mezzanine
Erste Schritte mit Django 2
Der einfachste Weg, um mit Django zu beginnen
Beginnen Sie mit influxDB + Grafana
Erste Schritte mit Python Django (1)
Erste Schritte mit Python Django (4)
Erste Schritte mit Python Django (3)
Einführung in Python Django (6)
Beginnen Sie mit Python! ~ ② Grammatik ~
Erste Schritte mit Django mit PyCharm
Erste Schritte mit Python Django (5)
Beginnen Sie mit Python! ~ ① Umweltbau ~
Link, um mit Python zu beginnen
Erste Schritte mit MicroPython (unter macOS)
Wie fange ich mit Scrapy an?
Erste Schritte mit Python
Beginnen Sie mit dem maschinellen Lernen mit SageMaker
Beginnen Sie mit Python mit Blender
Erste Schritte mit dem Python-Framework Django unter Mac OS X.
Python Django Tutorial (5)
Python Django Tutorial (2)
Ich habe versucht, mit Hy anzufangen
CRUD GET mit Nuxt & Django REST Framework ②
Internationalisierung mit Django
Django Tutorial Memo
Ich habe versucht, das Entwicklungsstartverfahren von Django kurz zusammenzufassen
Python Django Tutorial (8)
CRUD GET mit Nuxt & Django REST Framework ①
Python Django Tutorial (6)
Starten Sie das Django Tutorial 1
Erste Schritte mit dem Dokumentationstool Sphinx
Beginnen wir mit TopCoder in Python (Version 2020)
CRUD mit Django
Python Django Tutorial (7)
Python Django Tutorial (1)
Python Django Tutorial Tutorial
Wie Python-Anfänger mit Progete beginnen
Python Django Tutorial (3)
[Blender x Python] Beginnen wir mit Blender Python !!
Python Django Tutorial (4)
Python-Handspiel (Beginnen wir mit AtCoder?)
Django Erste Schritte Teil 2 mit dem Eclipse Plugin (PyDev)
Zubu Amateur will Python starten
[Cloud102] # 1 Erste Schritte mit Python (Teil 1 Python Erste Schritte)
Authentifizieren Sie Google mit Django
Laden Sie Dateien mit Django hoch
Entwicklungsverdauung mit Django
Zusammenfassung des Python Django-Tutorials
PDF mit Django ausgeben
Erste Schritte mit Android!
Markdown-Ausgabe mit Django