[Anfänger] [Python / Django] Ein junger Webingenieur hat ein Django-Tutorial ausprobiert - Teil 5-

Einführung

Schön euch kennenzulernen, alle zusammen. Ich werde den Prozess der Erstellung eines Abstimmungsantrags mit Django als Memorandum veröffentlichen. Da ich ein Anfänger von Qiita bin, verstehen Sie bitte, dass es schwierig sein kann zu lesen.

Serie

Fang an zu arbeiten

Einführung automatisierter Tests

Ich werde den Code schreiben, der in der automatischen Testfunktion von Django verwendet werden soll.

Erstellen Sie Ihren ersten Test

Welche Art von Code benötigen Sie, um Django zu testen? Führen Sie den Test zunächst interaktiv aus.

Testinhalt: Stellen Sie sicher, dass die Funktion was_published_recently auf False gesetzt ist, wenn die Frage pub_date im zukünftigen Datum liegt (30 Tage ab heute). Testergebnis: FAILD (Das erwartete Verhalten von was_published_recently ist False, aber das tatsächliche Verhalten ist True)


(poll-HcNSSqhc) C:\django\poll>python manage.py shell
Python 3.8.6 (tags/v3.8.6:db45529, Sep 23 2020, 15:37:30) [MSC v.1927 32 bit (Intel)] on win32     
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
>>> import datetime
>>> from django.utils import timezone
>>> from polls.models import Question
>>>
>>> future_question = Question(pub_date=timezone.now()+datetime.timedelta(days=30))
>>> future_question.was_published_recently()
True
>>>

Codieren Sie dies. Das erwartete Verhalten in self.assertIs ist False.

polls/tests.py



from django.test import TestCase

import datetime
from django.utils import timezone
from .models import Question

# Create your tests here.


class QuestionModelTests(TestCase):
    def test_was_published_recently_whit_future_question(self):
        future_question = Question(pub_date=timezone.now() + datetime.timedelta(days=30))
        self.assertIs(future_question.was_published_recently(), False)

Lassen Sie uns nun den Test ausführen. Natürlich ist es nicht interaktiv.


(poll-HcNSSqhc) C:\django\poll>python manage.py test polls
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
F
======================================================================
FAIL: test_was_published_recently_whit_future_question (polls.tests.QuestionModelTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\django\poll\polls\tests.py", line 13, in test_was_published_recently_whit_future_question
    self.assertIs(future_question.was_published_recently(), False)
AssertionError: True is not False

----------------------------------------------------------------------
Ran 1 test in 0.002s

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

(poll-HcNSSqhc) C:\django\poll>

Es kehrt FAILD fest zurück. (Das erwartete Verhalten von was_published_recently ist False, aber das tatsächliche Verhalten ist True.)

Jetzt debuggen wir.

polls/models.py



    def was_published_recently(self):
        return timezone.now() - datetime.timedelta(days=1) <= self.pub_date <= timezone.now()

(poll-HcNSSqhc) C:\django\poll>python manage.py test polls
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.
----------------------------------------------------------------------
Ran 1 test in 0.002s

OK
Destroying test database for alias 'default'...

(poll-HcNSSqhc) C:\django\poll>

Es war ok. (Das erwartete Verhalten von was_published_recently ist False und das tatsächliche Verhalten ist False.)

Umfassendere Tests

Fügen wir weitere Testelemente für dieselbe Klasse hinzu. Ein Grenzwerttestelement wird hinzugefügt.

polls/tests.py



    def test_was_published_recently_with_old_question(self):
        old_question = Question(pub_date=timezone.now() - datetime.timedelta(days=1, seconds=1))
        self.assertIs(old_question.was_published_recently(), False)

    def test_was_published_recently_with_recently_question(self):
        recently_question = Question(pub_date=timezone.now(
        ) - datetime.timedelta(hours=23, minutes=59, seconds=59))
        self.assertIs(recently_question.was_published_recently(), True)

(poll-HcNSSqhc) C:\django\poll>python manage.py test polls
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
...
----------------------------------------------------------------------
Ran 3 tests in 0.004s

OK
Destroying test database for alias 'default'...

(poll-HcNSSqhc) C:\django\poll>

OK wird angezeigt.

Testen Sie die Ansicht

Verwenden Sie die Client-Klasse, um die Ansicht in Django zu testen. Führen Sie den Test zunächst interaktiv aus.

Testinhalt: Die Ansicht "http://127.0.0.1/polls" ist vorhanden Testergebnis: HTTP200 und Inhalt können erhalten werden


(poll-HcNSSqhc) C:\django\poll>python manage.py shell
Python 3.8.6 (tags/v3.8.6:db45529, Sep 23 2020, 15:37:30) [MSC v.1927 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 
>>> 
>>> from django.test.utils import setup_test_environment
>>> setup_test_environment()  
>>> from django.test import Client
>>> from django.urls import reverse
>>> client = Client()
>>> response = client.get(reverse('polls:index'))      
>>> 
>>> response.status_code
200
>>>
>>> response.content
b'\n    <ul>\n    \n        <li><a href="/polls/5/">What&#x27;s this?</a></li>\n    \n    </ul>\n'
>>>
>>> response.context['latest_question_list'] 
<QuerySet [<Question: What's this?>]>
>>>

Verbessern Sie die Ansicht

Es gibt ein Problem beim Anzeigen von Stimmen, die in der Zukunft datiert sind. Beheben wir das Problem.

Question.objects.filter () bedeutet filtern, und pub_date__lte = timezone.now () ist ein bedingter Ausdruck, dessen pub_date kleiner oder gleich timezone.now () (kleiner als gleich) ist.

polls/views.py



from django.utils import timezone

class IndexView(generic.ListView):
    ***
    def get_queryset(self):
        return Question.objects.filter(pub_date__lte=timezone.now()).order_by('-pub_date')[:5]

Testen Sie eine neue Ansicht

Bereiten Sie den Testcode vor.

polls/tests.py



from django.urls import reverse

def create_question(question_text, days):
    time = timezone.now() + datetime.timedelta(days=days)
    return Question.objects.create(question_text=question_text, pub_date=time)


class QuestionIndexViewTest(TestCase):
    #HTTP200, Bildschirmmeldung: Es sind keine Umfragen verfügbar., Fragenliste: Leer
    def test_no_question(self):
        response = self.client.get(reverse('polls:index'))
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "No polls are available.")
        self.assertQuerysetEqual(response.context['latest_question_list'], [])

    #Fragenliste: Vergangene Frage.
    def test_past_question(self):
        create_question(question_text="Past question.", days=-30)
        response = self.client.get(reverse('polls:index'))
        self.assertQuerysetEqual(response.context['latest_question_list'], [
                                 '<Question: Past question.>'])

    #Fragenliste: leer(Zukünftige Fragen werden nicht angezeigt)
    def test_feature_question(self):
        create_question(question_text="Feature question.", days=30)
        response = self.client.get(reverse('polls:index'))
        self.assertContains(response, "No polls are available.")
        self.assertQuerysetEqual(response.context['latest_question_list'], [])

    #Fragenliste: Vergangene Frage.(Zukünftige Fragen werden nicht angezeigt)
    def test_feature_question_and_past_question(self):
        create_question(question_text="Feature question.", days=30)
        create_question(question_text="Past question.", days=-30)
        response = self.client.get(reverse('polls:index'))
        self.assertQuerysetEqual(response.context['latest_question_list'], [
                                 '<Question: Past question.>'])

    #Fragenliste: Vergangene Frage1.、Past question2.
    #Beachten Sie, dass die Fragenliste in der Reihenfolge der letzten Beiträge abgerufen wird, sodass die Erstellungsreihenfolge und die Abrufreihenfolge schwach sind.
    def test_tow_past_question(self):
        create_question(question_text="Past question1.", days=-30)
        create_question(question_text="Past question2.", days=-10)
        response = self.client.get(reverse('polls:index'))
        self.assertQuerysetEqual(response.context['latest_question_list'], [
                                 '<Question: Past question2.>', '<Question: Past question1.>'])

(poll-HcNSSqhc) C:\django\poll>python manage.py test polls
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
........
----------------------------------------------------------------------
Ran 8 tests in 0.063s

OK
Destroying test database for alias 'default'...

(poll-HcNSSqhc) C:\django\poll>

OK wird angezeigt.

DetailView-Test

In der Detailansicht können auch Fragendetails für zukünftige Daten angezeigt werden. Lassen Sie uns das Problem beheben.

polls/views.py



class DetailView(generic.DetailView):
  ***
    def get_queryset(self):
        return Question.objects.filter(pub_date__lte=timezone.now())

polls/tests.py



class QuestionDetailViewTests(TestCase):
    def test_future_question(self):
        future_question = create_question(question_text="Future question.", days=5)
        url = reverse('polls:detail', args=(future_question.id,))
        response = self.client.get(url)
        self.assertEqual(response.status_code, 404)

    def test_past_question(self):
        past_question = create_question(question_text="Past question.", days=-5)
        url = reverse('polls:detail', args=(past_question.id,))
        response = self.client.get(url)
        self.assertContains(response, past_question.question_text)

(poll-HcNSSqhc) C:\django\poll>python manage.py test polls
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
..........
----------------------------------------------------------------------
Ran 10 tests in 0.088s

OK
Destroying test database for alias 'default'...

(poll-HcNSSqhc) C:\django\poll>

Das ist alles für heute. Vielen Dank.

Recommended Posts

[Anfänger] [Python / Django] Ein junger Webingenieur hat ein Django-Tutorial ausprobiert - Teil 7-
[Anfänger] [Python / Django] Ein junger Webingenieur hat ein Django-Tutorial ausprobiert - Teil 1-
[Anfänger] [Python / Django] Ein junger Webingenieur hat ein Django-Tutorial ausprobiert - Teil 2-
[Anfänger] [Python / Django] Ein junger Webingenieur hat ein Django-Tutorial ausprobiert - Teil 0-
[Anfänger] [Python / Django] Ein junger Webingenieur hat ein Django-Tutorial ausprobiert - Teil 5-
[Anfänger] [Python / Django] Ein junger Webingenieur hat ein Django-Tutorial ausprobiert - Teil 6-
[Anfänger] [Python / Django] Ein junger Webingenieur hat ein Django-Tutorial ausprobiert - Teil 4-
[Anfänger] [Python / Django] Ein junger Webingenieur hat ein Django-Tutorial ausprobiert - Teil 3-
Django Python Web Framework
Stellen Sie Python 3.6 / Django / Postgres-Webanwendungen in Azure bereit
(Python) Versuchen Sie, eine Webanwendung mit Django zu entwickeln
CTF-Anfänger haben versucht, einen Problemserver (Web) zu erstellen [Problem]
Web Scraping Anfänger mit Python
Ein Ingenieur für freie Künste hat versucht, 100 Sprachprozesse in Python 02 zu klopfen
Python-Anfänger versuchte, bei einem IT-Unternehmen zu praktizieren
Ein Ingenieur für freie Künste hat versucht, 100 Sprachprozesse in Python 01 zu klopfen
Ein Ingenieur für freie Künste hat versucht, 100 Sprachprozesse in Python 00 zu klopfen
[Python / Django] Erstellen Sie eine Web-API, die im JSON-Format antwortet
Ich habe versucht, WebScraping mit Python.
Erstellen Sie eine Webanwendung mit Django
Python-Anfänger versucht 100 Sprachverarbeitung klopfen 2015 (05 ~ 09)
Webcodierer versucht Excel in Python
Python-Anfänger haben versucht, Bottle zu verwenden, und es hat unerwartet leicht funktioniert
Python-Anfänger versucht 100 Sprachverarbeitung klopfen 2015 (00 ~ 04)
Eine Einführung in selbst erstellte Python-Webanwendungen für einen trägen Webingenieur im dritten Jahr
Eine Notiz, in der ein Python-Anfänger stecken blieb
[Anfänger] Leicht verständliches Python-Web-Scraping mit Google Colaboratory
Ich habe eine Frage! (Python, Django) Einfach
Dämonisieren Sie eine Python-Webanwendung mit Supervisor
Ich habe eine funktionale Sprache mit Python ausprobiert
[Python] Eine schnelle Webanwendung mit Bottle!
Ich habe eine Web-API erstellt
Verwenden Sie Django aus einem lokalen Python-Skript
Führen Sie eine Python-Webanwendung mit Docker aus
Erstellen Sie ein Webframework mit Python! (1)
Ich habe versucht, das Webanwendungs-Framework zu vergleichen
Erstellen Sie ein Webframework mit Python! (2)
Ich habe eine WEB-Bewerbung bei Django gemacht
Ein Python-Anfänger hat versucht, bei einem IT-Unternehmen zu praktizieren [Tag 2 Chatbot-Umfrage]
Python-Anfänger versuchte, bei einem IT-Unternehmen zu praktizieren [Tag 1 Entwicklungsprozess]
Anfänger haben versucht, eine Cloud-native Webanwendung mit Datastore / GAE zu erstellen
Ich suchte nach den Fähigkeiten, die erforderlich sind, um Webingenieur bei Python zu werden
Maschinelles Lernen eines jungen Ingenieurs Teil 1
Ich habe versucht, Web-Scraping mit Python und Selen
Ich habe versucht, mit Python ein Tippspiel zu spielen
Starten Sie mit Docker einen einfachen Python-Webserver
[Python] Erstellen Sie mit Docker eine Django-Entwicklungsumgebung
[Python] Zeichne eine Mickey Mouse mit Turtle [Anfänger]
Erstellen Sie eine Webmap mit Python und GDAL
Schritte zum Entwickeln einer Webanwendung in Python
[Python] Webentwicklungsvorbereitung (Erstellen einer virtuellen Umgebung)
Ich habe versucht, eine CSV-Datei mit Python zu lesen
Programmieranfänger Python3 Ingenieur Zertifizierung Grundprüfungsprotokoll
Starten Sie einen Webserver mit Python und Flask
Maschinelles Lernen eines jungen Ingenieurs Teil 2