[PYTHON] Bericht über das Debuggen und Testen

Versuchen wir, Debugging und Testen mit Python mit der Blog-App durchzuführen, die in der TODO-Aufgabe von Teil 3 erstellt wurde.

Die URL des App-Codes lautet https://github.com/maeclamar/todo-part3 ist.

Debuggen mit Pdb

Lassen Sie uns mit Pdb debuggen. Informationen zur Verwendung von Pdb finden Sie in diesem Artikel. Öffnen Sie views.py und fügen Sie die Pdb-Importanweisung zu Ihrem Code hinzu.

blogs/views.py


def detail(request, blog_id):
    import pdb; pdb.set_trace() #hinzufügen
    blog = Blog.objects.get(id=blog_id)
    comments = Comment.objects.filter(post=blog)

    if request.method == "POST":
        form = forms.CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.post = blog
            comment.author = request.user
            comment.save()
#            form = forms.CommentForm() #Einmal auskommentieren

Füllen Sie in diesem Zustand das Kommentarformular in einem der Artikel aus und senden Sie es ab. Der Kommentar wird dann im Kommentarfeld angezeigt, das Formular behält jedoch das bei, was Sie zuvor eingegeben haben. Debuggen, um die Ursache dieses Problems zu ermitteln.

Starten Sie den Server.

terminal


$ python manage.py runserver

Füllen Sie nach dem Start das Kommentarformular in einem der Blog-Beiträge aus und senden Sie es ab. Dann

terminal


> /Users/Kazuki/todo/django_blog/blogs/views.py(16)detail()
-> blog = Blog.objects.get(id=blog_id)

Wird angezeigt. Wenn Sie hier `` `l``` eingeben,

terminal


> /Users/Kazuki/todo/django_blog/blogs/views.py(16)detail()
-> blog = Blog.objects.get(id=blog_id)
(Pdb) l
 14     def detail(request, blog_id):
 15         import pdb; pdb.set_trace()
 16  ->     blog = Blog.objects.get(id=blog_id)
 17         comments = Comment.objects.filter(post=blog)
 18
 19         if request.method == "POST":
 20             form = forms.CommentForm(request.POST)
 21             if form.is_valid():

Ein Teil des Codes wird mit einem Pfeil in der auszuführenden Zeile angezeigt. Dieses Mal möchte ich sehen, wie das Formular zum Zeitpunkt der Rückkehr in Zeile 29 aussieht, also werde ich in Zeile 29 einen Haltepunkt setzen.

terminal


> /Users/Kazuki/todo/django_blog/blogs/views.py(16)detail()
-> blog = Blog.objects.get(id=blog_id)
(Pdb) b 29
Breakpoint 1 at /Users/kazuki/todo/django_blog/blogs/views.py:29

Fahren Sie sofort mit der 29. Zeile fort.

terminal


(Pdb) c
> /Users/Kazuki/todo/django_blog/blogs/views.py(29)
-> return render(request, 'blogs/detail.html', {'blog': blog, 'form':form, 'comments':comments})

Lassen Sie uns nun den Status des Formulars überprüfen.

terminal


(Pdb) p form
<CommentForm bound=True, valid=Unknown, fields=(text)>

Das `gebunden``` des Formulars ist jetzt` True```. Dies bedeutet, dass das Formular Daten enthält, die übermittelt werden können. Um dies in den Zustand "Falsch" zu versetzen, in der Datei "views.py"

blogs/views.py


#            form = forms.CommentForm() #Einmal auskommentieren

Wenn ich einen Satz auskommentiere und das Formular erneut abschicke, behält das Formular nicht das bei, was ich zuvor eingegeben habe. In der Tat, wenn ich versuche zu debuggen

terminal


(Pdb) p form
<CommentForm bound=False, valid=Unknown, fields=(text)>

Wird angezeigt und `bound ist `` `False```.

Prüfung

Als nächstes werde ich einen Test für die App schreiben.

blogs/test.py


from django.urls import resolve
from django.test import TestCase
from blogs.views import index, detail, signup

from django.http import HttpRequest
from django.template.loader import render_to_string

#Stellen Sie sicher, dass die entsprechende Ansicht unter jeder URL gestartet wird
class UrlResolveTest(TestCase):
    def test_url_resolves_to_index_view(self):
        found = resolve('/')
        self.assertEqual(found.func, index)

    def test_url_resolves_to_detail_view(self):
        found = resolve('/detail/3/')
        self.assertEqual(found.func, detail)

    def test_url_resolves_to_signup_view(self):
        found = resolve('/signup/')

#Stellen Sie sicher, dass korrektes HTML zurückgegeben wird
class HtmlTest(TestCase):
    def test_index_page_returns_correct_html(self):
        request = HttpRequest()
        response = index(request)
        expected_html = render_to_string('blogs/index.html', {'blogs': []})
        self.assertEqual(response.content.decode(), expected_html)

Ich werde es testen.

terminal


$ python manage.py test
Creating test database for alias 'default'...
...
----------------------------------------------------------------------
Ran 4 tests in 0.060s

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

Ich habe den Test bestanden.

Recommended Posts

Bericht über das Debuggen und Testen
Fehlerklassifizierung (python3.x) und Debugging-Hinweise
Tipps zum Ersetzen und Debuggen von Funktionen
6 Python-Bibliotheken für schnellere Entwicklung und Debugging
Laden und Testen des von Chainer trainierten Imagenet-Modells