Ici, nous allons expliquer les tests dans Django.
La cible du test est la simple page de liste d'articles de blog suivante.
project/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls')
]
blog/urls.py
from django.urls import path
from . import views
app_name = 'blog'
urlpatterns = [
path('list/', views.PostList.as_view(), name='post_list')
]
blog/models.py
from django.db import models
class Post(models.model):
title = models.CharField('Titre', max_length=100)
body = models.TextField('Texte')
created_at = models.DateTimeField('Date et heure de création', auto_now_add=True)
updated_at = models.DateTimeField('Mettre à jour la date et l'heure', auto_now=True)
class Meta:
ordering = ('-created_at')
def __str__(self):
return self.title
blog/views.py
from django.views import generic
class PostList(generic.ListView):
model = Post
template_name = 'blog/post_list.html'
blog/post_list.html
{% for post in post_list %}
<h1>{{ post.title }}</h1>
<p>{{ post.body }}</p>
{% endfor %}
Vous pouvez utiliser factory_boy
pour créer un enregistrement de test.
blog/tests.py
import factory
from django.utils import timezone
from .models import Post
class PostFactory(factory.django.DjangoModelFactory):
title = 'Sample post'
body = 'This is a sample text.'
created_at = timezone.now()
updated_at = timezone.now()
class Meta:
model = Post
Ici, nous allons créer PostFactory
comme classe d'usine pour le modèle Post
.
Vous pouvez définir des valeurs par défaut telles que «titre» et «texte».
blog/tests.py
from django.urls import reverse
from django.test import TestCase
class PostListTests(TestCase):
def test_get_queryset(self):
post_1 = PostFactory(
title='First Post',
body='This is the first post.'
)
post_2 = PostFactory(
title='Second Post',
body='This is the second post.'
)
res = self.client.get(reverse('blog:post_list'))
self.assertTemplateUsed(res, 'blog/post_list.html')
self.assertQuerysetEqual(
res.context['post_list'],
['<Post: Second Post>', '<Post: First Post>']
)
self.assertEqual(
res.context['post_list'][0].body,
'This is the first post.'
)
self.assertEqual(
res.context['post_list'][1].body,
'This is the second post.'
)
Tout d'abord, créez un enregistrement Post
en utilisant la PostFactory
créée ci-dessus.
Ensuite, la réponse lors de l'accès à la page de liste d'articles est stockée dans la variable res
.
res
contient post_list
comme contexte créé par view, donc assurez-vous d'obtenir le jeu de requêtes que vous attendiez.
Vous pouvez également utiliser ʻassertTemplateUsed dans les tests django pour voir si le modèle HTML spécifié dans
views.py` est utilisé.
Pour exécuter le test, entrez la commande suivante:
$ python manage.py test (blog)
Si vous entrez le nom de l'application à la fin, le test sera exécuté uniquement dans l'application spécifiée.
Ici, j'ai expliqué le test dans django. Les tests sont également importants pour éviter les bogues à mesure que le développement progresse.
Recommended Posts