Python Django 入門トップページ


Django REST Framework による API 開発

  1. API とプロジェクトの概要
  2. Django REST Frameworkのインストール
  3. プロジェクトの作成
  4. 基本設定
  5. アプリケーションの作成と登録
  6. モデルの作成とマイグレーション
  7. テストデータの設定
  8. コメント一覧を出力する API
  9. コメント詳細情報を出力する API
  10. 新規投稿と更新・削除の API
  11. ページネーション
  12. 入力内容の検証(バリデーション)
  13. テストの自動化
  14. Shell でのユーザ登録
  15. Fixtures でのユーザ登録
  16. ユーザ認証を必須にする
  17. コメントにオーナ情報を追加
  18. 権限の設定:Case #1
  19. 権限の設定:Case #2
  20. Python から API への接続
  21. React アプリケーションからの API 接続と CORS エラーの回避

Django REST Framework による API 開発

テストの自動化

続いてテストを自動的に実施できるようにテストコードを作成します.まず,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 のページを開きます.

django-api-2023-15

serializers.py のカバレッジレポートです.一覧表示や詳細表示のテストは実行しましたが,投稿や更新のテストを行っていない関係で,validation_titlevalidataion_body の関数がテストされていないことがわかります.このページを確認しながら,全ての行がテストされるようにテストケースを追加して,カバレッジ 100% を目指すと良いでしょう.

django-api-2023-16

目次に戻る