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
Ich werde den Code schreiben, der in der automatischen Testfunktion von Django verwendet werden soll.
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.)
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.
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's this?</a></li>\n \n </ul>\n'
>>>
>>> response.context['latest_question_list']
<QuerySet [<Question: What's this?>]>
>>>
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]
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.
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