Djangoのテスト
はじめに
ここでは、Djangoにおけるテストについて解説していきます。
テスト対象
テスト対象は、以下のシンプルなブログ記事一覧ページとします。
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls')
]
from django.urls import path
from . import views
app_name = 'blog'
urlpatterns = [
path('list/', views.PostList.as_view(), name='post_list')
]
from django.db import models
class Post(models.model):
title = models.CharField('タイトル', max_length=100)
body = models.TextField('本文')
created_at = models.DateTimeField('作成日時', auto_now_add=True)
updated_at = models.DateTimeField('更新日時', auto_now=True)
class Meta:
ordering = ('-created_at')
def __str__(self):
return self.title
from django.views import generic
class PostList(generic.ListView):
model = Post
template_name = 'blog/post_list.html'
{% for post in post_list %}
<h1>{{ post.title }}</h1>
<p>{{ post.body }}</p>
{% endfor %}
ファクトリークラスの作成
factory_boy
を使うと、テスト用のレコードを作成することができます。
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
ここでは、Post
モデル用のファクトリークラスとして、PostFactory
を作成します。
title
やtext
などのデフォルト値を設定できます。
テストの作成
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.'
)
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.'
)
まず、上で作成したPostFactory
を用いて、Post
のレコードを作成します。
そして、記事一覧ページにアクセスした時のレスポンスを変数res
に格納します。
res
には、viewで作成されるcontextとしてpost_list
が含まれますので、期待通りのquerysetが得られているかを確認します。
また、djangoのテストでは、views.py
で指定したHTMLテンプレートが使用されているかを確認するために、assertTemplateUsed
が使えます。
テストの実行
テストを実行するには、以下のコマンドを入力します。
$ python manage.py test (blog)
最後にアプリケーション名を入れると、指定したアプリケーションでのみテストが実行されます。
まとめ
ここでは、djangoにおけるテストについて解説しました。
開発が進む中でバグを防止するためにもテストは重要です。
Author And Source
この問題について(Djangoのテスト), 我々は、より多くの情報をここで見つけました https://qiita.com/yukiya285/items/3b3265d745aef36f26ff著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .