続いてテストを自動的に実施できるようにテストコードを作成します.まず,urls.py を編集して,アプリケーション名を登録するとともに URL の各項目に name
を追加して,テストから呼び出しやすいようにします.
comments\urls.py
from django.urls import path
from comments import views
app_name = 'comments'
urlpatterns = [
path('comments/', views.CommentList.as_view(), name='index'),
path('comments/<int:pk>/', views.CommentDetail.as_view(), name="show"),
]
続いて,テストケースを設定します.一つ目のテストケースはトップページ (/) にアクセスして,200番(成功)のステータスコードを受け取ることができるかどうかを確認するテストです.2つ目のテストでは,コメントを1件追加して,その詳細ページに投稿したタイトルが出力されているかどうかをテストしています.なお,Django のテストではテスト用に新たなデータベースが作成され(テスト終了とともに削除され)るので,テストケースの中でテストデータも投入する必要があります.
comments\tests.py
from django.test import TestCase
from django.urls import reverse
from django.utils import timezone
from .models import Comment
# Create your tests here.
class CommentIndexTests(TestCase):
def test_comment_index(self):
"""
Comment index のテスト
"""
response = self.client.get(reverse('comments:index'))
self.assertEqual(response.status_code, 200)
def test_comment_show(self):
"""
Comment の詳細ページ
"""
comment = Comment.objects.create(
title="test title",
body="test body",
created_at=timezone.now(),
updated_at=timezone.now())
url = reverse('comments:show', args=(comment.id,))
response = self.client.get(url)
self.assertContains(response, "test title")
次のコマンドで自動テストを実行します.この結果2つのテストをパスしたことがわかります.
...\django_comment_api>python manage.py test comments ⏎ Found 2 test(s). Creating test database for alias 'default'... System check identified no issues (0 silenced). .. ---------------------------------------------------------------------- Ran 2 tests in 0.014s OK Destroying test database for alias 'default'... ...\django_comment_api>
無事にテストをパスしましたが,ソースコードのどの部分がテストされて,テストされていない箇所がどこなのかを把握することも重要です.このためにテストカバレッジ(網羅度)を計測します.そのためにまず coverage をインストールします.
...\django_comment_api>pip install coverage ⏎
Collecting coverage
Downloading coverage-7.3.2-cp310-cp310-win_amd64.whl (203 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 203.2/203.2 kB 1.4 MB/s eta 0:00:00
Installing collected packages: coverage
Successfully installed coverage-7.3.2
...\django_comment_api>
テストの実行中にカバレッジを計測するには次のコマンドを用いてテストします.その後 coverage report
コマンドでカバレッジレポートが出力されます.例えば,serializers.py のカバレッジは 57% であることがわかります.
...\django_comment_api>coverage run --source="." manage.py test comments ⏎ Found 2 test(s). Creating test database for alias 'default'... System check identified no issues (0 silenced). .. ---------------------------------------------------------------------- Ran 2 tests in 0.054s OK Destroying test database for alias 'default'... ...\django_comment_api>coverage report ⏎ Name Stmts Miss Cover --------------------------------------------------------- comments\__init__.py 0 0 100% comments\admin.py 1 0 100% comments\apps.py 4 0 100% comments\migrations\0001_initial.py 5 0 100% comments\migrations\__init__.py 0 0 100% comments\models.py 8 0 100% comments\paginations.py 5 0 100% comments\serializers.py 14 6 57% comments\tests.py 13 0 100% comments\urls.py 4 0 100% comments\views.py 12 0 100% django_comment_api\__init__.py 0 0 100% django_comment_api\asgi.py 4 4 0% django_comment_api\settings.py 18 0 100% django_comment_api\urls.py 3 0 100% django_comment_api\wsgi.py 4 4 0% manage.py 12 2 83% --------------------------------------------------------- TOTAL 107 16 85% ...\django_comment_api>
カバレッジの詳細を確認したい場合は,coverage html
コマンドで HTML 形式のファイルを出力できます.このコマンドによって htmlcov というフォルダが作成され,レポートが生成されています.この中の index.html を Web ブラウザで閲覧します.なお,この htmlcov フォルダなどは Git のコミットに含めないように .gitignore で指定されていることに注意してください.
...\django_comment_api>coverage html ⏎ Wrote HTML report to htmlcov\index.html ...\django_comment_api>
Web ブラウザでレポートを開きます.ファイル名がリンクになっているので serializers.py のページを開きます.
serializers.py のカバレッジレポートです.一覧表示や詳細表示のテストは実行しましたが,投稿や更新のテストを行っていない関係で,validation_title
や validataion_body
の関数がテストされていないことがわかります.このページを確認しながら,全ての行がテストされるようにテストケースを追加して,カバレッジ 100% を目指すと良いでしょう.