[PYTHON] Rapport sur le débogage et les tests

Essayons de déboguer et de tester à l'aide de Python avec l'application de blog créée dans la tâche TODO de Part3.

L'URL du code de l'application est https://github.com/maeclamar/todo-part3 est.

Débogage avec Pdb

Déboguons en utilisant Pdb. Pour savoir comment utiliser Pdb, j'ai fait référence à cet article. Ouvrez views.py et ajoutez l'instruction d'importation Pdb à votre code.

blogs/views.py


def detail(request, blog_id):
    import pdb; pdb.set_trace() #ajouter à
    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() #Commentez une fois

Dans cet état, remplissez le formulaire de commentaire dans l'un des articles et envoyez-le. Le commentaire sera alors reflété dans le champ de commentaire, mais le formulaire conservera ce que vous avez précédemment entré. Déboguez pour détecter la cause de ce problème.

Démarrez le serveur.

terminal


$ python manage.py runserver

Une fois lancé, remplissez le formulaire de commentaire dans l'un des articles du blog et soumettez-le. Puis

terminal


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

Est affiché. Si vous entrez `` l '' ici,

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():

Et une partie du code est affichée, avec une flèche sur la ligne à exécuter. Cette fois, je veux voir à quoi ressemble le formulaire au moment du `` retour '' sur la ligne 29, donc je vais définir un point d'arrêt sur la ligne 29.

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

Passez à la 29e ligne à la fois.

terminal


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

Vérifions maintenant l'état du formulaire.

terminal


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

Le lié '' du formulaire est maintenant Vrai ''. Cela signifie que le formulaire contient des données qui peuvent être soumises. Pour mettre cela dans l'état `` False '', dans le fichier views.py,

blogs/views.py


#            form = forms.CommentForm() #Commentez une fois

Lorsque je décommente une phrase et que je soumets à nouveau le formulaire, le formulaire ne conserve pas ce que j'ai entré précédemment. En fait, quand j'essaye de déboguer

terminal


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

Est affiché et bound '' '' est `` False```.

tester

Ensuite, j'écrirai un test pour l'application.

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

#Vérifiez que la vue correspondante est lancée à chaque URL
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/')

#Vérifiez que le code HTML correct est renvoyé
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)

Je vais le tester.

terminal


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

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

J'ai réussi l'examen.

Recommended Posts

Rapport sur le débogage et les tests
Classification des erreurs (python3.x) et notes de débogage
Conseils pour remplacer et déboguer les fonctions
6 bibliothèques Python pour un développement et un débogage plus rapides
Chargement et test du modèle imagenet entraîné de Chainer